From 6fb23384eb1ae7b87ed6a60d9410101abe4372d6 Mon Sep 17 00:00:00 2001
From: "renater.salaun" <renater.salaun@047e039d-479c-447e-8a29-aa6bf4a09bab>
Date: Tue, 28 Oct 2014 13:15:15 +0000
Subject: [PATCH] Add autocompletion for SP selection menu Using autocomplete
 JQuery UI widget : http://jqueryui.com/autocomplete/

git-svn-id: https://svn.geant.net/GEANT/edugain_testidp_account_manager/trunk@46 047e039d-479c-447e-8a29-aa6bf4a09bab
---
 templates/web/account_wizard.tt2.html |  12 +-
 templates/web/index.tt2.html          | 165 ++++++++++++++++++++++++++
 2 files changed, 175 insertions(+), 2 deletions(-)

diff --git a/templates/web/account_wizard.tt2.html b/templates/web/account_wizard.tt2.html
index 60501f0..657c469 100644
--- a/templates/web/account_wizard.tt2.html
+++ b/templates/web/account_wizard.tt2.html
@@ -88,6 +88,13 @@ jQuery(document).ready(function($){
 
 });
 
+$(function() {
+    $( "#sp_entityid" ).combobox();
+    $( "#toggle" ).click(function() {
+        $( "#combobox" ).toggle();
+    });
+});
+
 </script>
 
 
@@ -103,7 +110,9 @@ This Test Identity Provider allows you to create test accounts with different pr
 in eduGAIN inter-federation. Note that only a Service Provider administrator can create accounts here.
 <br/><br/>
 
-<label for="sp_entityid">Please select your Service Provider below</label>
+<label for="sp_entityid">Please select your Service Provider in the list below:</label><br/>
+(Note that a search is performed while you type the SP name)<br/>
+
     
     <select id="sp_entityid" name="sp_entityid" class="required">
         <option value="">Select your Service Provider below</option>
@@ -113,7 +122,6 @@ in eduGAIN inter-federation. Note that only a Service Provider administrator can
     </select>
     <br/>
 </div>
-
 </fieldset>
 
 <h3>Send email challenge</h3>
diff --git a/templates/web/index.tt2.html b/templates/web/index.tt2.html
index ec40cf3..e722136 100644
--- a/templates/web/index.tt2.html
+++ b/templates/web/index.tt2.html
@@ -45,6 +45,137 @@ function hide(div) {
     oDiv.style.display = "none";
 }
 
+jQuery(document).ready(function($){
+
+    $.widget( "custom.combobox", {
+        _create: function() {
+            this.wrapper = $( "<span>" )
+            .addClass( "custom-combobox" )
+            .insertAfter( this.element );
+
+            this.element.hide();
+            this._createAutocomplete();
+            this._createShowAllButton();
+        },
+
+        _createAutocomplete: function() {
+            var selected = this.element.children( ":selected" ),
+                value = selected.val() ? selected.text() : "";
+
+            this.input = $( "<input>" )
+                .appendTo( this.wrapper )
+                .val( value )
+                .attr( "title", "" )
+                .addClass( "custom-combobox-input ui-widget ui-widget-content ui-state-default ui-corner-left" )
+                .autocomplete({
+                    delay: 0,
+                    minLength: 0,
+                    source: $.proxy( this, "_source" )
+                })
+                .tooltip({
+                    tooltipClass: "ui-state-highlight"
+            });
+
+            this._on( this.input, {
+                autocompleteselect: function( event, ui ) {
+                    ui.item.option.selected = true;
+                    this._trigger( "select", event, {
+                        item: ui.item.option
+                    });
+                },
+ 
+                autocompletechange: "_removeIfInvalid"
+            });
+        },
+
+        _createShowAllButton: function() {
+            var input = this.input,
+            wasOpen = false;
+    
+            $( "<a>" )
+                .attr( "tabIndex", -1 )
+                .attr( "title", "Show All Items" )
+                .tooltip()
+                .appendTo( this.wrapper )
+                .button({
+                    icons: {
+                        primary: "ui-icon-triangle-1-s"
+                    },
+                    text: false
+                })
+                .removeClass( "ui-corner-all" )
+                .addClass( "custom-combobox-toggle ui-corner-right" )
+                .mousedown(function() {
+                    wasOpen = input.autocomplete( "widget" ).is( ":visible" );
+                })
+                .click(function() {
+                    input.focus();
+            
+                    // Close if already visible
+                    if ( wasOpen ) {
+                    return;
+                    }
+            
+                    // Pass empty string as value to search for, displaying all results
+                    input.autocomplete( "search", "" );
+                });
+        },
+        
+        _source: function( request, response ) {
+            var matcher = new RegExp( $.ui.autocomplete.escapeRegex(request.term), "i" );
+            response( this.element.children( "option" ).map(function() {
+                var text = $( this ).text();
+                if ( this.value && ( !request.term || matcher.test(text) ) )
+                    return {
+                        label: text,
+                        value: text,
+                        option: this
+                    };
+            }) );
+        },
+        
+        _removeIfInvalid: function( event, ui ) {
+ 
+            // Selected an item, nothing to do
+            if ( ui.item ) {
+                return;
+            }
+
+            // Search for a match (case-insensitive)
+            var value = this.input.val(),
+                valueLowerCase = value.toLowerCase(),
+                valid = false;
+            this.element.children( "option" ).each(function() {
+                if ( $( this ).text().toLowerCase() === valueLowerCase ) {
+                    this.selected = valid = true;
+                    return false;
+                }
+            });
+            
+            // Found a match, nothing to do
+            if ( valid ) {
+                return;
+            }
+            
+            // Remove invalid value
+            this.input
+                .val( "" )
+                .attr( "title", value + " didn't match any item" )
+                .tooltip( "open" );
+            this.element.val( "" );
+            this._delay(function() {
+                this.input.tooltip( "close" ).attr( "title", "" );
+            }, 2500 );
+            this.input.autocomplete( "instance" ).term = "";
+        },
+
+        _destroy: function() {
+            this.wrapper.remove();
+            this.element.show();
+        }
+    });
+})( jQuery );
+
 //-->      
 </SCRIPT>
 
@@ -65,6 +196,40 @@ div.important{border-style:solid;border-color:black;border-width:1px;background-
 .scrollable{overflow-y: scroll;}
 fieldset.scrollable{height: 75%;}
 .wizard .content div.radio_inline input[type="radio"]{display: inline;}
+
+.custom-combobox {
+    position: relative;
+    display: inline-block;
+}
+.custom-combobox-toggle {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    margin-left: -1px;
+    padding: 0;
+}
+.custom-combobox-input {
+    margin: 0;
+    padding: 5px 10px;
+    padding-left: 40px;
+    width: 600px;
+
+}
+
+.ui-autocomplete {
+		max-height: 400px;
+		overflow-y: auto;
+		/* prevent horizontal scrollbar */
+		overflow-x: hidden;
+}
+/* IE 6 doesn't support max-height
+* we use height instead, but this forces the menu to always be this tall
+*/
+* html .ui-autocomplete {
+  height: 400px;
+}
+
+	
 --></STYLE>
 <title> [% PROCESS 'templates/web/title.tt2.html' %] </title>
 
-- 
GitLab