fastscroll: add a routine for finding a substitution divider
authorWoosung Sohn <woosungim.sohn@samsung.com>
Wed, 29 May 2013 06:38:58 +0000 (15:38 +0900)
committerhc7.choi <hc7choi@hc7.choi>
Fri, 31 May 2013 09:02:56 +0000 (18:02 +0900)
Currently when a user selects a string index in a fastscroll,
and if there's no group divider matched with that index in a
listview, the fastscroll just does nothing.
This patch adds a routine for finding the closest group divider
as a subsititution in that circumstance.

Change-Id: I0c9b9f0994e687a1cc1c7f97f820114d8c0dd541

src/js/widgets/jquery.mobile.tizen.fastscroll.js

index 6b28fce..1c62c31 100644 (file)
@@ -107,6 +107,7 @@ define( [ '../jquery.mobile.tizen.scrollview' ], function ( ) {
                _defaultDuration: 500,
                _timer: null,
                _isFadeOut: false,
+               _charSet: null,
 
                _create: function () {
                        var $el = this.element,
@@ -249,13 +250,40 @@ define( [ '../jquery.mobile.tizen.scrollview' ], function ( ) {
                        });
                },
 
+               _findClosestDivider: function ( targetChar ) {
+                       var i,
+                               dividerMap = this._dividerMap,
+                               charSet = this._charSet,
+                               charSetLen = charSet.length,
+                               targetIdx = charSet.indexOf( targetChar ),
+                               lastDivider,
+                               subDivider = null;
+
+                       for ( i = 0; i < targetIdx; ++i ) {
+                               lastDivider = dividerMap[ charSet.charAt( i ) ];
+                               if ( lastDivider !== undefined ) {
+                                       subDivider = lastDivider;
+                               }
+                       }
+                       if ( !subDivider ) {
+                               for ( ++i; i < charSetLen; ++i ) {
+                                       lastDivider = dividerMap[ charSet.charAt( i ) ];
+                                       if ( lastDivider !== undefined ) {
+                                               subDivider = lastDivider;
+                                               break;
+                                       }
+                               }
+                       }
+                       return subDivider;
+               },
+
                _hitOmitItem: function ( listItem, text ) {
-                       var self = this,
-                               $popup = self.scrollview.find( '.ui-fastscroll-popup' ),
-                               divider = self._dividerMap[ text ];
+                       var $popup = this.scrollview.find( '.ui-fastscroll-popup' ),
+                               divider;
 
+                       divider = this._dividerMap[ text ] || this._findClosestDivider( text );
                        if ( typeof divider !== "undefined" ) {
-                               self.jumpToDivider( $( divider ) );
+                               this.jumpToDivider( $( divider ) );
                        }
 
                        $popup.text( text )
@@ -273,19 +301,18 @@ define( [ '../jquery.mobile.tizen.scrollview' ], function ( ) {
                },
 
                _hitItem: function ( listItem  ) {
-                       var self = this,
-                               $popup = self.scrollview.find( '.ui-fastscroll-popup' ),
+                       var $popup = this.scrollview.find( '.ui-fastscroll-popup' ),
                                text = listItem.text(),
                                divider;
 
                        if ( text === "#" ) {
-                               divider = self._dividerMap.number;
+                               divider = this._dividerMap.number;
                        } else {
-                               divider = self._dividerMap[ text ];
+                               divider = this._dividerMap[ text ] || this._findClosestDivider( text );
                        }
 
                        if ( typeof divider !== "undefined" ) {
-                               self.jumpToDivider( $( divider ) );
+                               this.jumpToDivider( $( divider ) );
                        }
 
                        $popup.text( text )
@@ -393,11 +420,10 @@ define( [ '../jquery.mobile.tizen.scrollview' ], function ( ) {
                },
 
                _createDividerMap: function () {
-                       var self = this,
-                               primaryCharacterSet = self._primaryLanguage ? self._primaryLanguage.replace( /,/g, "" ) : null,
-                               secondCharacterSet = self._secondLanguage ? self._secondLanguage.replace( /,/g, "" ) : null,
+                       var primaryCharacterSet = this._primaryLanguage ? this._primaryLanguage.replace( /,/g, "" ) : null,
+                               secondCharacterSet = this._secondLanguage ? this._secondLanguage.replace( /,/g, "" ) : null,
                                numberSet = "0123456789",
-                               dividers = self.element.find( '.ui-li-divider' ),
+                               dividers = this.element.find( '.ui-li-divider' ),
                                map = {},
                                matchToDivider,
                                makeCharacterSet,
@@ -432,13 +458,14 @@ define( [ '../jquery.mobile.tizen.scrollview' ], function ( ) {
                        }
 
                        dividers.each( function ( index, divider ) {
-                               if (  numberSet.search( $( divider ).text() ) !== -1  ) {
+                               if ( numberSet.search( $( divider ).text() ) !== -1  ) {
                                        map.number = divider;
                                        return false;
                                }
                        });
 
-                       self._dividerMap = map;
+                       this._dividerMap = map;
+                       this._charSet = primaryCharacterSet + secondCharacterSet;
                },
 
                _setTimer: function ( start ) {