[Freeswitch-trunk] [freeswitch-contrib] FreeSWITCH user-contributed scripts, etc branch master updated. java-esl-client-0.9.2-394-g9aa2f07

git at svn.freeswitch.org git at svn.freeswitch.org
Thu Feb 3 02:40:08 MSK 2011


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "FreeSWITCH user-contributed scripts, etc".

The branch, master has been updated
       via  9aa2f07c369938230c5c4b8b61b67b1c53749efe (commit)
       via  b6c998685330b7c689cd08726438271ac68f0361 (commit)
       via  75bbd885eb1eef0bcfea9b5371557823ca584522 (commit)
       via  274a7dd627ab98012ebf26c68c0ed5f440fa9033 (commit)
       via  2bd0da508187e942e4c906275e286cefedb3a62e (commit)
       via  48590eca54e7c93ef987768a24a844dfd72986d1 (commit)
       via  594536af195a45e9515ff1c40979a3f036934e49 (commit)
       via  4a414482ddc08fe77a42daab560a1bd860235154 (commit)
       via  3f2c531df509383cd93d9ae4379bfb656a969c7e (commit)
       via  fc1ff4f95853eb0a66db9b3658f596c19f8e66c4 (commit)
       via  4277bdbadddb4bd6bd034812a4f59db60bd6e2aa (commit)
       via  5247b0c1000e9aa6e642cdd238396d679d7c6bb3 (commit)
       via  09778f943674b470c51a636aa8e3e3b22589708e (commit)
       via  007d9a09df8e52d540e46eb009b44f69121fc275 (commit)
       via  f3c9f291d9c4854ff8c17e81552d9ed2a4c3b1e5 (commit)
      from  cfaca250a7c49387abd98ef3fbd7124efb02d422 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 9aa2f07c369938230c5c4b8b61b67b1c53749efe
Merge: cfaca25 b6c9986
Author: Raymond Chandler <intralanman at freeswitch.org>
Date:   Wed Feb 2 18:40:03 2011 -0500

    Merge branch 'master' of git.freeswitch.org:freeswitch-contrib


commit b6c998685330b7c689cd08726438271ac68f0361
Author: Jeff Lenk <jeff at jefflenk.com>
Date:   Wed Feb 2 14:26:55 2011 -0600

    add quotes on path

diff --git a/mitchcapper/FSClient/FSClient.csproj b/mitchcapper/FSClient/FSClient.csproj
index b12ef37..3e6aaa1 100644
--- a/mitchcapper/FSClient/FSClient.csproj
+++ b/mitchcapper/FSClient/FSClient.csproj
@@ -252,7 +252,7 @@ if not exist ".\conf" md conf
 copy ..\..\"external items"\conf\freeswitch.xml .\conf</PostBuildEvent>
   </PropertyGroup>
   <PropertyGroup>
-    <PreBuildEvent>if exist "%25FREESWITCH_SRC_LOCATION%25" copy  %25FREESWITCH_SRC_LOCATION%25\Win32\$(ConfigurationName)\mod\FreeSWITCH.Managed.dll ..\..\"external items"</PreBuildEvent>
+    <PreBuildEvent>if exist "%25FREESWITCH_SRC_LOCATION%25" copy  "%25FREESWITCH_SRC_LOCATION%25"\Win32\$(ConfigurationName)\mod\FreeSWITCH.Managed.dll ..\..\"external items"</PreBuildEvent>
   </PropertyGroup>
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
        Other similar extension points exist, see Microsoft.Common.targets.

commit 75bbd885eb1eef0bcfea9b5371557823ca584522
Author: Jeff Lenk <jeff at jefflenk.com>
Date:   Wed Feb 2 14:10:08 2011 -0600

    try to fix the localization install fail again

diff --git a/mitchcapper/FSClient/Setup/FSCore.wxs b/mitchcapper/FSClient/Setup/FSCore.wxs
index b59f5f8..2e95778 100644
--- a/mitchcapper/FSClient/Setup/FSCore.wxs
+++ b/mitchcapper/FSClient/Setup/FSCore.wxs
@@ -18,7 +18,7 @@
           <Component Id="cmp3900B358BC2FB69DF2C42DDE35C5BBB2" Guid="*">
             <File Id="fil322A57E96A97A8179B75065ABF94F809" KeyPath="yes" Source="$(var.FSClient.TargetDir)\FreeSwitch.dll" />
             <CreateFolder Directory="INSTALLLOCATION">
-              <Permission User="Users" GenericAll="yes" />
+              <PermissionEx User="Users" GenericRead="yes" GenericWrite="yes" CreateFile="yes" xmlns="http://schemas.microsoft.com/wix/UtilExtension"/>
             </CreateFolder>
           </Component>
           <Component Id="cmp3CD83BDDE0C679AC83F36ABCCC44B85F" Guid="*">
diff --git a/mitchcapper/FSClient/Setup/Setup.wixproj b/mitchcapper/FSClient/Setup/Setup.wixproj
index 62c873c..7fea603 100644
--- a/mitchcapper/FSClient/Setup/Setup.wixproj
+++ b/mitchcapper/FSClient/Setup/Setup.wixproj
@@ -72,6 +72,10 @@
     </BootstrapperFile>
   </ItemGroup>
   <ItemGroup>
+    <WixExtension Include="WixUtilExtension">
+      <HintPath>$(WixExtDir)\WixUtilExtension.dll</HintPath>
+      <Name>WixUtilExtension</Name>
+    </WixExtension>
     <WixExtension Include="WixNetFxExtension">
       <HintPath>$(WixExtDir)\WixNetFxExtension.dll</HintPath>
       <Name>WixNetFxExtension</Name>

commit 274a7dd627ab98012ebf26c68c0ed5f440fa9033
Author: Mitch Capper <mitch.capper at gmail.com>
Date:   Wed Feb 2 10:02:48 2011 -0800

    Reset contact search bar string on escape or dial

diff --git a/mitchcapper/FSClient/Broker.cs b/mitchcapper/FSClient/Broker.cs
index 0372d51..0195525 100644
--- a/mitchcapper/FSClient/Broker.cs
+++ b/mitchcapper/FSClient/Broker.cs
@@ -229,7 +229,7 @@ namespace FSClient {
 		public void DialString(String str){
 			if (string.IsNullOrWhiteSpace(str))
 				return;
-			MainWindowRemoveFocus();
+			MainWindowRemoveFocus(true);
 
 			if (str.StartsWith("#") && str.Length > 2) {
 				String acct_num = str.Substring(1, 1);
@@ -572,8 +572,8 @@ namespace FSClient {
 		public OurAutoCompleteBox GetContactSearchBox() {
 			return MainWindow.get_instance().GetContactSearchBox();
 		}
-		public void MainWindowRemoveFocus(){
-			MainWindow.get_instance().RemoveFocus();
+		public void MainWindowRemoveFocus(bool ResetContactSearchText=false){
+			MainWindow.get_instance().RemoveFocus(ResetContactSearchText);
 		}
 		private delegate void BroadcastEventDel(FSEvent evt);
 		BroadcastEventDel BroadcastHandler;
diff --git a/mitchcapper/FSClient/MainWindow.xaml.cs b/mitchcapper/FSClient/MainWindow.xaml.cs
index 2dd780b..2201cf0 100644
--- a/mitchcapper/FSClient/MainWindow.xaml.cs
+++ b/mitchcapper/FSClient/MainWindow.xaml.cs
@@ -268,8 +268,10 @@ namespace FSClient {
 
 		}
 
-		public void RemoveFocus(){
+		public void RemoveFocus(bool ResetContactSearchText=false){
 			btnMute.Focus(); //should really divert focus a better way
+			if (ResetContactSearchText)
+				ResetContactSearchStr();
 		}
 
 
@@ -424,10 +426,11 @@ namespace FSClient {
 			return txtSearchBox;
 		}
 
+		private const string contact_search_text = "Contact Search";
 		private void txtSearchBox_GotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) {
 			text_interception_enabled = false;
 			txtSearchBox.Opacity = 1;
-			if (txtSearchBox.Text == "Contact Search")
+			if (txtSearchBox.Text == contact_search_text)
 				txtSearchBox.Text = "";
 		}
 
@@ -436,7 +439,10 @@ namespace FSClient {
 			txtSearchBox.Opacity = 0.8;
 
 			if (String.IsNullOrWhiteSpace(txtSearchBox.Text))
-				txtSearchBox.Text = "Contact Search";
+				ResetContactSearchStr();
+		}
+		public void ResetContactSearchStr(){
+			txtSearchBox.Text = contact_search_text;
 		}
 
 		private bool ContactMenuOpen;
diff --git a/mitchcapper/FSClient/SimpleContactPluginBase.cs b/mitchcapper/FSClient/SimpleContactPluginBase.cs
index d2fbc41..4575f30 100644
--- a/mitchcapper/FSClient/SimpleContactPluginBase.cs
+++ b/mitchcapper/FSClient/SimpleContactPluginBase.cs
@@ -150,7 +150,7 @@ namespace FSClient
 			if (e.Key == Key.Enter)
 				call_current_contact();
 			else if (e.Key == Key.Escape)
-				Broker.get_instance().MainWindowRemoveFocus();
+				Broker.get_instance().MainWindowRemoveFocus(true);
 		}
 
 		protected OurAutoCompleteBox search_box;

commit 2bd0da508187e942e4c906275e286cefedb3a62e
Merge: 48590ec 594536a
Author: Mitch Capper <mitch.capper at gmail.com>
Date:   Wed Feb 2 09:43:04 2011 -0800

    Merge branch 'master' of ssh://git.freeswitch.org/freeswitch-contrib


commit 48590eca54e7c93ef987768a24a844dfd72986d1
Author: Mitch Capper <mitch.capper at gmail.com>
Date:   Wed Feb 2 09:42:55 2011 -0800

    Added ability to remove focus to main window in broker, and made simplecontact base do this on escape in the box

diff --git a/mitchcapper/FSClient/Broker.cs b/mitchcapper/FSClient/Broker.cs
index e0098b7..0372d51 100644
--- a/mitchcapper/FSClient/Broker.cs
+++ b/mitchcapper/FSClient/Broker.cs
@@ -6,8 +6,8 @@ using System.Windows;
 using System.Windows.Controls;
 using System.Xml;
 
-using FreeSWITCH.Native;
-using FSClient.Controls;
+using FreeSWITCH.Native;
+using FSClient.Controls;
 using Timer = System.Timers.Timer;
 
 namespace FSClient {
@@ -229,7 +229,7 @@ namespace FSClient {
 		public void DialString(String str){
 			if (string.IsNullOrWhiteSpace(str))
 				return;
-			MainWindow.get_instance().RemoveFocus();
+			MainWindowRemoveFocus();
 
 			if (str.StartsWith("#") && str.Length > 2) {
 				String acct_num = str.Substring(1, 1);
@@ -567,11 +567,14 @@ namespace FSClient {
 			if (BroadcastHandler == null)
 				BroadcastHandler = new BroadcastEventDel(BroadcastEvent);
 			Application.Current.Dispatcher.BeginInvoke(BroadcastHandler, new object[] { new FSEvent(args.EventObj) });
-		}
-
+		}
+
 		public OurAutoCompleteBox GetContactSearchBox() {
 			return MainWindow.get_instance().GetContactSearchBox();
 		}
+		public void MainWindowRemoveFocus(){
+			MainWindow.get_instance().RemoveFocus();
+		}
 		private delegate void BroadcastEventDel(FSEvent evt);
 		BroadcastEventDel BroadcastHandler;
 		private void BroadcastEvent(FSEvent evt) {
diff --git a/mitchcapper/FSClient/SimpleContactPluginBase.cs b/mitchcapper/FSClient/SimpleContactPluginBase.cs
index bcf73d1..d2fbc41 100644
--- a/mitchcapper/FSClient/SimpleContactPluginBase.cs
+++ b/mitchcapper/FSClient/SimpleContactPluginBase.cs
@@ -1,5 +1,5 @@
 using System;
-using System.Collections.Generic;
+using System.Collections.Generic;
 using System.Linq;
 using System.Windows;
 using System.Windows.Controls;
@@ -49,25 +49,25 @@ namespace FSClient
 			MenuItem item = new MenuItem();
 			item.Click += item_Click;
 			item.Header = "Edit Contact";
-			items.Add(item);
-			item = new MenuItem();
-			item.Click +=contact_call_click;
-			item.Header = "Call";
+			items.Add(item);
+			item = new MenuItem();
+			item.Click +=contact_call_click;
+			item.Header = "Call";
 			items.Add(item);
 			return items;
-		}
-
-		private void contact_call_click(object sender, RoutedEventArgs e){
-			MenuItem item = sender as MenuItem;
-			if (item == null)
-				return;
-
-			SearchAutoCompleteEntry entry = item.DataContext as SearchAutoCompleteEntry ?? search_box.SelectedItem as SearchAutoCompleteEntry;
-			if (entry == null)
-				return;
-			Broker.get_instance().DialString(entry.number);
-		}
-
+		}
+
+		private void contact_call_click(object sender, RoutedEventArgs e){
+			MenuItem item = sender as MenuItem;
+			if (item == null)
+				return;
+
+			SearchAutoCompleteEntry entry = item.DataContext as SearchAutoCompleteEntry ?? search_box.SelectedItem as SearchAutoCompleteEntry;
+			if (entry == null)
+				return;
+			Broker.get_instance().DialString(entry.number);
+		}
+
 		protected void item_Click(object sender, RoutedEventArgs e)
 		{
 			MenuItem item = sender as MenuItem;
@@ -82,8 +82,8 @@ namespace FSClient
 				default_edit_value = DefaultEditValue(c);
 			}
 			else{
-				SearchAutoCompleteEntry entry = item.DataContext as SearchAutoCompleteEntry ?? search_box.SelectedItem as SearchAutoCompleteEntry;
-
+				SearchAutoCompleteEntry entry = item.DataContext as SearchAutoCompleteEntry ?? search_box.SelectedItem as SearchAutoCompleteEntry;
+
 				if (entry == null)
 					return;
 				number = entry.number;
@@ -147,9 +147,10 @@ namespace FSClient
 			}
 		}
 		protected void search_box_PreviewKeyUp(object sender, KeyEventArgs e){
-			if (e.Key == Key.Enter){
-				call_current_contact();
-			}
+			if (e.Key == Key.Enter)
+				call_current_contact();
+			else if (e.Key == Key.Escape)
+				Broker.get_instance().MainWindowRemoveFocus();
 		}
 
 		protected OurAutoCompleteBox search_box;
@@ -165,19 +166,19 @@ namespace FSClient
 				real_search_box.ContextMenu.Items.Add(item);
 			}
 			
-			search_box.PreviewKeyUp += search_box_PreviewKeyUp;
+			search_box.PreviewKeyUp += search_box_PreviewKeyUp;
 			search_box.MouseDoubleClick += search_box_MouseDoubleClick;
 			if (number_to_alias.Count > 0)
 				refresh_search_box();
 			return true;
-		}
-		protected void call_current_contact(){
-			SearchAutoCompleteEntry entry = search_box.SelectedItem as SearchAutoCompleteEntry;
-			if (entry != null)
-				Broker.get_instance().DialString(entry.number);
-		}
-		void search_box_MouseDoubleClick(object sender, MouseButtonEventArgs e){
-			call_current_contact();
+		}
+		protected void call_current_contact(){
+			SearchAutoCompleteEntry entry = search_box.SelectedItem as SearchAutoCompleteEntry;
+			if (entry != null)
+				Broker.get_instance().DialString(entry.number);
+		}
+		void search_box_MouseDoubleClick(object sender, MouseButtonEventArgs e){
+			call_current_contact();
 		}
 
 		void search_box_ContextMenuOpening(object sender, ContextMenuEventArgs e){

commit 594536af195a45e9515ff1c40979a3f036934e49
Merge: 4a41448 3f2c531
Author: Jeff Lenk <jeff at jefflenk.com>
Date:   Wed Feb 2 09:29:16 2011 -0600

    Merge branch 'master' of ssh://git.freeswitch.org/freeswitch-contrib


commit 4a414482ddc08fe77a42daab560a1bd860235154
Author: Jeff Lenk <jeff at jefflenk.com>
Date:   Wed Feb 2 09:28:49 2011 -0600

    Fix installation problem - with non English locales

diff --git a/mitchcapper/FSClient/Setup/FSCore.wxs b/mitchcapper/FSClient/Setup/FSCore.wxs
index ac22889..b59f5f8 100644
--- a/mitchcapper/FSClient/Setup/FSCore.wxs
+++ b/mitchcapper/FSClient/Setup/FSCore.wxs
@@ -18,7 +18,7 @@
           <Component Id="cmp3900B358BC2FB69DF2C42DDE35C5BBB2" Guid="*">
             <File Id="fil322A57E96A97A8179B75065ABF94F809" KeyPath="yes" Source="$(var.FSClient.TargetDir)\FreeSwitch.dll" />
             <CreateFolder Directory="INSTALLLOCATION">
-              <Permission User="Authenticated Users" GenericAll="yes" />
+              <Permission User="Users" GenericAll="yes" />
             </CreateFolder>
           </Component>
           <Component Id="cmp3CD83BDDE0C679AC83F36ABCCC44B85F" Guid="*">

commit 3f2c531df509383cd93d9ae4379bfb656a969c7e
Merge: fc1ff4f 4277bdb
Author: Mitch Capper <mitch.capper at gmail.com>
Date:   Tue Feb 1 22:29:18 2011 -0800

    Merge branch 'master' of ssh://git.freeswitch.org/freeswitch-contrib


commit fc1ff4f95853eb0a66db9b3658f596c19f8e66c4
Author: Mitch Capper <mitch.capper at gmail.com>
Date:   Tue Feb 1 22:28:48 2011 -0800

    Minor text changes to make things clearer

diff --git a/mitchcapper/FSClient/README.txt b/mitchcapper/FSClient/README.txt
index 6863643..68288a3 100644
--- a/mitchcapper/FSClient/README.txt
+++ b/mitchcapper/FSClient/README.txt
@@ -22,7 +22,7 @@ Plugins
 		There are two native headset plugins provided for Jabra and Plantronics headsets.  If you do not have one of these you can still leave the plugin in the directory it will not harm anything.  If you do have one of these headsets you will then be able to select the headset in the options.  This will automatically open/close the audio link, support muting and buttons, caller id, etc in the headset.  You may need the runtime/sdk for the headset installed for it to work.
 
 	Contact Plugins
-		There is one contact plugin provided by default, SimpleXML.  This plugin allows you to attach a name/alias to a phone number so future calls show this information for the number.  Right click and click edit on a call to edit the name/alias.  The plugin stores all the names in an xml file in the AppData\Local folder for the app.  Note you cannot have more than one contact plugin in the plugins folder or else only the first will be used.  There are two ways to write a contact plugin, you can inherit from the SimpleContactPluginBase or IContactPlugin classes.  SimpleContactPluginBase is just a base class that inherits from IContactPlugin to make things a bit easier.  It uses basically the same interface as SimpleXML but you could replace SimpleXML with something to tie it to outlook, a ldap address book etc.
+		There is one contact plugin provided by default, SimpleXML.  This plugin allows you to attach a name/alias to a phone number so future calls show this information for the number.  Right click and click edit on a call to edit the name/alias. Control +F or click in the contact search box on the bottom right, search by name right click for options.  The plugin stores all the names in an xml file in the AppData\Local folder for the app.  Note you cannot have more than one contact plugin in the plugins folder or else only the first will be used.  There are two ways to write a contact plugin, you can inherit from the SimpleContactPluginBase or IContactPlugin classes.  SimpleContactPluginBase is just a base class that inherits from IContactPlugin to make things a bit easier.  It uses basically the same interface as SimpleXML but you could replace SimpleXML with something to tie it to outlook, a ldap address book etc.
 	
 	Plugin Development
 		FSClient was made to make it easy to extend through plugins.  The two plugin types supported are noted above.  Writing a plugin is exceptionally easy, you simply inherit the base interface fill in a few functions and are good to go.  Use the above for examples.  As for how easy, well the SimpleXML Contact Plugin was written in under an hour and under 100 lines of code.  Writing plugins is easiest in a .net language (although you can write them in any language).  FSClient will try to load any plugins in the plugin dir.  
diff --git a/mitchcapper/FSClient/Sofia.cs b/mitchcapper/FSClient/Sofia.cs
index 15fd750..f33d963 100644
--- a/mitchcapper/FSClient/Sofia.cs
+++ b/mitchcapper/FSClient/Sofia.cs
@@ -126,7 +126,7 @@ namespace FSClient {
 			master_profile_ok = true;
 			String res = Utils.api_exec("sofia", "status profile softphone");
 			if (res.Trim() == "Invalid Profile!") {
-				MessageBox.Show("Warning the master sofia profile was not able to load and the phone will most likely _not_ work, make sure the local bind port (" + FieldValue.GetByName(values, "sip-port").value + ") is free(set under the Advanced tab of in the sofia settings), otherwise check the freeswitch.log for more details.  You can try reloading the sofia profile by editing the sofia settings and clicking save.");
+				MessageBox.Show("Warning the master sofia profile was not able to load and the phone will most likely _not_ work, make sure the local bind port (" + FieldValue.GetByName(values, "sip-port").value + ") is free(set under the Advanced tab of in the sofia settings) and FSClient is allowed through your firewall, otherwise check the freeswitch.log for more details.  You can try reloading the sofia profile by editing the sofia settings and clicking save to see if fixed.");
 				master_profile_ok = false;
 			}
 
diff --git a/mitchcapper/FSClient/TODO.txt b/mitchcapper/FSClient/TODO.txt
index 7e3f1fb..4e65bb3 100644
--- a/mitchcapper/FSClient/TODO.txt
+++ b/mitchcapper/FSClient/TODO.txt
@@ -1,4 +1,2 @@
-Better address book integration.   Right now the integration is pretty lame to say the least, you cannot lookup contacts or do much in the way of editing them. I think a nice interm solution would be a control + f support to find a contact to atleast make outgoing calls.  Right now contact plugins can add right click menus but maybe making a more central way for them to add right click options so they don't have to do so much work would be better.
-Volume control / gain.   Right now you can use the system volume to adjust things but it would be nice to have this built into the GUI and also have a gain option.  Gain would require changes to portaudio to support it most likely (although should be decently simple) or using set_audio_level.  -- Partially implemented now with the ability to set audio levels on a call by right clicking on it.
 Plugin control, ability to enable or disable plugins from the options menu.
 Figure out a way to sort codecs, a draggable combo box may work well.
\ No newline at end of file

commit 4277bdbadddb4bd6bd034812a4f59db60bd6e2aa
Author: Jeff Lenk <jeff at jefflenk.com>
Date:   Tue Feb 1 23:15:44 2011 -0600

    add dependency for new file

diff --git a/mitchcapper/FSClient/Setup/FSClient.wxs b/mitchcapper/FSClient/Setup/FSClient.wxs
index 68d0886..ba6960a 100644
--- a/mitchcapper/FSClient/Setup/FSClient.wxs
+++ b/mitchcapper/FSClient/Setup/FSClient.wxs
@@ -4,6 +4,7 @@
       <ComponentGroup Id="FSClientComp">
         <ComponentRef Id="cmp98E16C7E23D449F3BC0ECF003543C3F9"/>
         <ComponentRef Id="cmp32DB946E4669A895FAC4826678D1CE7A"/>
+        <ComponentRef Id="cmpD17CBE22A3B94CCE9CF46B849289D40D"/>
       </ComponentGroup>
         <DirectoryRef Id="INSTALLLOCATION">
           <Component Id="cmp98E16C7E23D449F3BC0ECF003543C3F9" Guid="*">
@@ -12,6 +13,9 @@
           <Component Id="cmp32DB946E4669A895FAC4826678D1CE7A" Guid="*">
             <File Id="filE4CB78ABCF2AE91B89FB0446A607E70C" KeyPath="yes" Source="$(var.FSClient.TargetDir)\WPFToolkit.dll" />
           </Component>
+          <Component Id="cmpD17CBE22A3B94CCE9CF46B849289D40D" Guid="*">
+            <File Id="fil00037BE15D6A4893973045263EA4B117" KeyPath="yes" Source="$(var.FSClient.TargetDir)\System.Windows.Controls.Input.Toolkit.dll" />
+          </Component>
         </DirectoryRef>
     </Fragment>
 </Wix>
\ No newline at end of file

commit 5247b0c1000e9aa6e642cdd238396d679d7c6bb3
Author: Mitch Capper <mitch.capper at gmail.com>
Date:   Tue Feb 1 20:27:15 2011 -0800

    Make sure to hide the contact search box if no contact plugin supports it

diff --git a/mitchcapper/FSClient/IContactPlugin.cs b/mitchcapper/FSClient/IContactPlugin.cs
index b064ff6..c1a1c24 100644
--- a/mitchcapper/FSClient/IContactPlugin.cs
+++ b/mitchcapper/FSClient/IContactPlugin.cs
@@ -5,9 +5,9 @@ using System.ComponentModel;
 using System.IO;
 using System.Reflection;
 using System.Windows;
-using System.Windows.Controls;
-using FSClient.Controls;
-
+using System.Windows.Controls;
+using FSClient.Controls;
+
 namespace FSClient {
 	public class ContactPluginManager : IDisposable {
 		private bool IsTypeOf(Type to_check, Type of) {
@@ -36,19 +36,24 @@ namespace FSClient {
 		}
 		private void ContactInit(){
 			IContactPlugin plugin = plugins[0];
-			ContactMenuItems = plugin.ContactRightClickMenu();
+			ContactMenuItems = plugin.ContactRightClickMenu();
 			OurAutoCompleteBox box = Broker.get_instance().GetContactSearchBox();
-			if (!plugin.HandleSearchBox(box))
-				box.Visibility = Visibility.Collapsed;
+			if (plugin.HandleSearchBox(box))
+				box.Visibility = Visibility.Visible;
 		}
 		private void HandleError(IContactPlugin plugin, Exception e) {
 			Utils.PluginLog("Contact Plugin Manager", "Plugin \"" + plugin.ProviderName() + "\" had an error Due to: " + e.Message);
 
 		}
 	
-		public ContactPluginManager() {
-
-
+		public ContactPluginManager() {
+			OurAutoCompleteBox box = Broker.get_instance().GetContactSearchBox();
+			Application.Current.Dispatcher.BeginInvoke((Action) (() => {
+			                                                     	box.Visibility = Visibility.Collapsed;
+			                                                     }));
+			
+			
+
 			String plugin_dir = Utils.plugins_dir();
 			string[] dlls;
 			try {
@@ -161,7 +166,7 @@ namespace FSClient {
 		public abstract IEnumerable<MenuItem> ContactRightClickMenu();
 		public abstract void Initialize();
 		public abstract void Terminate();
-		public abstract string ProviderName();
+		public abstract string ProviderName();
 		public abstract bool HandleSearchBox(OurAutoCompleteBox box);
 
 	}

commit 09778f943674b470c51a636aa8e3e3b22589708e
Author: Mitch Capper <mitch.capper at gmail.com>
Date:   Tue Feb 1 20:04:51 2011 -0800

    Made NO_FS a bit more robust
    Moved broker to have an actuall make call function so other things can place calls
    Added Contact Search Box support, it is a bit hacky to say the least.....

diff --git a/mitchcapper/FSClient/Broker.cs b/mitchcapper/FSClient/Broker.cs
index 924d714..e0098b7 100644
--- a/mitchcapper/FSClient/Broker.cs
+++ b/mitchcapper/FSClient/Broker.cs
@@ -6,7 +6,8 @@ using System.Windows;
 using System.Windows.Controls;
 using System.Xml;
 
-using FreeSWITCH.Native;
+using FreeSWITCH.Native;
+using FSClient.Controls;
 using Timer = System.Timers.Timer;
 
 namespace FSClient {
@@ -70,6 +71,8 @@ namespace FSClient {
 			try {//it would be better if this was in the init function but it seems some dll load errors won't be caught if it is.
 #if ! NO_FS
 				fs_core_init();
+#else
+				fs_inited = false;
 #endif
 				if (FreeswitchLoaded != null)
 					FreeswitchLoaded(this, null);
@@ -82,14 +85,16 @@ namespace FSClient {
 				Environment.Exit(-1);
 
 			}
+#if ! NO_FS
 			DelayedFunction.DelayedCall("SofiaProfileCheck", sofia.sofia_profile_check, 100);
+#endif
 		}
 
 		private void initContactManager() {
 			contact_plugin_manager = new ContactPluginManager();
 
 		}
-
+
 		#region Text Input
 
 
@@ -118,8 +123,10 @@ namespace FSClient {
 			if (Call.active_call != null && Call.active_call.state == Call.CALL_STATE.Answered)
 				Call.active_call.send_dtmf(key.ToString());
 			else {
+#if ! NO_FS
 				PortAudio.PlayDTMF(key, null, true);
 				DelayedFunction.DelayedCall("PortAudioLastDigitHitStreamClose", close_streams, 5000);
+#endif
 			}
 		}
 		private void close_streams() {
@@ -219,6 +226,26 @@ namespace FSClient {
 			//OffHook = true;
 			//Utils.bgapi_exec("pa", "play tone_stream://%(10000,0,350,440);loops=20");
 		}
+		public void DialString(String str){
+			if (string.IsNullOrWhiteSpace(str))
+				return;
+			MainWindow.get_instance().RemoveFocus();
+
+			if (str.StartsWith("#") && str.Length > 2) {
+				String acct_num = str.Substring(1, 1);
+				str = str.Substring(2);
+				Account acct = (from a in Account.accounts where a.guid == acct_num select a).SingleOrDefault();
+				if (acct != null) {
+					acct.CreateCall(str);
+					return;
+				}
+			}
+			if (Account.default_account == null) {
+				MessageBox.Show("no default account, make sure you have added one or more accounts (right click in the account area to add) and they are enabled (checked)");
+				return;
+			}
+			Account.default_account.CreateCall(str);
+		}
 		public void TalkPressed() {
 			if (Call.active_call != null) {
 				if (Call.active_call.state == Call.CALL_STATE.Ringing && Call.active_call.is_outgoing == false)
@@ -228,22 +255,8 @@ namespace FSClient {
 			} else {
 				if (String.IsNullOrEmpty(cur_dial_str))
 					DialTone();
-				else {
-					if (cur_dial_str.StartsWith("#") && cur_dial_str.Length > 2) {
-						String acct_num = cur_dial_str.Substring(1, 1);
-						cur_dial_str = cur_dial_str.Substring(2);
-						Account acct = (from a in Account.accounts where a.guid == acct_num select a).SingleOrDefault();
-						if (acct != null) {
-							acct.CreateCall(cur_dial_str);
-							cur_dial_str = "";
-							return;
-						}
-					}
-					if (Account.default_account == null) {
-						MessageBox.Show("no default account, make sure you have added one or more accounts (right click in the account area to add) and they are enabled (checked)");
-						return;
-					}
-					Account.default_account.CreateCall(cur_dial_str);
+				else{
+					DialString(cur_dial_str);
 					cur_dial_str = "";
 				}
 			}
@@ -548,12 +561,16 @@ namespace FSClient {
 			sofia.reload_config(mode);
 		}
 		public static EventHandler<EventArgs> FreeswitchLoaded;
-		public static EventHandler<FSEvent> NewEvent;
+		public static EventHandler<FSEvent> NewEvent;
 		private void event_handler(FreeSWITCH.EventBinding.EventBindingArgs args) {
 
 			if (BroadcastHandler == null)
 				BroadcastHandler = new BroadcastEventDel(BroadcastEvent);
 			Application.Current.Dispatcher.BeginInvoke(BroadcastHandler, new object[] { new FSEvent(args.EventObj) });
+		}
+
+		public OurAutoCompleteBox GetContactSearchBox() {
+			return MainWindow.get_instance().GetContactSearchBox();
 		}
 		private delegate void BroadcastEventDel(FSEvent evt);
 		BroadcastEventDel BroadcastHandler;
@@ -587,7 +604,7 @@ namespace FSClient {
 		private bool is_inited;
 		private bool fs_inited;
 		private static IDisposable event_bind;
-
+		
 		private void fs_core_init() {
 			fs_inited = true;
 			freeswitch.switch_core_set_globals();
diff --git a/mitchcapper/FSClient/Controls/OurAutoCompleteBox.cs b/mitchcapper/FSClient/Controls/OurAutoCompleteBox.cs
new file mode 100644
index 0000000..edc358f
--- /dev/null
+++ b/mitchcapper/FSClient/Controls/OurAutoCompleteBox.cs
@@ -0,0 +1,32 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Windows.Controls;
+
+namespace FSClient.Controls {
+	public class OurAutoCompleteBox : AutoCompleteBox {
+	
+		private TextBox the_textbox;
+		private void find_textbox(){
+			if (the_textbox != null)
+				return;
+			the_textbox = Template.FindName("Text", this) as TextBox;
+		}
+		public TextBox GetActualTextbox() {
+			find_textbox();
+			return the_textbox;
+		}
+		public bool TextBoxHasFocus(){
+			find_textbox();
+			if (the_textbox == null)
+				return false;
+			return the_textbox.IsFocused;
+		}
+		public void TextBoxFocus(){
+			find_textbox();
+			if (the_textbox != null)
+				the_textbox.Focus();
+		}
+	}
+}
diff --git a/mitchcapper/FSClient/FSClient.csproj b/mitchcapper/FSClient/FSClient.csproj
index f4e250c..b12ef37 100644
--- a/mitchcapper/FSClient/FSClient.csproj
+++ b/mitchcapper/FSClient/FSClient.csproj
@@ -68,6 +68,10 @@
     <Reference Include="System.configuration" />
     <Reference Include="System.Data" />
     <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Controls.Input.Toolkit, Version=3.5.40128.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>C:\Program Files (x86)\WPF Toolkit\v3.5.50211.1\System.Windows.Controls.Input.Toolkit.dll</HintPath>
+    </Reference>
     <Reference Include="System.Windows.Forms" />
     <Reference Include="System.Xaml" />
     <Reference Include="System.Xml">
@@ -91,6 +95,7 @@
     <Compile Include="Account.cs" />
     <Compile Include="Broker.cs" />
     <Compile Include="Call.cs" />
+    <Compile Include="Controls\OurAutoCompleteBox.cs" />
     <Compile Include="Controls\PhonePadButton.xaml.cs">
       <DependentUpon>PhonePadButton.xaml</DependentUpon>
     </Compile>
diff --git a/mitchcapper/FSClient/IContactPlugin.cs b/mitchcapper/FSClient/IContactPlugin.cs
index 4d59e57..b064ff6 100644
--- a/mitchcapper/FSClient/IContactPlugin.cs
+++ b/mitchcapper/FSClient/IContactPlugin.cs
@@ -5,7 +5,9 @@ using System.ComponentModel;
 using System.IO;
 using System.Reflection;
 using System.Windows;
-using System.Windows.Controls;
+using System.Windows.Controls;
+using FSClient.Controls;
+
 namespace FSClient {
 	public class ContactPluginManager : IDisposable {
 		private bool IsTypeOf(Type to_check, Type of) {
@@ -15,6 +17,9 @@ namespace FSClient {
 				return true;
 			return IsTypeOf(to_check.BaseType, of);
 		}
+
+		public static IEnumerable<MenuItem> ContactMenuItems { get; set; }
+
 		private List<IContactPlugin> plugins = new List<IContactPlugin>();
 		public void RegisterPlugin(IContactPlugin plugin) {
 			if (plugins.Count > 0)
@@ -22,13 +27,24 @@ namespace FSClient {
 			try {
 				plugins.Add(plugin);
 				plugin.Initialize();
+				Application.Current.Dispatcher.BeginInvoke((Action)ContactInit);
+				
+
 			} catch (Exception e) {
 				HandleError(plugin, e);
 			}
 		}
+		private void ContactInit(){
+			IContactPlugin plugin = plugins[0];
+			ContactMenuItems = plugin.ContactRightClickMenu();
+			OurAutoCompleteBox box = Broker.get_instance().GetContactSearchBox();
+			if (!plugin.HandleSearchBox(box))
+				box.Visibility = Visibility.Collapsed;
+		}
 		private void HandleError(IContactPlugin plugin, Exception e) {
 			Utils.PluginLog("Contact Plugin Manager", "Plugin \"" + plugin.ProviderName() + "\" had an error Due to: " + e.Message);
-		}
+
+		}
 	
 		public ContactPluginManager() {
 
@@ -62,17 +78,17 @@ namespace FSClient {
 					Utils.PluginLog("Contact Plugin Manager", "Error creating contact plugin from dll \"" + dll + "\" of: " + e.Message);
 				}
 			}
-			Call.calls.CollectionChanged += calls_CollectionChanged;
-			Call.CallRightClickMenuShowing += calls_RightClickMenuShowing;
-		}
-
-		private void calls_RightClickMenuShowing(object sender, Call.CallRightClickEventArgs e){
-			if (plugins.Count == 0)
-				return;
-			plugins[0].CallRightClickMenu(e.call, e.menu);
-		}
-
-
+			Call.calls.CollectionChanged += calls_CollectionChanged;
+			Call.CallRightClickMenuShowing += calls_RightClickMenuShowing;
+		}
+
+		private void calls_RightClickMenuShowing(object sender, Call.CallRightClickEventArgs e){
+			if (plugins.Count == 0)
+				return;
+			plugins[0].CallRightClickMenu(e.call, e.menu);
+		}
+
+
 		private void calls_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) { //We want to background resolve things incase a plugin does something that takes awhile
 			if (e.NewItems == null || plugins.Count != 1)
 				return;
@@ -140,11 +156,13 @@ namespace FSClient {
 	public abstract class IContactPlugin {
 		public delegate void NumberResolved(String DisplayName);
 
-		public abstract void ResolveNumber(String number, NumberResolved on_resolved);
+		public abstract void ResolveNumber(String number, NumberResolved on_resolved);
 		public abstract void CallRightClickMenu(Call call, ContextMenu menu);
+		public abstract IEnumerable<MenuItem> ContactRightClickMenu();
 		public abstract void Initialize();
 		public abstract void Terminate();
-		public abstract string ProviderName();
+		public abstract string ProviderName();
+		public abstract bool HandleSearchBox(OurAutoCompleteBox box);
 
 	}
 }
diff --git a/mitchcapper/FSClient/MainWindow.xaml b/mitchcapper/FSClient/MainWindow.xaml
index cf42a50..5e1eb04 100644
--- a/mitchcapper/FSClient/MainWindow.xaml
+++ b/mitchcapper/FSClient/MainWindow.xaml
@@ -1,9 +1,7 @@
 <Window
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
-		xmlns:ours="clr-namespace:FSClient.Controls"
-
-        xmlns:toolkit="http://schemas.microsoft.com/wpf/2008/toolkit" xmlns:local="clr-namespace:FSClient" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" x:Class="FSClient.MainWindow"
+		xmlns:ours="clr-namespace:FSClient.Controls" xmlns:local="clr-namespace:FSClient" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:Controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Input.Toolkit" mc:Ignorable="d" x:Class="FSClient.MainWindow"
         Title="FSClient" Height="319" Width="666"  WindowStyle="SingleBorderWindow" ResizeMode="CanMinimize" Closing="Window_Closing" Icon="phone.ico">
 	<Window.Resources>
 		<local:DurationTimeConverter x:Key="DurationTimeConverter"/>
@@ -174,15 +172,27 @@
 
 				</StackPanel>
 			</Border>
-			<Button Content="Options" HorizontalAlignment="Left" x:Name="btnOptions" Width="75" Click="btnOptions_Click" Style="{DynamicResource GlassButtonStyle}" Height="20" Canvas.Left="349" Canvas.Top="266" d:LayoutOverrides="VerticalAlignment" />
+			<Button Content="Options" HorizontalAlignment="Left" x:Name="btnOptions" Width="50" Click="btnOptions_Click" Style="{DynamicResource GlassButtonStyle}" Height="20" Canvas.Left="374" Canvas.Top="266" d:LayoutOverrides="VerticalAlignment" />
 		</Canvas>
 		<Button Canvas.Left="283" Canvas.Top="21" Content="Send To Voicemail" FontWeight="Bold" Foreground="#FFF5E200" Height="20" Name="btnSendVoicemail" Style="{DynamicResource GlassButtonStyle}" Width="120" Visibility="Hidden" Click="btnSendVoicemail_Click" />
+
+		<ours:OurAutoCompleteBox Canvas.Left="435" Text="Contact Search" Canvas.Top="265" Height="22" Width="164.553" Opacity="0.8" x:Name="txtSearchBox" FilterMode="Contains" GotKeyboardFocus="txtSearchBox_GotKeyboardFocus" LostKeyboardFocus="txtSearchBox_LostKeyboardFocus" DropDownClosing="txtSearchBox_DropDownClosing">
+			<ours:OurAutoCompleteBox.ItemTemplate>
+				<DataTemplate>
+
+					<TextBlock Text="{Binding}">
+						<TextBlock.ContextMenu>
+							<ContextMenu x:Name="contactSearchConextMenu" ItemsSource="{Binding Path=(local:ContactPluginManager.ContactMenuItems)}" IsEnabled="true" Closed="contactSearchConextMenu_Closed" Loaded="contactSearchConextMenu_Loaded" />
+						</TextBlock.ContextMenu>
+					</TextBlock>
+				</DataTemplate>
+				</ours:OurAutoCompleteBox.ItemTemplate>
+		</ours:OurAutoCompleteBox>
 		<Control
             x:Name="busyAnimation" 
             Style="{StaticResource BusyAnimationStyle}"
             Width="{Binding Path=ActualWidth, ElementName=mainControl}" 
-            Height="{Binding Path=ActualHeight, ElementName=mainControl}" 
+            Height="{Binding Path=ActualHeight, ElementName=mainControl}" d:IsHidden="True" 
             />
-
 	</Canvas>
 </Window>
diff --git a/mitchcapper/FSClient/MainWindow.xaml.cs b/mitchcapper/FSClient/MainWindow.xaml.cs
index bd80d6b..2dd780b 100644
--- a/mitchcapper/FSClient/MainWindow.xaml.cs
+++ b/mitchcapper/FSClient/MainWindow.xaml.cs
@@ -1,396 +1,458 @@
-using System;
-using System.ComponentModel;
-using System.Windows;
-using System.Windows.Controls;
-using System.Windows.Input;
-using System.Windows.Media;
-namespace FSClient {
-	public partial class MainWindow : Window {
-		private Broker broker;
-		public MainWindow() {
-			_instance = this;
-
-			InitializeComponent();
-
-			gridCalls.DataContext = Call.calls;
-
-
-			gridCalls.LoadingRow += gridCalls_LoadingRow;
-			gridAccounts.DataContext = Account.accounts;
-
-			this.Loaded += MainWindow_Loaded;
-			
-
-		}
-
-		private void ActiveCallChanged(object sender, Call.ActiveCallChangedArgs e) {
-			Dispatcher.BeginInvoke((Action)(() => {
-				CurrentCallInfo.DataContext = Call.active_call;
-				if (Call.active_call == null)
-					CurrentCallInfo.Visibility = Visibility.Hidden;
-				else
-					CurrentCallInfo.Visibility = Visibility.Visible;
-			}));
-		}
-		private void CallStateChanged(object sender, Call.CallPropertyEventArgs e) {
-			gridCalls.Items.SortDescriptions.Clear();
-			gridCalls.Items.SortDescriptions.Add(new SortDescription("sort_order", ListSortDirection.Descending));
-		}
-		void accounts_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) {
-			if (e.NewItems == null)
-				return;
-			foreach (Account acct in e.NewItems) {
-				acct.PropertyChanged += acct_PropertyChanged;
-			}
-		}
-
-		void acct_PropertyChanged(object sender, PropertyChangedEventArgs e) {
-			if (e.PropertyName == "gateway_id") {
-				gridAccounts.Items.SortDescriptions.Clear();
-				gridAccounts.Items.SortDescriptions.Add(new SortDescription("gateway_id", ListSortDirection.Ascending));
-			}
-		}
-
-
-
-
-		void gridCalls_LoadingRow(object sender, DataGridRowEventArgs e) {
-			e.Row.SetResourceReference(ToolTipProperty, "mainCallTooltip");
-			last_tip = e.Row.ToolTip as ToolTip;
+using System;
+using System.ComponentModel;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Input;
+using System.Windows.Media;
+using FSClient.Controls;
+
+namespace FSClient {
+	public partial class MainWindow : Window {
+		private Broker broker;
+		public MainWindow() {
+			_instance = this;
+
+			InitializeComponent();
+
+			gridCalls.DataContext = Call.calls;
+
+
+			gridCalls.LoadingRow += gridCalls_LoadingRow;
+			gridAccounts.DataContext = Account.accounts;
+
+			this.Loaded += MainWindow_Loaded;
+
+
+		}
+
+		private void ActiveCallChanged(object sender, Call.ActiveCallChangedArgs e) {
+			Dispatcher.BeginInvoke((Action)(() => {
+				CurrentCallInfo.DataContext = Call.active_call;
+				if (Call.active_call == null)
+					CurrentCallInfo.Visibility = Visibility.Hidden;
+				else
+					CurrentCallInfo.Visibility = Visibility.Visible;
+			}));
+		}
+		private void CallStateChanged(object sender, Call.CallPropertyEventArgs e) {
+			gridCalls.Items.SortDescriptions.Clear();
+			gridCalls.Items.SortDescriptions.Add(new SortDescription("sort_order", ListSortDirection.Descending));
+		}
+		void accounts_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) {
+			if (e.NewItems == null)
+				return;
+			foreach (Account acct in e.NewItems) {
+				acct.PropertyChanged += acct_PropertyChanged;
+			}
+		}
+
+		void acct_PropertyChanged(object sender, PropertyChangedEventArgs e) {
+			if (e.PropertyName == "gateway_id") {
+				gridAccounts.Items.SortDescriptions.Clear();
+				gridAccounts.Items.SortDescriptions.Add(new SortDescription("gateway_id", ListSortDirection.Ascending));
+			}
+		}
+
+
+
+
+		void gridCalls_LoadingRow(object sender, DataGridRowEventArgs e) {
+			e.Row.SetResourceReference(ToolTipProperty, "mainCallTooltip");
 			Call c = e.Row.DataContext as Call;
-			last_row = e.Row;
 			if (c == null)
-				return;
-			e.Row.ContextMenu = c.CallRightClickMenu();
-			
-		}
-		private ToolTip last_tip;
-		private DataGridRow last_row;
-		public void SetDialStr(string str) {
-			Dispatcher.BeginInvoke((Action)(() => {
-				txtNumber.Text = str;
-			}));
-		}
-
-		private void CanEndChanged(object sender, bool data) {
-			Dispatcher.BeginInvoke((Action)(() => {
-				btnHangup.IsEnabled = broker.CanEnd;
-			}));
-		}
-		private void SpeakerActiveChanged(object sender, bool data) {
-			Dispatcher.BeginInvoke((Action)(() => {
-				btnSpeaker.Foreground = data ? enabled_brush : disabled_brush;
-			}));
-		}
-		private void MuteChanged(object sender, bool data) {
-			Dispatcher.BeginInvoke((Action)(() => {
-				btnMute.Foreground = data ? enabled_brush : disabled_brush;
-			}));
-		}
-		private void DNDChanged(object sender, bool data) {
-			Dispatcher.BeginInvoke((Action)(() => {
-				btnDND.Foreground = data ? enabled_brush : disabled_brush;
-				Title = "FSClient " + (data ? " - DND" : "");
-			}));
-		}
-		private void CallActiveChanged(object sender, bool data) {
-			Dispatcher.BeginInvoke((Action)(() => {
-				btnHold.IsEnabled = broker.call_active;
-				btnTransfer.IsEnabled = broker.call_active;
-			}));
-
-		}
-
-
-
-		#region TextInput
-
-		private enum TEXT_INPUT_MODE { NUMBERS_ONLY, FULL };
-
-		private TEXT_INPUT_MODE text_mode = TEXT_INPUT_MODE.NUMBERS_ONLY;
-		private void simple_text_mode_char_convert(char c) {
-			if (c == '*' || c == '#' || (c >= '0' && c <= '9')){
-				broker.handle_key_action(c);
-				return;
-			}
-			switch (Char.ToUpper(c)) {
-				case 'A':
-				case 'B':
-				case 'C':
-					broker.handle_key_action('2');
-					break;
-				case 'D':
-				case 'E':
-				case 'F':
-					broker.handle_key_action('3');
-					break;
-				case 'G':
-				case 'H':
-				case 'I':
-					broker.handle_key_action('4');
-					break;
-				case 'J':
-				case 'K':
-				case 'L':
-					broker.handle_key_action('5');
-					break;
-				case 'M':
-				case 'N':
-				case 'O':
-					broker.handle_key_action('6');
-					break;
-				case 'P':
-				case 'Q':
-				case 'R':
-				case 'S':
-					broker.handle_key_action('7');
-					break;
-				case 'T':
-				case 'U':
-				case 'V':
-					broker.handle_key_action('8');
-					break;
-				case 'W':
-				case 'X':
-				case 'Y':
-				case 'Z':
-					broker.handle_key_action('9');
-					break;
-			}
-		}
-		void MainWindow_PreviewTextInput(object sender, TextCompositionEventArgs e) {
-			if (!broker.fully_loaded)
-				return;
-			char[] chars = e.Text.ToCharArray();
-			char[] sys_chars = e.ControlText.ToCharArray();
-			foreach (Char c in sys_chars) {
-				if (c == 22) //paste
-				{
-					String clipboard = Clipboard.GetText();
-					char[] tmp = new char[chars.Length + clipboard.Length];
-					chars.CopyTo(tmp, 0);
-					clipboard.ToCharArray().CopyTo(tmp, chars.Length);
-					chars = tmp;
-				}
-			}
-
-			e.Handled = false;
-			foreach (Char c in chars) {
-				bool handled = true;
-				if (c > 32 && c < 127) {
-					if (text_mode == TEXT_INPUT_MODE.NUMBERS_ONLY || (Call.active_call != null && Call.active_call.state == Call.CALL_STATE.Answered) )
-						simple_text_mode_char_convert(c);
-					else
-						broker.handle_key_action(c);
-						
-				}
-				else if (c == '\b')
-					broker.handle_special_action(Broker.KEYBOARD_ACTION.Backspace);
-				else if (c == '\r')
-					broker.handle_special_action(Broker.KEYBOARD_ACTION.Enter);
-				else if (c == 27)
-					broker.handle_special_action(Broker.KEYBOARD_ACTION.Escape);
-				else
-					handled = false;
-				if (handled)
-					e.Handled = true;
-			}
-		}
-		void MainWindow_PreviewKeyDown(object sender, KeyEventArgs e) {
-			if (!broker.fully_loaded)
-				return;
-
-			if (e.Key == Key.Return){
-				broker.handle_special_action(Broker.KEYBOARD_ACTION.Enter);
-				e.Handled = true;
-			}
-		}
-		#endregion
-		private static MainWindow _instance;
-		public static MainWindow get_instance() {
-			return _instance;
-		}
-
-		private void DialStrChanged(object sender, string data) {
-			SetDialStr(broker.cur_dial_str);
-		}
-		private void CallRingingChanged(object sender, bool data) {
-			Dispatcher.Invoke((Action)(() => {
-				if (data && Call.active_call != null && Call.active_call.CanSendToVoicemail())
-					btnSendVoicemail.Visibility = Visibility.Visible;
-				else
-					btnSendVoicemail.Visibility = Visibility.Hidden;
-			}));
-		}
-		void MainWindow_Loaded(object sender, RoutedEventArgs e) {
-			PreviewTextInput += MainWindow_PreviewTextInput;
-			PreviewKeyDown += MainWindow_PreviewKeyDown; //return must be handled seperately as buttons are triggered on down it seems
-			Call.CallStateChanged += CallStateChanged;
-			Call.ActiveCallChanged += ActiveCallChanged;
-			Account.accounts.CollectionChanged += accounts_CollectionChanged;
-			Broker.FreeswitchLoaded += new EventHandler<EventArgs>(FreeswitchLoaded);
-			broker = Broker.get_instance();
-			
-			broker.cur_dial_strChanged += DialStrChanged;
-			broker.call_activeChanged += CallActiveChanged;
-			broker.active_call_ringingChanged += CallRingingChanged;
-			broker.MutedChanged += MuteChanged;
-			broker.DNDChanged += DNDChanged;
-			broker.CanEndChanged += CanEndChanged;
-			broker.UseNumberOnlyInputChanged += UseNumberOnlyInputChanged;
-			UseNumberOnlyInputChanged(null, false);//trigger an update
-			broker.SpeakerphoneActiveChanged += SpeakerActiveChanged;
-			CurrentCallInfo.Visibility = Visibility.Hidden;
-			Windows.systray_icon_setup();
-		}
-
-		private void FreeswitchLoaded(object sender, EventArgs e){
-			Dispatcher.BeginInvoke((Action)(() => 
-			{
-				busyAnimation.Visibility = Visibility.Hidden;
-			}));
-		}
-		
-
-
-		private void UseNumberOnlyInputChanged(object sender, bool data){
-			text_mode = broker.UseNumberOnlyInput ? TEXT_INPUT_MODE.NUMBERS_ONLY : TEXT_INPUT_MODE.FULL;
-		}
-
-		public void BringToFront() {
-			Show();
-			BringIntoView();
-			WindowState = WindowState.Normal;
-			Topmost = true;
-			Topmost = false;
-		}
-		private void btnCall_Click(object sender, RoutedEventArgs e) {
-			broker.TalkPressed();
-
-		}
-
-		private void btnOptions_Click(object sender, RoutedEventArgs e) {
-			Options opt = new Options();
-			opt.ShowDialog();
-		}
-
-		private void btnHangup_Click(object sender, RoutedEventArgs e) {
-			broker.HangupPressed();
-		}
-
-		private void gridCalls_MouseDoubleClick(object sender, MouseButtonEventArgs e) {
-			FrameworkElement elem = e.OriginalSource as FrameworkElement;
-			if (elem == null)
-				return;
-			Call call = elem.DataContext as Call;
-			if (call == null)
-				return;
-			call.DefaultAction();
-		}
-
-		SolidColorBrush enabled_brush = new SolidColorBrush(Colors.Yellow);
-		SolidColorBrush disabled_brush = new SolidColorBrush(Colors.White);
-		private void btnMute_Click(object sender, RoutedEventArgs e) {
-			broker.Muted = !broker.Muted;
-		}
-
-		private void btnDND_Click(object sender, RoutedEventArgs e) {
-			broker.DND = !broker.DND;
-		}
-		private void gridAccounts_MouseUp(object sender, MouseButtonEventArgs e) {
-			FrameworkElement elem = e.OriginalSource as FrameworkElement;
-			if (elem == null)
-				return;
-			Account account = elem.DataContext as Account;
-			if (account == null)
-				return;
-			DependencyObject dep = elem;
-			while (dep != null && !(dep is DataGridCell)) {
-				dep = VisualTreeHelper.GetParent(dep);
-			}
-			DataGridCell cell = dep as DataGridCell;
-			if (cell == null)
-				return;
-
-			if (cell.Column.SortMemberPath == "enabled") {
-				account.enabled = !account.enabled;
-				account.ReloadAccount();
-			}
-		}
-
-		private void Window_Closing(object sender, CancelEventArgs e) {
-			try{
-				Windows.systray_icon_remove();
-				broker.Dispose();
-			}
-			catch { }
-		}
-
-		private void btnSpeaker_Click(object sender, RoutedEventArgs e) {
-			broker.SpeakerphoneActive = !broker.SpeakerphoneActive;
-		}
-
-
-		private void AccountNew_Click(object sender, RoutedEventArgs e) {
-			Account acct = new Account();
-			Account.AddAccount(acct);
-			acct.edit();
-
-		}
-
-		private void AccountEdit_Click(object sender, RoutedEventArgs e) {
-			Account acct = gridAccounts.SelectedItem as Account;
-			if (acct == null)
-				return;
-			acct.edit();
-		}
-
-		private void AccountSetDefault_Click(object sender, RoutedEventArgs e) {
-			Account acct = gridAccounts.SelectedItem as Account;
-			if (acct == null)
-				return;
-			acct.is_default_account = true;
-		}
-
-		private void AccountDelete_Click(object sender, RoutedEventArgs e) {
-			Account acct = gridAccounts.SelectedItem as Account;
-			if (acct == null)
-				return;
-			Account.accounts.Remove(acct);
-		}
-
-
-		private void gridAccounts_ContextMenuOpening(object sender, ContextMenuEventArgs e) {
-			menuAccountDelete.IsEnabled = menuAccountEdit.IsEnabled = menuAccountSetDefault.IsEnabled = gridAccounts.SelectedItem != null;
-		}
-
-		private void btnDialpad_Click(object sender, RoutedEventArgs e) {
-			Button btn = sender as Button;
-			if (btn != null)
-				broker.handle_key_action(btn.Content.ToString()[0]);
-			Controls.PhonePadButton btn2 = sender as Controls.PhonePadButton;
-			if (btn2 != null)
-				broker.handle_key_action(btn2.Number[0]);
-
-		}
-
-		private void btnHold_Click(object sender, RoutedEventArgs e) {
-			if (Call.active_call != null)
-				Call.active_call.hold();
-		}
-
-		private void btnSendVoicemail_Click(object sender, RoutedEventArgs e) {
-			if (Call.active_call != null)
-				Call.active_call.SendToVoicemail();
-		}
-
-		private void btnTransfer_Click(object sender, RoutedEventArgs e) {
-			if (Call.active_call != null)
-				Call.active_call.TransferPrompt();
-
-
-		}
-
-
-	}
-}
+				return;
+			e.Row.ContextMenu = c.CallRightClickMenu();
+
+		}
+		public void SetDialStr(string str) {
+			Dispatcher.BeginInvoke((Action)(() => {
+				txtNumber.Text = str;
+			}));
+		}
+
+		private void CanEndChanged(object sender, bool data) {
+			Dispatcher.BeginInvoke((Action)(() => {
+				btnHangup.IsEnabled = broker.CanEnd;
+			}));
+		}
+		private void SpeakerActiveChanged(object sender, bool data) {
+			Dispatcher.BeginInvoke((Action)(() => {
+				btnSpeaker.Foreground = data ? enabled_brush : disabled_brush;
+			}));
+		}
+		private void MuteChanged(object sender, bool data) {
+			Dispatcher.BeginInvoke((Action)(() => {
+				btnMute.Foreground = data ? enabled_brush : disabled_brush;
+			}));
+		}
+		private void DNDChanged(object sender, bool data) {
+			Dispatcher.BeginInvoke((Action)(() => {
+				btnDND.Foreground = data ? enabled_brush : disabled_brush;
+				Title = "FSClient " + (data ? " - DND" : "");
+			}));
+		}
+		private void CallActiveChanged(object sender, bool data) {
+			Dispatcher.BeginInvoke((Action)(() => {
+				btnHold.IsEnabled = broker.call_active;
+				btnTransfer.IsEnabled = broker.call_active;
+			}));
+
+		}
+
+
+
+		#region TextInput
+
+		private enum TEXT_INPUT_MODE { NUMBERS_ONLY, FULL };
+
+		private TEXT_INPUT_MODE text_mode = TEXT_INPUT_MODE.NUMBERS_ONLY;
+		private void simple_text_mode_char_convert(char c) {
+			if (c == '*' || c == '#' || (c >= '0' && c <= '9')) {
+				broker.handle_key_action(c);
+				return;
+			}
+			switch (Char.ToUpper(c)) {
+				case 'A':
+				case 'B':
+				case 'C':
+					broker.handle_key_action('2');
+					break;
+				case 'D':
+				case 'E':
+				case 'F':
+					broker.handle_key_action('3');
+					break;
+				case 'G':
+				case 'H':
+				case 'I':
+					broker.handle_key_action('4');
+					break;
+				case 'J':
+				case 'K':
+				case 'L':
+					broker.handle_key_action('5');
+					break;
+				case 'M':
+				case 'N':
+				case 'O':
+					broker.handle_key_action('6');
+					break;
+				case 'P':
+				case 'Q':
+				case 'R':
+				case 'S':
+					broker.handle_key_action('7');
+					break;
+				case 'T':
+				case 'U':
+				case 'V':
+					broker.handle_key_action('8');
+					break;
+				case 'W':
+				case 'X':
+				case 'Y':
+				case 'Z':
+					broker.handle_key_action('9');
+					break;
+			}
+		}
+
+		private bool text_interception_enabled = true;
+		void MainWindow_PreviewTextInput(object sender, TextCompositionEventArgs e) {
+			if (!broker.fully_loaded)
+				return;
+			if (!text_interception_enabled) {
+				e.Handled = false;
+				return;
+			}
+			char[] chars = e.Text.ToCharArray();
+			char[] sys_chars = e.ControlText.ToCharArray();
+			foreach (Char c in sys_chars) {
+				if (c == 22) //paste / control + v
+				{
+					String clipboard = Clipboard.GetText();
+					char[] tmp = new char[chars.Length + clipboard.Length];
+					chars.CopyTo(tmp, 0);
+					clipboard.ToCharArray().CopyTo(tmp, chars.Length);
+					chars = tmp;
+				}
+				else if (c == 6){ // control + f
+					txtSearchBox.TextBoxFocus();
+				}
+			}
+
+			e.Handled = false;
+			foreach (Char c in chars) {
+				bool handled = true;
+				if (c > 32 && c < 127) {
+					if (text_mode == TEXT_INPUT_MODE.NUMBERS_ONLY || (Call.active_call != null && Call.active_call.state == Call.CALL_STATE.Answered))
+						simple_text_mode_char_convert(c);
+					else
+						broker.handle_key_action(c);
+
+				}
+				else if (c == '\b')
+					broker.handle_special_action(Broker.KEYBOARD_ACTION.Backspace);
+				else if (c == '\r')
+					broker.handle_special_action(Broker.KEYBOARD_ACTION.Enter);
+				else if (c == 27)
+					broker.handle_special_action(Broker.KEYBOARD_ACTION.Escape);
+				else
+					handled = false;
+				if (handled)
+					e.Handled = true;
+			}
+		}
+		void MainWindow_PreviewKeyDown(object sender, KeyEventArgs e) {
+			if (!broker.fully_loaded)
+				return;
+			if (!text_interception_enabled) {
+				e.Handled = false;
+				return;
+			}
+
+			if (e.Key == Key.Return) {
+				broker.handle_special_action(Broker.KEYBOARD_ACTION.Enter);
+				e.Handled = true;
+			}
+		}
+		#endregion
+		private static MainWindow _instance;
+		public static MainWindow get_instance() {
+			return _instance;
+		}
+
+		private void DialStrChanged(object sender, string data) {
+			SetDialStr(broker.cur_dial_str);
+		}
+		private void CallRingingChanged(object sender, bool data) {
+			Dispatcher.Invoke((Action)(() => {
+				if (data && Call.active_call != null && Call.active_call.CanSendToVoicemail())
+					btnSendVoicemail.Visibility = Visibility.Visible;
+				else
+					btnSendVoicemail.Visibility = Visibility.Hidden;
+			}));
+		}
+		void MainWindow_Loaded(object sender, RoutedEventArgs e) {
+			PreviewTextInput += MainWindow_PreviewTextInput;
+			PreviewKeyDown += MainWindow_PreviewKeyDown; //return must be handled seperately as buttons are triggered on down it seems
+			MouseUp += MainWindow_MouseUp;
+
+			Call.CallStateChanged += CallStateChanged;
+			Call.ActiveCallChanged += ActiveCallChanged;
+			Account.accounts.CollectionChanged += accounts_CollectionChanged;
+			Broker.FreeswitchLoaded += FreeswitchLoaded;
+			broker = Broker.get_instance();
+
+			broker.cur_dial_strChanged += DialStrChanged;
+			broker.call_activeChanged += CallActiveChanged;
+			broker.active_call_ringingChanged += CallRingingChanged;
+			broker.MutedChanged += MuteChanged;
+			broker.DNDChanged += DNDChanged;
+			broker.CanEndChanged += CanEndChanged;
+			broker.UseNumberOnlyInputChanged += UseNumberOnlyInputChanged;
+			UseNumberOnlyInputChanged(null, false);//trigger an update
+			broker.SpeakerphoneActiveChanged += SpeakerActiveChanged;
+			CurrentCallInfo.Visibility = Visibility.Hidden;
+			Windows.systray_icon_setup();
+		}
+
+		void MainWindow_MouseUp(object sender, MouseButtonEventArgs e) {
+			if (txtSearchBox.TextBoxHasFocus()){
+				DependencyObject parent = e.OriginalSource as UIElement;
+				while (parent != null && !(parent is OurAutoCompleteBox)) 
+					parent = VisualTreeHelper.GetParent(parent);
+				if (parent == null)
+					RemoveFocus();
+			}
+
+		}
+
+		public void RemoveFocus(){
+			btnMute.Focus(); //should really divert focus a better way
+		}
+
+
+
+		private void FreeswitchLoaded(object sender, EventArgs e) {
+			Dispatcher.BeginInvoke((Action)(() => {
+				busyAnimation.Visibility = Visibility.Hidden;
+			}));
+		}
+
+
+
+		private void UseNumberOnlyInputChanged(object sender, bool data) {
+			text_mode = broker.UseNumberOnlyInput ? TEXT_INPUT_MODE.NUMBERS_ONLY : TEXT_INPUT_MODE.FULL;
+		}
+
+		public void BringToFront() {
+			Show();
+			BringIntoView();
+			WindowState = WindowState.Normal;
+			Topmost = true;
+			Topmost = false;
+		}
+		private void btnCall_Click(object sender, RoutedEventArgs e) {
+			broker.TalkPressed();
+
+		}
+
+		private void btnOptions_Click(object sender, RoutedEventArgs e) {
+			Options opt = new Options();
+			opt.ShowDialog();
+		}
+
+		private void btnHangup_Click(object sender, RoutedEventArgs e) {
+			broker.HangupPressed();
+		}
+
+		private void gridCalls_MouseDoubleClick(object sender, MouseButtonEventArgs e) {
+			FrameworkElement elem = e.OriginalSource as FrameworkElement;
+			if (elem == null)
+				return;
+			Call call = elem.DataContext as Call;
+			if (call == null)
+				return;
+			call.DefaultAction();
+		}
+
+		SolidColorBrush enabled_brush = new SolidColorBrush(Colors.Yellow);
+		SolidColorBrush disabled_brush = new SolidColorBrush(Colors.White);
+		private void btnMute_Click(object sender, RoutedEventArgs e) {
+			broker.Muted = !broker.Muted;
+		}
+
+		private void btnDND_Click(object sender, RoutedEventArgs e) {
+			broker.DND = !broker.DND;
+		}
+		private void gridAccounts_MouseUp(object sender, MouseButtonEventArgs e) {
+			FrameworkElement elem = e.OriginalSource as FrameworkElement;
+			if (elem == null)
+				return;
+			Account account = elem.DataContext as Account;
+			if (account == null)
+				return;
+			DependencyObject dep = elem;
+			while (dep != null && !(dep is DataGridCell)) {
+				dep = VisualTreeHelper.GetParent(dep);
+			}
+			DataGridCell cell = dep as DataGridCell;
+			if (cell == null)
+				return;
+
+			if (cell.Column.SortMemberPath == "enabled") {
+				account.enabled = !account.enabled;
+				account.ReloadAccount();
+			}
+		}
+
+		private void Window_Closing(object sender, CancelEventArgs e) {
+			try {
+				Windows.systray_icon_remove();
+				broker.Dispose();
+			}
+			catch{ }
+		}
+
+		private void btnSpeaker_Click(object sender, RoutedEventArgs e) {
+			broker.SpeakerphoneActive = !broker.SpeakerphoneActive;
+		}
+
+
+		private void AccountNew_Click(object sender, RoutedEventArgs e) {
+			Account acct = new Account();
+			Account.AddAccount(acct);
+			acct.edit();
+
+		}
+
+		private void AccountEdit_Click(object sender, RoutedEventArgs e) {
+			Account acct = gridAccounts.SelectedItem as Account;
+			if (acct == null)
+				return;
+			acct.edit();
+		}
+
+		private void AccountSetDefault_Click(object sender, RoutedEventArgs e) {
+			Account acct = gridAccounts.SelectedItem as Account;
+			if (acct == null)
+				return;
+			acct.is_default_account = true;
+		}
+
+		private void AccountDelete_Click(object sender, RoutedEventArgs e) {
+			Account acct = gridAccounts.SelectedItem as Account;
+			if (acct == null)
+				return;
+			Account.accounts.Remove(acct);
+		}
+
+
+		private void gridAccounts_ContextMenuOpening(object sender, ContextMenuEventArgs e) {
+			menuAccountDelete.IsEnabled = menuAccountEdit.IsEnabled = menuAccountSetDefault.IsEnabled = gridAccounts.SelectedItem != null;
+		}
+
+		private void btnDialpad_Click(object sender, RoutedEventArgs e) {
+			Button btn = sender as Button;
+			if (btn != null)
+				broker.handle_key_action(btn.Content.ToString()[0]);
+			PhonePadButton btn2 = sender as PhonePadButton;
+			if (btn2 != null)
+				broker.handle_key_action(btn2.Number[0]);
+
+		}
+
+		private void btnHold_Click(object sender, RoutedEventArgs e) {
+			if (Call.active_call != null)
+				Call.active_call.hold();
+		}
+
+		private void btnSendVoicemail_Click(object sender, RoutedEventArgs e) {
+			if (Call.active_call != null)
+				Call.active_call.SendToVoicemail();
+		}
+
+		private void btnTransfer_Click(object sender, RoutedEventArgs e) {
+			if (Call.active_call != null)
+				Call.active_call.TransferPrompt();
+
+
+		}
+		#region ContactSearchBox
+		public OurAutoCompleteBox GetContactSearchBox() {
+			return txtSearchBox;
+		}
+
+		private void txtSearchBox_GotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) {
+			text_interception_enabled = false;
+			txtSearchBox.Opacity = 1;
+			if (txtSearchBox.Text == "Contact Search")
+				txtSearchBox.Text = "";
+		}
+
+		private void txtSearchBox_LostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) {
+			text_interception_enabled = true;
+			txtSearchBox.Opacity = 0.8;
+
+			if (String.IsNullOrWhiteSpace(txtSearchBox.Text))
+				txtSearchBox.Text = "Contact Search";
+		}
+
+		private bool ContactMenuOpen;
+		private void contactSearchConextMenu_Closed(object sender, RoutedEventArgs e) {
+			ContactMenuOpen = false;
+			txtSearchBox.IsDropDownOpen = false;
+		}
+
+		private void contactSearchConextMenu_Loaded(object sender, RoutedEventArgs e) {
+			ContactMenuOpen = true;
+		}
+
+		private void txtSearchBox_DropDownClosing(object sender, RoutedPropertyChangingEventArgs<bool> e) {
+			if (ContactMenuOpen)
+				e.Cancel = true;
+		}
+		#endregion
+	}
+}
diff --git a/mitchcapper/FSClient/SimpleContactPluginBase.cs b/mitchcapper/FSClient/SimpleContactPluginBase.cs
index 6a92a79..bcf73d1 100644
--- a/mitchcapper/FSClient/SimpleContactPluginBase.cs
+++ b/mitchcapper/FSClient/SimpleContactPluginBase.cs
@@ -1,6 +1,10 @@
 using System;
-using System.Collections.Generic;
+using System.Collections.Generic;
+using System.Linq;
+using System.Windows;
 using System.Windows.Controls;
+using System.Windows.Input;
+using FSClient.Controls;
 
 namespace FSClient
 {
@@ -8,9 +12,9 @@ namespace FSClient
 	{
 		protected abstract void _TryResolveNewNumber(string number, NumberResolved on_resolved);
 		protected abstract void LoadDatabase(ref Dictionary<string, string> number_to_alias_db);
-		protected abstract void UpdateDatabase(string number, string alias);
-
-
+		protected abstract void UpdateDatabase(string number, string alias);
+
+
 		protected virtual void ModifyRightClickMenu(Call call, ContextMenu menu)
 		{
 			return;
@@ -30,26 +34,65 @@ namespace FSClient
 			return "";
 		}
 
-		protected Dictionary<string, string> number_to_alias = new Dictionary<string, string>();
-
+		protected Dictionary<string, string> number_to_alias = new Dictionary<string, string>();
+
 		public override void CallRightClickMenu(Call call, ContextMenu menu) {
 			MenuItem item = new MenuItem();
 			item.Click += item_Click;
 			item.Header = "Edit Contact";
-			menu.Items.Add(item);
+			menu.Items.Add(item);
 			ModifyRightClickMenu(call, menu);
 		}
 
-		protected void item_Click(object sender, System.Windows.RoutedEventArgs e)
+		public override IEnumerable<MenuItem> ContactRightClickMenu(){
+			List<MenuItem> items = new List<MenuItem>();
+			MenuItem item = new MenuItem();
+			item.Click += item_Click;
+			item.Header = "Edit Contact";
+			items.Add(item);
+			item = new MenuItem();
+			item.Click +=contact_call_click;
+			item.Header = "Call";
+			items.Add(item);
+			return items;
+		}
+
+		private void contact_call_click(object sender, RoutedEventArgs e){
+			MenuItem item = sender as MenuItem;
+			if (item == null)
+				return;
+
+			SearchAutoCompleteEntry entry = item.DataContext as SearchAutoCompleteEntry ?? search_box.SelectedItem as SearchAutoCompleteEntry;
+			if (entry == null)
+				return;
+			Broker.get_instance().DialString(entry.number);
+		}
+
+		protected void item_Click(object sender, RoutedEventArgs e)
 		{
 			MenuItem item = sender as MenuItem;
 			if (item == null)
 				return;
+			String number;
+			String default_edit_value;
+
 			Call c = item.DataContext as Call;
-			if (c == null)
-				return;
-			String number = NormalizeNumber(c.other_party_number);
-			String alias = InputBox.GetInput("Editing Contact", "Edit alias for number: " + number, DefaultEditValue(c));
+			if (c != null){
+				number = c.other_party_number;
+				default_edit_value = DefaultEditValue(c);
+			}
+			else{
+				SearchAutoCompleteEntry entry = item.DataContext as SearchAutoCompleteEntry ?? search_box.SelectedItem as SearchAutoCompleteEntry;
+
+				if (entry == null)
+					return;
+				number = entry.number;
+				default_edit_value = entry.alias;
+			}
+
+			String orig_number = number;
+			number = NormalizeNumber(number);
+			String alias = InputBox.GetInput("Editing Contact", "Edit alias for number: " + number, default_edit_value);
 			alias = IsValidAlias(alias);
 			if (alias == null)
 				return;
@@ -58,11 +101,12 @@ namespace FSClient
 
 			foreach (Call call in Call.calls)
 			{
-				if (c.other_party_number == call.other_party_number)
-					c.other_party_name = alias;
+				if (orig_number == call.other_party_number || number == call.other_party_number)
+					call.other_party_name = alias;
 			}
 
 			UpdateDatabase(number, alias);
+			refresh_search_box();
 		}
 		public override void ResolveNumber(string number, NumberResolved on_resolved)
 		{
@@ -78,8 +122,69 @@ namespace FSClient
 		public override void Initialize()
 		{
 			LoadDatabase(ref number_to_alias);
+	
+			refresh_search_box();
+		}
+		protected void refresh_search_box(){
+			if (search_box == null)
+				return;
+			search_box.ItemsSource = from c in number_to_alias select new SearchAutoCompleteEntry(c.Key,c.Value);
+		}
+		protected class SearchAutoCompleteEntry{
+			public string number;
+			public string alias;
+			public string display_name;
+			public SearchAutoCompleteEntry(String number, String alias){
+				this.number = number;
+				this.alias = alias;
+				if (String.IsNullOrWhiteSpace(alias) || number == alias)
+					display_name = number;
+				else
+					display_name = alias + " - " + number;
+			}
+			public override string ToString(){
+				return display_name;
+			}
+		}
+		protected void search_box_PreviewKeyUp(object sender, KeyEventArgs e){
+			if (e.Key == Key.Enter){
+				call_current_contact();
+			}
+		}
 
+		protected OurAutoCompleteBox search_box;
+		private TextBox real_search_box;
+		public override bool HandleSearchBox(OurAutoCompleteBox box) {
+			search_box = box;
+
+			real_search_box = search_box.GetActualTextbox();
+			real_search_box.ContextMenu = new ContextMenu();
+			real_search_box.ContextMenuOpening += search_box_ContextMenuOpening;
+			
+			foreach (MenuItem item in ContactRightClickMenu()){
+				real_search_box.ContextMenu.Items.Add(item);
+			}
+			
+			search_box.PreviewKeyUp += search_box_PreviewKeyUp;
+			search_box.MouseDoubleClick += search_box_MouseDoubleClick;
+			if (number_to_alias.Count > 0)
+				refresh_search_box();
+			return true;
+		}
+		protected void call_current_contact(){
+			SearchAutoCompleteEntry entry = search_box.SelectedItem as SearchAutoCompleteEntry;
+			if (entry != null)
+				Broker.get_instance().DialString(entry.number);
+		}
+		void search_box_MouseDoubleClick(object sender, MouseButtonEventArgs e){
+			call_current_contact();
 		}
 
+		void search_box_ContextMenuOpening(object sender, ContextMenuEventArgs e){
+			if (search_box.SelectedItem == null)
+				real_search_box.ContextMenu.Visibility = Visibility.Hidden;
+			else
+				real_search_box.ContextMenu.Visibility = Visibility.Visible;
+		}
 	}
 }

commit 007d9a09df8e52d540e46eb009b44f69121fc275
Author: Jeff Lenk <jeff at jefflenk.com>
Date:   Tue Feb 1 19:46:14 2011 -0600

    remove passthrough codecs and align files with setup

diff --git a/mitchcapper/FSClient/External Items/conf/freeswitch.xml b/mitchcapper/FSClient/External Items/conf/freeswitch.xml
index e2afea6..a297f69 100644
--- a/mitchcapper/FSClient/External Items/conf/freeswitch.xml	
+++ b/mitchcapper/FSClient/External Items/conf/freeswitch.xml	
@@ -55,8 +55,6 @@
                                 <load module="mod_dptools"/>
                                 <load module="mod_dialplan_xml"/>
 								<load module="mod_spandsp"/>
-								<load module="mod_g723_1"/>
-								<load module="mod_amr"/>
                                 <load module="mod_ilbc"/>
                                 <load module="mod_speex"/>
 								<load module="mod_siren"/>
diff --git a/mitchcapper/FSClient/FSClient.csproj b/mitchcapper/FSClient/FSClient.csproj
index a29cb51..f4e250c 100644
--- a/mitchcapper/FSClient/FSClient.csproj
+++ b/mitchcapper/FSClient/FSClient.csproj
@@ -240,7 +240,6 @@ if exist "%25FREESWITCH_SRC_LOCATION%25" copy "%25FREESWITCH_SRC_LOCATION%25\"Wi
 if exist "%25FREESWITCH_SRC_LOCATION%25" copy "%25FREESWITCH_SRC_LOCATION%25\"Win32\$(ConfigurationName)\mod\mod_sofia.dll .\mod
 if exist "%25FREESWITCH_SRC_LOCATION%25" copy "%25FREESWITCH_SRC_LOCATION%25\"Win32\$(ConfigurationName)\mod\mod_speex.dll .\mod
 if exist "%25FREESWITCH_SRC_LOCATION%25" copy "%25FREESWITCH_SRC_LOCATION%25\"Win32\$(ConfigurationName)\mod\mod_tone_stream.dll .\mod
-if exist "%25FREESWITCH_SRC_LOCATION%25" copy "%25FREESWITCH_SRC_LOCATION%25\"Win32\$(ConfigurationName)\mod\mod_h26x.dll .\mod
 if exist "%25FREESWITCH_SRC_LOCATION%25" copy "%25FREESWITCH_SRC_LOCATION%25\"Win32\$(ConfigurationName)\mod\mod_silk.dll .\mod
 if exist "%25FREESWITCH_SRC_LOCATION%25" copy "%25FREESWITCH_SRC_LOCATION%25\"Win32\$(ConfigurationName)\mod\mod_bv.dll .\mod
 
diff --git a/mitchcapper/FSClient/Setup/FSCore.wxs b/mitchcapper/FSClient/Setup/FSCore.wxs
index 7e1b42b..ac22889 100644
--- a/mitchcapper/FSClient/Setup/FSCore.wxs
+++ b/mitchcapper/FSClient/Setup/FSCore.wxs
@@ -62,7 +62,6 @@
         <ComponentRef Id="cmp7F1E9A4820D7ABC50BB56176F1C5C203"/>
         <ComponentRef Id="cmpB1F423B56230E52C4F261BB0A2D31A50"/>
         <ComponentRef Id="cmpED6FDBCCBE7E25A518A406A7EEBF19E7"/>
-        <ComponentRef Id="cmpC32E981DE1987696848505946E7E40C7"/>
         <ComponentRef Id="cmpBEC9C50CA6BEA1BDAA538AC014270ACA"/>
         <ComponentRef Id="cmp484B206DD9362CCE151AE281DC2B9653"/>
         <ComponentRef Id="cmp57A16823D68C54AF4DD1BEF68206C2E6"/>
@@ -98,9 +97,6 @@
             <Component Id="cmpED6FDBCCBE7E25A518A406A7EEBF19E7" Guid="*">
                 <File Id="fil2D28C6A5674AFCA7F9F1E06EEB33E823" KeyPath="yes" Source="$(var.FSClient.TargetDir)\mod\mod_event_socket.dll" />
             </Component>
-            <Component Id="cmpC32E981DE1987696848505946E7E40C7" Guid="*">
-                <File Id="filD5487CAC6CE60107178EA7AD41CDDA31" KeyPath="yes" Source="$(var.FSClient.TargetDir)\mod\mod_h26x.dll" />
-            </Component>
             <Component Id="cmpBEC9C50CA6BEA1BDAA538AC014270ACA" Guid="*">
                 <File Id="fil623B81F2BE4376CCA8C66EDB2EA2EBA8" KeyPath="yes" Source="$(var.FSClient.TargetDir)\mod\mod_ilbc.dll" />
             </Component>

commit f3c9f291d9c4854ff8c17e81552d9ed2a4c3b1e5
Author: Jeff Lenk <jeff at jefflenk.com>
Date:   Tue Feb 1 19:14:59 2011 -0600

    change project output paths
    add buildevents to copy fs depends if FREESWITCH_SRC_LOCATION environment variable is set

diff --git a/mitchcapper/FSClient/FSClient.csproj b/mitchcapper/FSClient/FSClient.csproj
index 8681ee7..a29cb51 100644
--- a/mitchcapper/FSClient/FSClient.csproj
+++ b/mitchcapper/FSClient/FSClient.csproj
@@ -21,13 +21,28 @@
     <SccLocalPath>SAK</SccLocalPath>
     <SccAuxPath>SAK</SccAuxPath>
     <SccProvider>SAK</SccProvider>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
     <PlatformTarget>x86</PlatformTarget>
     <DebugSymbols>true</DebugSymbols>
     <DebugType>full</DebugType>
     <Optimize>false</Optimize>
-    <OutputPath>working\</OutputPath>
+    <OutputPath>bin\Debug\</OutputPath>
     <DefineConstants>DEBUG;TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
@@ -172,7 +187,69 @@
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </Resource>
   </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include=".NETFramework,Version=v4.0,Profile=Client">
+      <Visible>False</Visible>
+      <ProductName>Microsoft .NET Framework 4 Client Profile %28x86 and x64%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PostBuildEvent>if exist "%25FREESWITCH_SRC_LOCATION%25" copy "%25FREESWITCH_SRC_LOCATION%25\"Win32\$(ConfigurationName)\FreeSwitch.dll .
+if exist "%25FREESWITCH_SRC_LOCATION%25" copy "%25FREESWITCH_SRC_LOCATION%25\"Win32\$(ConfigurationName)\libapr.dll .
+if exist "%25FREESWITCH_SRC_LOCATION%25" copy "%25FREESWITCH_SRC_LOCATION%25\"Win32\$(ConfigurationName)\libaprutil.dll .
+if exist "%25FREESWITCH_SRC_LOCATION%25" copy "%25FREESWITCH_SRC_LOCATION%25\"Win32\$(ConfigurationName)\libbroadvoice.dll .
+if exist "%25FREESWITCH_SRC_LOCATION%25" copy "%25FREESWITCH_SRC_LOCATION%25\"Win32\$(ConfigurationName)\libspandsp.dll .
+if exist "%25FREESWITCH_SRC_LOCATION%25" copy "%25FREESWITCH_SRC_LOCATION%25\"Win32\$(ConfigurationName)\libteletone.dll .
+if exist "%25FREESWITCH_SRC_LOCATION%25" copy "%25FREESWITCH_SRC_LOCATION%25\"Win32\$(ConfigurationName)\libeay32.dll .
+if exist "%25FREESWITCH_SRC_LOCATION%25" copy "%25FREESWITCH_SRC_LOCATION%25\"Win32\$(ConfigurationName)\ssleay32.dll .
+if exist "%25FREESWITCH_SRC_LOCATION%25" copy "%25FREESWITCH_SRC_LOCATION%25\"Win32\$(ConfigurationName)\pthread.dll .
+
+if not exist ".\mod" md mod
+if exist "%25FREESWITCH_SRC_LOCATION%25" copy "%25FREESWITCH_SRC_LOCATION%25\"Win32\$(ConfigurationName)\mod\mod_managed.dll .
+if exist "%25FREESWITCH_SRC_LOCATION%25" copy "%25FREESWITCH_SRC_LOCATION%25\"Win32\$(ConfigurationName)\mod\mod_spandsp.dll .\mod
+if exist "%25FREESWITCH_SRC_LOCATION%25" copy "%25FREESWITCH_SRC_LOCATION%25\"Win32\$(ConfigurationName)\mod\mod_celt.dll .\mod
+if exist "%25FREESWITCH_SRC_LOCATION%25" copy "%25FREESWITCH_SRC_LOCATION%25\"Win32\$(ConfigurationName)\mod\mod_commands.dll .\mod
+if exist "%25FREESWITCH_SRC_LOCATION%25" copy "%25FREESWITCH_SRC_LOCATION%25\"Win32\$(ConfigurationName)\mod\mod_console.dll .\mod
+if exist "%25FREESWITCH_SRC_LOCATION%25" copy "%25FREESWITCH_SRC_LOCATION%25\"Win32\$(ConfigurationName)\mod\mod_dialplan_xml.dll .\mod
+if exist "%25FREESWITCH_SRC_LOCATION%25" copy "%25FREESWITCH_SRC_LOCATION%25\"Win32\$(ConfigurationName)\mod\mod_dptools.dll .\mod
+if exist "%25FREESWITCH_SRC_LOCATION%25" copy "%25FREESWITCH_SRC_LOCATION%25\"Win32\$(ConfigurationName)\mod\mod_event_socket.dll .\mod
+if exist "%25FREESWITCH_SRC_LOCATION%25" copy "%25FREESWITCH_SRC_LOCATION%25\"Win32\$(ConfigurationName)\mod\mod_ilbc.dll .\mod
+if exist "%25FREESWITCH_SRC_LOCATION%25" copy "%25FREESWITCH_SRC_LOCATION%25\"Win32\$(ConfigurationName)\mod\mod_logfile.dll .\mod
+if exist "%25FREESWITCH_SRC_LOCATION%25" copy "%25FREESWITCH_SRC_LOCATION%25\"Win32\$(ConfigurationName)\mod\mod_local_stream.dll .\mod
+if exist "%25FREESWITCH_SRC_LOCATION%25" copy "%25FREESWITCH_SRC_LOCATION%25\"Win32\$(ConfigurationName)\mod\mod_loopback.dll .\mod
+if exist "%25FREESWITCH_SRC_LOCATION%25" copy "%25FREESWITCH_SRC_LOCATION%25\"Win32\$(ConfigurationName)\mod\mod_PortAudio.dll .\mod
+if exist "%25FREESWITCH_SRC_LOCATION%25" copy "%25FREESWITCH_SRC_LOCATION%25\"Win32\$(ConfigurationName)\mod\mod_siren.dll .\mod
+if exist "%25FREESWITCH_SRC_LOCATION%25" copy "%25FREESWITCH_SRC_LOCATION%25\"Win32\$(ConfigurationName)\mod\mod_sndfile.dll .\mod
+if exist "%25FREESWITCH_SRC_LOCATION%25" copy "%25FREESWITCH_SRC_LOCATION%25\"Win32\$(ConfigurationName)\mod\mod_sofia.dll .\mod
+if exist "%25FREESWITCH_SRC_LOCATION%25" copy "%25FREESWITCH_SRC_LOCATION%25\"Win32\$(ConfigurationName)\mod\mod_speex.dll .\mod
+if exist "%25FREESWITCH_SRC_LOCATION%25" copy "%25FREESWITCH_SRC_LOCATION%25\"Win32\$(ConfigurationName)\mod\mod_tone_stream.dll .\mod
+if exist "%25FREESWITCH_SRC_LOCATION%25" copy "%25FREESWITCH_SRC_LOCATION%25\"Win32\$(ConfigurationName)\mod\mod_h26x.dll .\mod
+if exist "%25FREESWITCH_SRC_LOCATION%25" copy "%25FREESWITCH_SRC_LOCATION%25\"Win32\$(ConfigurationName)\mod\mod_silk.dll .\mod
+if exist "%25FREESWITCH_SRC_LOCATION%25" copy "%25FREESWITCH_SRC_LOCATION%25\"Win32\$(ConfigurationName)\mod\mod_bv.dll .\mod
+
+if not exist ".\conf" md conf
+copy ..\..\"external items"\conf\freeswitch.xml .\conf</PostBuildEvent>
+  </PropertyGroup>
+  <PropertyGroup>
+    <PreBuildEvent>if exist "%25FREESWITCH_SRC_LOCATION%25" copy  %25FREESWITCH_SRC_LOCATION%25\Win32\$(ConfigurationName)\mod\FreeSWITCH.Managed.dll ..\..\"external items"</PreBuildEvent>
+  </PropertyGroup>
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
        Other similar extension points exist, see Microsoft.Common.targets.
   <Target Name="BeforeBuild">
diff --git a/mitchcapper/FSClient/JabraHeadset/JabraHeadset.csproj b/mitchcapper/FSClient/JabraHeadset/JabraHeadset.csproj
index 4908229..103d468 100644
--- a/mitchcapper/FSClient/JabraHeadset/JabraHeadset.csproj
+++ b/mitchcapper/FSClient/JabraHeadset/JabraHeadset.csproj
@@ -22,7 +22,7 @@
     <DebugSymbols>true</DebugSymbols>
     <DebugType>full</DebugType>
     <Optimize>false</Optimize>
-    <OutputPath>..\working\plugins\</OutputPath>
+    <OutputPath>..\bin\Debug\plugins\</OutputPath>
     <DefineConstants>DEBUG;TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
@@ -31,7 +31,7 @@
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <DebugType>pdbonly</DebugType>
     <Optimize>true</Optimize>
-    <OutputPath>bin\Release\</OutputPath>
+    <OutputPath>..\bin\Release\plugins\</OutputPath>
     <DefineConstants>TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
diff --git a/mitchcapper/FSClient/PlantronicsHeadset/PlantronicsHeadset.csproj b/mitchcapper/FSClient/PlantronicsHeadset/PlantronicsHeadset.csproj
index 9a434b5..36099a7 100644
--- a/mitchcapper/FSClient/PlantronicsHeadset/PlantronicsHeadset.csproj
+++ b/mitchcapper/FSClient/PlantronicsHeadset/PlantronicsHeadset.csproj
@@ -23,7 +23,7 @@
     <DebugSymbols>true</DebugSymbols>
     <DebugType>full</DebugType>
     <Optimize>false</Optimize>
-    <OutputPath>..\working\plugins\</OutputPath>
+    <OutputPath>..\bin\Debug\plugins\</OutputPath>
     <DefineConstants>DEBUG;TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
@@ -32,7 +32,7 @@
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <DebugType>pdbonly</DebugType>
     <Optimize>true</Optimize>
-    <OutputPath>bin\Release\</OutputPath>
+    <OutputPath>..\bin\Release\plugins\</OutputPath>
     <DefineConstants>TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
diff --git a/mitchcapper/FSClient/SimpleXmlContactPlugin/SimpleXmlContactPlugin.csproj b/mitchcapper/FSClient/SimpleXmlContactPlugin/SimpleXmlContactPlugin.csproj
index a05acb1..1d3756f 100644
--- a/mitchcapper/FSClient/SimpleXmlContactPlugin/SimpleXmlContactPlugin.csproj
+++ b/mitchcapper/FSClient/SimpleXmlContactPlugin/SimpleXmlContactPlugin.csproj
@@ -21,7 +21,7 @@
     <DebugSymbols>true</DebugSymbols>
     <DebugType>full</DebugType>
     <Optimize>false</Optimize>
-    <OutputPath>..\working\plugins\</OutputPath>
+    <OutputPath>..\bin\Debug\plugins\</OutputPath>
     <DefineConstants>DEBUG;TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
@@ -29,7 +29,7 @@
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <DebugType>pdbonly</DebugType>
     <Optimize>true</Optimize>
-    <OutputPath>bin\Release\</OutputPath>
+    <OutputPath>..\bin\Release\plugins\</OutputPath>
     <DefineConstants>TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>

-----------------------------------------------------------------------

Summary of changes:
 mitchcapper/FSClient/Broker.cs                     |   58 +-
 .../FSClient/Controls/OurAutoCompleteBox.cs        |   32 +
 .../FSClient/External Items/conf/freeswitch.xml    |    2 -
 mitchcapper/FSClient/FSClient.csproj               |   83 ++-
 mitchcapper/FSClient/IContactPlugin.cs             |   55 +-
 .../FSClient/JabraHeadset/JabraHeadset.csproj      |    4 +-
 mitchcapper/FSClient/MainWindow.xaml               |   22 +-
 mitchcapper/FSClient/MainWindow.xaml.cs            |  856 +++++++++++---------
 .../PlantronicsHeadset/PlantronicsHeadset.csproj   |    4 +-
 mitchcapper/FSClient/README.txt                    |    2 +-
 mitchcapper/FSClient/Setup/FSClient.wxs            |    4 +
 mitchcapper/FSClient/Setup/FSCore.wxs              |    6 +-
 mitchcapper/FSClient/Setup/Setup.wixproj           |    4 +
 mitchcapper/FSClient/SimpleContactPluginBase.cs    |  132 +++-
 .../SimpleXmlContactPlugin.csproj                  |    4 +-
 mitchcapper/FSClient/Sofia.cs                      |    2 +-
 mitchcapper/FSClient/TODO.txt                      |    2 -
 17 files changed, 806 insertions(+), 466 deletions(-)
 create mode 100644 mitchcapper/FSClient/Controls/OurAutoCompleteBox.cs


hooks/post-receive
-- 
FreeSWITCH user-contributed scripts, etc



More information about the Freeswitch-trunk mailing list