upload tizen1.0 source
[framework/web/web-ui-fw.git] / src / widgets / extendablelist / js / jquery.mobile.tizen.extendablelist.js
index ff676d3..7d20590 100755 (executable)
-/*\r
+/* ***************************************************************************\r
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.\r
+ *\r
+ * Permission is hereby granted, free of charge, to any person obtaining a\r
+ * copy of this software and associated documentation files (the "Software"),\r
+ * to deal in the Software without restriction, including without limitation\r
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
+ * and/or sell copies of the Software, and to permit persons to whom the\r
+ * Software is furnished to do so, subject to the following conditions:\r
+ *\r
+ * The above copyright notice and this permission notice shall be included in\r
+ * all copies or substantial portions of the Software.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\r
+ * DEALINGS IN THE SOFTWARE.\r
+ * ***************************************************************************\r
+ *\r
  *     Author: Wongi Lee <wongi11.lee@samsung.com>\r
 */\r
 \r
 /**\r
- * Extendable List Widget for unlimited data.\r
- * To support more then 1,000 items, special list widget developed. \r
- * Fast initialize and append some element into the DOM tree repeatedly.\r
- * DB connection and works like DB cursor.     \r
- * \r
+ *     Extendable List Widget for unlimited data.\r
+ *     To support more then 1,000 items, special list widget developed.\r
+ *     Fast initialize and append some element into the DOM tree repeatedly.\r
+ *     DB connection and works like DB cursor.\r
+ *\r
  * HTML Attributes:\r
  *\r
  *             data-role:      extendablelist\r
- *             data-template : jQuery.template ID that populate into extendable list. A button : a <DIV> element with "data-role : button" should be included on data-template. \r
+ *             data-template : jQuery.template ID that populate into extendable list. A button : a <DIV> element with "data-role : button" should be included on data-template.\r
  *             data-dbtable : DB Table name. It used as window[DB NAME]. Loaded data should be converted as window object.\r
- *             data-extenditems : Number of elements to extend at once. \r
+ *             data-extenditems : Number of elements to extend at once.\r
  *             \r
  *             ID : <UL> element that has "data-role=extendablelist" must have ID attribute.\r
  *             Class : <UL> element that has "data-role=extendablelist" should have "vlLoadSuccess" class to guaranty DB loading is completed.\r
- *             tmp_load_more : Template ID for "load more" message and button. \r
+ *             tmp_load_more : Template ID for "load more" message and button.\r
  *\r
  *\r
- * APIs:\r
+ *APIs:\r
  *\r
  *             create ( void )\r
  *                     : API to call _create method. API for AJAX or DB loading callback.\r
  *\r
  *             recreate ( Array )\r
- *                     : Update extendable list with new data array. For example, update with search result. \r
+ *                     : Update extendable list with new data array. For example, update with search result.\r
+ *\r
+ *Examples:\r
  *\r
- * Examples:\r
- * \r
- *             <script id="tmp-3-1-1" type="text/x-jquery-tmpl">\r
+ *             <script id="tmp-3-1-1" type="text/x-jquery-tmpl">\r
  *                     <li class="ui-li-3-1-1"><span class="ui-li-text-main">${NAME}</span></li>\r
  *             </script>\r
- * \r
+ *\r
  *             <script id="tmp_load_more" type="text/x-jquery-tmpl"> \r
- *                     <li class="ui-li-3-1-1" style="text-align:center; margin:0 auto">\r
- *                             <div data-role="button">Load ${NUM_MORE_ITEMS} more items</div>\r
- *                     </li>\r
- *             </script>\r
- *     \r
- *             <ul id = "extendable_list_main" data-role="extendablelist" data-extenditems="50" data-template="tmp-3-1-1" data-dbtable="JSON_DATA">\r
- *             </ul>\r
- * \r
+ *                     <li class="ui-li-3-1-1" style="text-align:center; margin:0 auto">\r
+ *                             <div data-role="button">Load ${NUM_MORE_ITEMS} more items</div>\r
+ *                     </li>\r
+ *             </script>\r
+ *     \r
+ *             <ul id = "extendable_list_main" data-role="extendablelist" data-extenditems="50" data-template="tmp-3-1-1" data-dbtable="JSON_DATA">\r
+ *             </ul>\r
+ *\r
  */\r
 \r
 \r
-(function( $, undefined ) {\r
-\r
-//Keeps track of the number of lists per page UID\r
-//This allows support for multiple nested list in the same page\r
-//https://github.com/jquery/jquery-mobile/issues/1617\r
-var listCountPerPage = {};\r
-\r
-var    TOTAL_ITEMS = 0;\r
-\r
-var i =0;\r
-var last_index = 0;\r
-\r
-$.widget( "tizen.extendablelist", $.mobile.widget, {\r
-       options: {\r
-               theme: "s",\r
-               countTheme: "c",\r
-               headerTheme: "b",\r
-               dividerTheme: "b",\r
-               splitIcon: "arrow-r",\r
-               splitTheme: "b",\r
-               inset: false,\r
-               id:     "",                                             /* Extendable list UL elemet's ID */\r
-               extenditems: 50,                        /* Number of append items */ \r
-               childSelector: " li",           /* To support swipe list */\r
-               dbtable: "",\r
-               template : "",                          /* Template for each list item */\r
-               loadmore : "tmp_load_more",     /* Template for "Load more" message */\r
-               scrollview: false,\r
-               initSelector: ":jqmData(role='extendablelist')"\r
-       },\r
-\r
-       _stylerMouseUp: function() {\r
-               $( this ).addClass( "ui-btn-up-s" );\r
-               $( this ).removeClass( "ui-btn-down-s" );\r
-       },\r
-\r
-       _stylerMouseDown: function() {\r
-               $( this ).addClass( "ui-btn-down-s" );\r
-               $( this ).removeClass( "ui-btn-up-s" );\r
-       },\r
-       \r
-       _stylerMouseOver: function() {\r
-               $( this ).toggleClass( "ui-btn-hover-s" );              \r
-       },\r
-       \r
-       _stylerMouseOut: function() {\r
-               $( this ).toggleClass( "ui-btn-hover-s" );\r
-       },\r
-\r
-       _pushData: function ( template, data ) {\r
-               var o = this.options;\r
-               \r
-               var dataTable = data;\r
-               \r
-               var myTemplate = $( "#" + template );\r
-               \r
-               var loadMoreItems = ( o.extenditems > data.length - last_index ? data.length - last_index : o.extenditems); \r
-               \r
-               for (i = 0; i < loadMoreItems; i++ ) \r
-               {\r
-                       var htmlData = myTemplate.tmpl( dataTable[ i ]);\r
-                       $( o.id ).append( $( htmlData ).attr( 'id', 'li_'+i ) );\r
-                       last_index++;\r
-               }\r
-               \r
-               /* After push data, re-style extendable list widget */\r
-               $( o.id ).trigger( "create" );\r
-       },\r
-       \r
-       _loadmore: function( event ){\r
-               var t = this;\r
-               var o = event.data;\r
-       \r
-               /* Remove load more message */\r
-               $( "#load_more_message" ).remove();\r
-\r
-               /* Append items */\r
-               var dataTable = window[ o.dbtable ];\r
-               var myTemplate = $( "#" + o.template );\r
-               \r
-               var loadMoreItems = ( o.extenditems > dataTable.length - last_index ? dataTable.length - last_index : o.extenditems ); \r
-               \r
-               for ( i = 0; i < loadMoreItems; i++ ) \r
-               {\r
-                       last_index++;\r
-                       var htmlData = myTemplate.tmpl( dataTable[ last_index ] );\r
-                       $( o.id ).append( $( htmlData ).attr( 'id', 'li_' + last_index ) );\r
-               }\r
-               \r
-               /* Append "Load more" message on the last of list */\r
-           if ( TOTAL_ITEMS > last_index ) {\r
-               var myTemplate = $( "#" + o.loadmore );\r
-               var more_items_to_load = TOTAL_ITEMS - last_index;\r
-               var num_next_load_items = ( o.extenditems <= more_items_to_load ) ? o.extenditems : more_items_to_load;\r
-               var htmlData = myTemplate.tmpl( { NUM_MORE_ITEMS : num_next_load_items } );\r
-               \r
-               $( o.id ).append( $( htmlData ).attr( 'id', "load_more_message" ) );\r
-           }\r
-           \r
-           $( o.id ).trigger( "create" );\r
-           $( o.id ).extendablelist( "refresh" );\r
-       },\r
-       \r
-       recreate: function( newArray ) {\r
-               var t = this;\r
-               var o = this.options;\r
-               \r
-               $( o.id ).empty();\r
-               \r
-               TOTAL_ITEMS = newArray.length;\r
-               \r
-               t._pushData( ( o.template), newArray );\r
-               \r
-               if ( o.childSelector == " ul" ) {\r
-                       $( o.id + " ul" ).swipelist();  \r
-               }\r
-               \r
-               $( o.id ).extendablelist();\r
-               \r
-               t.refresh( true );\r
-       },\r
-\r
-       _initList: function(){\r
-               var t = this;\r
-               var o = this.options;\r
-               \r
-               /* After AJAX loading success */\r
-               o.dbtable = t.element.data( "dbtable" );\r
-               \r
-               TOTAL_ITEMS = $( window[ o.dbtable ] ).size();\r
-               \r
-        /* Make Gen list by template */\r
-               if ( last_index <= 0 ) {\r
-                       t._pushData( ( o.template ), window[ o.dbtable ] );\r
-\r
-                   /* Append "Load more" message on the last of list */\r
-                   if ( TOTAL_ITEMS > last_index ) {\r
-                       var myTemplate = $( "#" + o.loadmore );\r
-                       var more_items_to_load = TOTAL_ITEMS - last_index;\r
-                       var num_next_load_items = ( o.extenditems <= more_items_to_load) ? o.extenditems : more_items_to_load;\r
-                       var htmlData = myTemplate.tmpl( { NUM_MORE_ITEMS : num_next_load_items } );\r
-                       \r
-                       $( o.id ).append( $( htmlData ).attr( 'id', "load_more_message" ) );\r
-                       \r
-                       $( "#load_more_message" ).live( "click", t.options, t._loadmore );\r
-                   }\r
-                   else {\r
-                       /* No more items to load */\r
-                       $( "#load_more_message" ).die();\r
-                       $( "#load_more_message" ).remove();\r
-                   }\r
-               }\r
+( function ( $, undefined ) {\r
+\r
+       //Keeps track of the number of lists per page UID\r
+       //This allows support for multiple nested list in the same page\r
+       //https://github.com/jquery/jquery-mobile/issues/1617\r
+       var listCountPerPage = {},\r
+               TOTAL_ITEMS = 0,\r
+               last_index = 0;\r
+\r
+       $.widget( "tizen.extendablelist", $.mobile.widget, {\r
+               options: {\r
+                       theme: "s",\r
+                       countTheme: "c",\r
+                       headerTheme: "b",\r
+                       dividerTheme: "b",\r
+                       splitIcon: "arrow-r",\r
+                       splitTheme: "b",\r
+                       inset: false,\r
+                       id:     "",                                             /* Extendable list UL elemet's ID */\r
+                       extenditems: 50,                        /* Number of append items */\r
+                       childSelector: " li",           /* To support swipe list */\r
+                       dbtable: "",\r
+                       template : "",                          /* Template for each list item */\r
+                       loadmore : "tmp_load_more",     /* Template for "Load more" message */\r
+                       scrollview: false,\r
+                       initSelector: ":jqmData(role='extendablelist')"\r
+               },\r
+\r
+               _stylerMouseUp: function () {\r
+                       $( this ).addClass( "ui-btn-up-s" );\r
+                       $( this ).removeClass( "ui-btn-down-s" );\r
+               },\r
+\r
+               _stylerMouseDown: function () {\r
+                       $( this ).addClass( "ui-btn-down-s" );\r
+                       $( this ).removeClass( "ui-btn-up-s" );\r
+               },\r
+\r
+               _stylerMouseOver: function () {\r
+                       $( this ).toggleClass( "ui-btn-hover-s" );\r
+               },\r
+\r
+               _stylerMouseOut: function () {\r
+                       $( this ).toggleClass( "ui-btn-hover-s" );\r
+               },\r
+\r
+               _pushData: function ( template, data ) {\r
+                       var o = this.options,\r
+                               i = 0,\r
+                               dataTable = data,\r
+                               myTemplate = $( "#" + template ),\r
+                               loadMoreItems = ( o.extenditems > data.length - last_index ? data.length - last_index : o.extenditems ),\r
+                               htmlData;\r
+\r
+                       for (i = 0; i < loadMoreItems; i++ ) {\r
+                               htmlData = myTemplate.tmpl( dataTable[ i ] );\r
+                               $( o.id ).append( $( htmlData ).attr( 'id', 'li_' + i ) );\r
+                               last_index++;\r
+                       }\r
+\r
+                       /* After push data, re-style extendable list widget */\r
+                       $( o.id ).trigger( "create" );\r
+               },\r
+\r
+               _loadmore: function ( event ) {\r
+                       var t = this,\r
+                               o = event.data,\r
+                               i = 0,\r
+                               dataTable = window[ o.dbtable ],\r
+                               myTemplate = $( "#" + o.template ),\r
+                               loadMoreItems = ( o.extenditems > dataTable.length - last_index ? dataTable.length - last_index : o.extenditems ),\r
+                               htmlData,\r
+                               more_items_to_load,\r
+                               num_next_load_items;\r
+\r
+                       /* Remove load more message */\r
+                       $( "#load_more_message" ).remove();\r
+\r
+                       /* Append More Items */\r
+                       for ( i = 0; i < loadMoreItems; i++ ) {\r
+                               htmlData = myTemplate.tmpl( dataTable[ last_index ] );\r
+                               $( o.id ).append( $( htmlData ).attr( 'id', 'li_' + last_index ) );\r
+                               last_index++;\r
+                       }\r
+\r
+                       /* Append "Load more" message on the last of list */\r
+                       if ( TOTAL_ITEMS > last_index ) {\r
+                               myTemplate = $( "#" + o.loadmore );\r
+                               more_items_to_load = TOTAL_ITEMS - last_index;\r
+                               num_next_load_items = ( o.extenditems <= more_items_to_load ) ? o.extenditems : more_items_to_load;\r
+                               htmlData = myTemplate.tmpl( { NUM_MORE_ITEMS : num_next_load_items } );\r
+\r
+                               $( o.id ).append( $( htmlData ).attr( 'id', "load_more_message" ) );\r
+                       }\r
+\r
+                       $( o.id ).trigger( "create" );\r
+                       $( o.id ).extendablelist( "refresh" );\r
+               },\r
+\r
+               recreate: function ( newArray ) {\r
+                       var t = this,\r
+                               o = this.options;\r
 \r
-           if ( o.childSelector == " ul" ) {\r
-                       $( o.id + " ul" ).swipelist();\r
-               }\r
-           \r
-           $( o.id ).trigger( "create" );\r
-           \r
-               t.refresh( true );\r
-       },\r
-       \r
-       \r
-       \r
-       create: function() {\r
-               var o = this.options;\r
-\r
-               /* external API for AJAX callback */\r
-               this._create( "create" );\r
-       },\r
-       \r
-       _create: function( event ) {\r
-               var t = this;\r
-               var o = this.options; \r
-               \r
-               // create listview markup\r
-               t.element.addClass( function( i, orig ) {\r
-                       return orig + " ui-listview ui-extendable-list-container" + ( t.options.inset ? " ui-listview-inset ui-corner-all ui-shadow " : "" );\r
-               });\r
-\r
-        var $el = this.element;\r
-               \r
-        o.id = "#" + $el.attr( "id" );\r
-        \r
-        if ( $el.data( "extenditems" ) ) {\r
-               o.extenditems = parseInt( $el.data( "extenditems" ) );\r
-        }\r
-        \r
-           $( o.id ).bind( "pagehide", function(e){\r
                        $( o.id ).empty();\r
-               });\r
-           \r
-           /* Scroll view */\r
-           ( $( ".ui-scrollview-clip" ).size() > 0) ? o.scrollview = true : o.scrollview = false;\r
-\r
-           /* After DB Load complete, Init Vritual list */\r
-           if ( $( o.id ).hasClass( "vlLoadSuccess" ) ) {\r
-                   if ( $el.data( "template" ) ) {\r
-                               o.template = $el.data( "template" );\r
-                               \r
-                       /* to support swipe list, <li> or <ul> can be main node of extendable list. */\r
-                               if ( $el.data( "swipelist" ) == true ) {\r
-                                       o.childSelector = " ul";\r
-                               }\r
-                               else {\r
-                                       o.shildSelector = " li";\r
+\r
+                       TOTAL_ITEMS = newArray.length;\r
+\r
+                       t._pushData( ( o.template), newArray );\r
+\r
+                       if ( o.childSelector == " ul" ) {\r
+                               $( o.id + " ul" ).swipelist();\r
+                       }\r
+\r
+                       $( o.id ).extendablelist();\r
+\r
+                       t.refresh( true );\r
+               },\r
+\r
+               _initList: function () {\r
+                       var t = this,\r
+                               o = this.options,\r
+                               myTemplate,\r
+                               more_items_to_load,\r
+                               num_next_load_items,\r
+                               htmlData;\r
+\r
+                       /* After AJAX loading success */\r
+                       o.dbtable = t.element.data( "dbtable" );\r
+\r
+                       TOTAL_ITEMS = $( window[ o.dbtable ] ).size();\r
+\r
+                       /* Make Gen list by template */\r
+                       if ( last_index <= 0 ) {\r
+                               t._pushData( ( o.template ), window[ o.dbtable ] );\r
+\r
+                               /* Append "Load more" message on the last of list */\r
+                               if ( TOTAL_ITEMS > last_index ) {\r
+                                       myTemplate = $( "#" + o.loadmore );\r
+                                       more_items_to_load = TOTAL_ITEMS - last_index;\r
+                                       num_next_load_items = ( o.extenditems <= more_items_to_load) ? o.extenditems : more_items_to_load;\r
+                                       htmlData = myTemplate.tmpl( { NUM_MORE_ITEMS : num_next_load_items } );\r
+\r
+                                       $( o.id ).append( $( htmlData ).attr( 'id', "load_more_message" ) );\r
+\r
+                                       $( "#load_more_message" ).live( "click", t.options, t._loadmore );\r
+                               } else {\r
+                                       /* No more items to load */\r
+                                       $( "#load_more_message" ).die();\r
+                                       $( "#load_more_message" ).remove();\r
                                }\r
                        }\r
-                       \r
-                       t._initList();\r
-           }\r
-       },\r
-       \r
-       destroy : function(){\r
-               var o = this.options;\r
-               \r
-               $( o.id ).empty();\r
-               \r
-               TOTAL_ITEMS = 0;\r
-               i =0;\r
-               last_index = 0;\r
-               \r
-               $( "#load_more_message" ).die();\r
-       },\r
-       \r
-       _itemApply: function( $list, item ) {\r
-               var $countli = item.find( ".ui-li-count" );\r
-               \r
-               if ( $countli.length ) {\r
-                       item.addClass( "ui-li-has-count" );\r
-               }\r
-               \r
-               $countli.addClass( "ui-btn-up-" + ( $list.jqmData( "counttheme" ) || this.options.countTheme ) + " ui-btn-corner-all" );\r
-\r
-               // TODO class has to be defined in markup\r
-               item.find( "h1, h2, h3, h4, h5, h6" ).addClass( "ui-li-heading" ).end()\r
-                       .find( "p, dl" ).addClass( "ui-li-desc" ).end()\r
-                       .find( ">img:eq(0), .ui-link-inherit>img:eq(0)" ).addClass( "ui-li-thumb" ).each(function() {\r
-                               item.addClass( $( this ).is( ".ui-li-icon" ) ? "ui-li-has-icon" : "ui-li-has-thumb" );\r
-                       }).end()\r
-                       .find( ".ui-li-aside" ).each(function() {\r
-                               var $this = $( this );\r
-                               $this.prependTo( $this.parent() ); //shift aside to front for css float\r
+\r
+                       if ( o.childSelector == " ul" ) {\r
+                               $( o.id + " ul" ).swipelist();\r
+                       }\r
+\r
+                       $( o.id ).trigger( "create" );\r
+\r
+                       t.refresh( true );\r
+               },\r
+\r
+               create: function () {\r
+                       var o = this.options;\r
+\r
+                       /* external API for AJAX callback */\r
+                       this._create( "create" );\r
+               },\r
+\r
+               _create: function ( event ) {\r
+                       var t = this,\r
+                               o = this.options,\r
+                               $el = this.element;\r
+\r
+                       // create listview markup\r
+                       t.element.addClass( function ( i, orig ) {\r
+                               return orig + " ui-listview ui-extendable-list-container" + ( t.options.inset ? " ui-listview-inset ui-corner-all ui-shadow " : "" );\r
                        });\r
-       },\r
 \r
-       _removeCorners: function( li, which ) {\r
-               var top = "ui-corner-top ui-corner-tr ui-corner-tl",\r
-                       bot = "ui-corner-bottom ui-corner-br ui-corner-bl";\r
+                       o.id = "#" + $el.attr( "id" );\r
+\r
+                       if ( $el.data( "extenditems" ) ) {\r
+                               o.extenditems = parseInt( $el.data( "extenditems" ), 10 );\r
+                       }\r
 \r
-               li = li.add( li.find( ".ui-btn-inner, .ui-li-link-alt, .ui-li-thumb" ) );\r
+                       $( o.id ).bind( "pagehide", function (e) {\r
+                               $( o.id ).empty();\r
+                       });\r
 \r
-               if ( which === "top" ) {\r
-                       li.removeClass( top );\r
-               } else if ( which === "bottom" ) {\r
-                       li.removeClass( bot );\r
-               } else {\r
-                       li.removeClass( top + " " + bot );\r
-               }\r
-       },\r
-\r
-       _refreshCorners: function( create ) {\r
-               var $li,\r
-                       $visibleli,\r
-                       $topli,\r
-                       $bottomli;\r
-\r
-               if ( this.options.inset ) {\r
-                       $li = this.element.children( "li" );\r
-                       // at create time the li are not visible yet so we need to rely on .ui-screen-hidden\r
-                       $visibleli = create?$li.not( ".ui-screen-hidden" ):$li.filter( ":visible" );\r
-\r
-                       this._removeCorners( $li );\r
-\r
-                       // Select the first visible li element\r
-                       $topli = $visibleli.first()\r
-                               .addClass( "ui-corner-top" );\r
-\r
-                       $topli.add( $topli.find( ".ui-btn-inner" ) )\r
-                               .find( ".ui-li-link-alt" )\r
-                                       .addClass( "ui-corner-tr" )\r
-                               .end()\r
-                               .find( ".ui-li-thumb" )\r
-                                       .not( ".ui-li-icon" )\r
-                                       .addClass( "ui-corner-tl" );\r
-\r
-                       // Select the last visible li element\r
-                       $bottomli = $visibleli.last()\r
-                               .addClass( "ui-corner-bottom" );\r
-\r
-                       $bottomli.add( $bottomli.find( ".ui-btn-inner" ) )\r
-                               .find( ".ui-li-link-alt" )\r
-                                       .addClass( "ui-corner-br" )\r
-                               .end()\r
-                               .find( ".ui-li-thumb" )\r
-                                       .not( ".ui-li-icon" )\r
-                                       .addClass( "ui-corner-bl" );\r
-               }\r
-       },\r
-\r
-       refresh: function( create ) {\r
-               this.parentPage = this.element.closest( ".ui-page" );\r
-               this._createSubPages();\r
-\r
-               var o = this.options,\r
-                       $list = this.element,\r
-                       self = this,\r
-                       dividertheme = $list.jqmData( "dividertheme" ) || o.dividerTheme,\r
-                       listsplittheme = $list.jqmData( "splittheme" ),\r
-                       listspliticon = $list.jqmData( "spliticon" ),\r
-                       li = $list.children( "li" ),\r
-                       counter = $.support.cssPseudoElement || !$.nodeName( $list[ 0 ], "ol" ) ? 0 : 1,\r
-                       item, itemClass, itemTheme,\r
-                       a, last, splittheme, countParent, icon;\r
-\r
-               if ( counter ) {\r
-                       $list.find( ".ui-li-dec" ).remove();\r
-               }\r
+                       /* Scroll view */\r
+                       if ( $( ".ui-scrollview-clip" ).size() > 0) {\r
+                               o.scrollview = true;\r
+                       } else {\r
+                               o.scrollview = false;\r
+                       }\r
 \r
-               for ( var pos = 0, numli = li.length; pos < numli; pos++ ) {\r
-                       item = li.eq( pos );\r
-                       itemClass = "ui-li";\r
-\r
-                       // If we're creating the element, we update it regardless\r
-                       if ( create || !item.hasClass( "ui-li" ) ) {\r
-                               itemTheme = item.jqmData( "theme" ) || o.theme;\r
-                               a = item.children( "a" );\r
-\r
-                               if ( a.length ) {\r
-                                       icon = item.jqmData( "icon" );\r
-\r
-                                       item.buttonMarkup({\r
-                                               wrapperEls: "div",\r
-                                               shadow: false,\r
-                                               corners: false,\r
-                                               iconpos: "right",\r
-                                               /* icon: a.length > 1 || icon === false ? false : icon || "arrow-r",*/\r
-                                               icon: false,    /* Remove unnecessary arrow icon */\r
-                                               theme: itemTheme\r
-                                       });\r
-\r
-                                       if ( ( icon != false ) && ( a.length == 1 ) ) {\r
-                                               item.addClass( "ui-li-has-arrow" );\r
+                       /* After DB Load complete, Init Extendable list */\r
+                       if ( $( o.id ).hasClass( "elLoadSuccess" ) ) {\r
+                               if ( !$( o.id ).hasClass( "elInitComplete" ) ) {\r
+                                       if ( $el.data( "template" ) ) {\r
+                                               o.template = $el.data( "template" );\r
+\r
+                                               /* to support swipe list, <li> or <ul> can be main node of extendable list. */\r
+                                               if ( $el.data( "swipelist" ) == true ) {\r
+                                                       o.childSelector = " ul";\r
+                                               } else {\r
+                                                       o.shildSelector = " li";\r
+                                               }\r
                                        }\r
 \r
-                                       a.first().addClass( "ui-link-inherit" );\r
-\r
-                                       if ( a.length > 1 ) {\r
-                                               itemClass += " ui-li-has-alt";\r
-\r
-                                               last = a.last();\r
-                                               splittheme = listsplittheme || last.jqmData( "theme" ) || o.splitTheme;\r
-\r
-                                               last.appendTo(item)\r
-                                                       .attr( "title", last.getEncodedText() )\r
-                                                       .addClass( "ui-li-link-alt" )\r
-                                                       .empty()\r
-                                                       .buttonMarkup({\r
-                                                               shadow: false,\r
-                                                               corners: false,\r
-                                                               theme: itemTheme,\r
-                                                               icon: false,\r
-                                                               iconpos: false\r
-                                                       })\r
-                                                       .find( ".ui-btn-inner" )\r
+                                       $( o.id ).addClass( "elInitComplete" );\r
+                               }\r
+\r
+                               t._initList();\r
+                       }\r
+               },\r
+\r
+               destroy : function () {\r
+                       var o = this.options;\r
+\r
+                       $( o.id ).empty();\r
+\r
+                       TOTAL_ITEMS = 0;\r
+                       last_index = 0;\r
+\r
+                       $( "#load_more_message" ).die();\r
+               },\r
+\r
+               _itemApply: function ( $list, item ) {\r
+                       var $countli = item.find( ".ui-li-count" );\r
+\r
+                       if ( $countli.length ) {\r
+                               item.addClass( "ui-li-has-count" );\r
+                       }\r
+\r
+                       $countli.addClass( "ui-btn-up-" + ( $list.jqmData( "counttheme" ) || this.options.countTheme ) + " ui-btn-corner-all" );\r
+\r
+                       // TODO class has to be defined in markup\r
+                       item.find( "h1, h2, h3, h4, h5, h6" ).addClass( "ui-li-heading" ).end()\r
+                               .find( "p, dl" ).addClass( "ui-li-desc" ).end()\r
+                               .find( ">img:eq(0), .ui-link-inherit>img:eq(0)" ).addClass( "ui-li-thumb" ).each(function () {\r
+                                       item.addClass( $( this ).is( ".ui-li-icon" ) ? "ui-li-has-icon" : "ui-li-has-thumb" );\r
+                               }).end()\r
+                               .find( ".ui-li-aside" ).each(function () {\r
+                                       var $this = $( this );\r
+                                       $this.prependTo( $this.parent() ); //shift aside to front for css float\r
+                               });\r
+               },\r
+\r
+               _removeCorners: function ( li, which ) {\r
+                       var top = "ui-corner-top ui-corner-tr ui-corner-tl",\r
+                               bot = "ui-corner-bottom ui-corner-br ui-corner-bl";\r
+\r
+                       li = li.add( li.find( ".ui-btn-inner, .ui-li-link-alt, .ui-li-thumb" ) );\r
+\r
+                       if ( which === "top" ) {\r
+                               li.removeClass( top );\r
+                       } else if ( which === "bottom" ) {\r
+                               li.removeClass( bot );\r
+                       } else {\r
+                               li.removeClass( top + " " + bot );\r
+                       }\r
+               },\r
+\r
+               _refreshCorners: function ( create ) {\r
+                       var $li,\r
+                               $visibleli,\r
+                               $topli,\r
+                               $bottomli;\r
+\r
+                       if ( this.options.inset ) {\r
+                               $li = this.element.children( "li" );\r
+                               // at create time the li are not visible yet so we need to rely on .ui-screen-hidden\r
+                               $visibleli = create ? $li.not( ".ui-screen-hidden" ) : $li.filter( ":visible" );\r
+\r
+                               this._removeCorners( $li );\r
+\r
+                               // Select the first visible li element\r
+                               $topli = $visibleli.first()\r
+                                       .addClass( "ui-corner-top" );\r
+\r
+                               $topli.add( $topli.find( ".ui-btn-inner" ) )\r
+                                       .find( ".ui-li-link-alt" )\r
+                                               .addClass( "ui-corner-tr" )\r
+                                       .end()\r
+                                       .find( ".ui-li-thumb" )\r
+                                               .not( ".ui-li-icon" )\r
+                                               .addClass( "ui-corner-tl" );\r
+\r
+                               // Select the last visible li element\r
+                               $bottomli = $visibleli.last()\r
+                                       .addClass( "ui-corner-bottom" );\r
+\r
+                               $bottomli.add( $bottomli.find( ".ui-btn-inner" ) )\r
+                                       .find( ".ui-li-link-alt" )\r
+                                               .addClass( "ui-corner-br" )\r
+                                       .end()\r
+                                       .find( ".ui-li-thumb" )\r
+                                               .not( ".ui-li-icon" )\r
+                                               .addClass( "ui-corner-bl" );\r
+                       }\r
+               },\r
+\r
+               refresh: function ( create ) {\r
+                       this.parentPage = this.element.closest( ".ui-page" );\r
+                       this._createSubPages();\r
+\r
+                       var o = this.options,\r
+                               $list = this.element,\r
+                               self = this,\r
+                               dividertheme = $list.jqmData( "dividertheme" ) || o.dividerTheme,\r
+                               listsplittheme = $list.jqmData( "splittheme" ),\r
+                               listspliticon = $list.jqmData( "spliticon" ),\r
+                               li = $list.children( "li" ),\r
+                               counter = $.support.cssPseudoElement || !$.nodeName( $list[ 0 ], "ol" ) ? 0 : 1,\r
+                               item,\r
+                               itemClass,\r
+                               itemTheme,\r
+                               a,\r
+                               last,\r
+                               splittheme,\r
+                               countParent,\r
+                               icon,\r
+                               pos,\r
+                               numli;\r
+\r
+                       if ( counter ) {\r
+                               $list.find( ".ui-li-dec" ).remove();\r
+                       }\r
+\r
+                       for ( pos = 0, numli = li.length; pos < numli; pos++ ) {\r
+                               item = li.eq( pos );\r
+                               itemClass = "ui-li";\r
+\r
+                               // If we're creating the element, we update it regardless\r
+                               if ( create || !item.hasClass( "ui-li" ) ) {\r
+                                       itemTheme = item.jqmData( "theme" ) || o.theme;\r
+                                       a = item.children( "a" );\r
+\r
+                                       if ( a.length ) {\r
+                                               icon = item.jqmData( "icon" );\r
+\r
+                                               item.buttonMarkup({\r
+                                                       wrapperEls: "div",\r
+                                                       shadow: false,\r
+                                                       corners: false,\r
+                                                       iconpos: "right",\r
+                                                       /* icon: a.length > 1 || icon === false ? false : icon || "arrow-r",*/\r
+                                                       icon: false,    /* Remove unnecessary arrow icon */\r
+                                                       theme: itemTheme\r
+                                               });\r
+\r
+                                               if ( ( icon != false ) && ( a.length == 1 ) ) {\r
+                                                       item.addClass( "ui-li-has-arrow" );\r
+                                               }\r
+\r
+                                               a.first().addClass( "ui-link-inherit" );\r
+\r
+                                               if ( a.length > 1 ) {\r
+                                                       itemClass += " ui-li-has-alt";\r
+\r
+                                                       last = a.last();\r
+                                                       splittheme = listsplittheme || last.jqmData( "theme" ) || o.splitTheme;\r
+\r
+                                                       last.appendTo(item)\r
+                                                               .attr( "title", last.getEncodedText() )\r
+                                                               .addClass( "ui-li-link-alt" )\r
+                                                               .empty()\r
+                                                               .buttonMarkup({\r
+                                                                       shadow: false,\r
+                                                                       corners: false,\r
+                                                                       theme: itemTheme,\r
+                                                                       icon: false,\r
+                                                                       iconpos: false\r
+                                                               })\r
+                                                               .find( ".ui-btn-inner" )\r
                                                                .append(\r
-                                                                       $( "<span />" ).buttonMarkup({\r
-                                                                               shadow: true,\r
-                                                                               corners: true,\r
-                                                                               theme: splittheme,\r
-                                                                               iconpos: "notext",\r
-                                                                               icon: listspliticon || last.jqmData( "icon" ) || o.splitIcon\r
+                                                                       $( "<span />" ).buttonMarkup( {\r
+                                                                               shadow : true,\r
+                                                                               corners : true,\r
+                                                                               theme : splittheme,\r
+                                                                               iconpos : "notext",\r
+                                                                               icon : listspliticon || last.jqmData( "icon" ) || o.splitIcon\r
                                                                        })\r
                                                                );\r
-                                       }\r
-                               } else if ( item.jqmData( "role" ) === "list-divider" ) {\r
+                                               }\r
+                                       } else if ( item.jqmData( "role" ) === "list-divider" ) {\r
 \r
-                                       itemClass += " ui-li-divider ui-btn ui-bar-" + dividertheme;\r
-                                       item.attr( "role", "heading" );\r
+                                               itemClass += " ui-li-divider ui-btn ui-bar-" + dividertheme;\r
+                                               item.attr( "role", "heading" );\r
 \r
-                                       //reset counter when a divider heading is encountered\r
-                                       if ( counter ) {\r
-                                               counter = 1;\r
-                                       }\r
+                                               //reset counter when a divider heading is encountered\r
+                                               if ( counter ) {\r
+                                                       counter = 1;\r
+                                               }\r
 \r
-                               } else {\r
-                                       itemClass += " ui-li-static ui-body-" + itemTheme;\r
+                                       } else {\r
+                                               itemClass += " ui-li-static ui-body-" + itemTheme;\r
+                                       }\r
                                }\r
-                       }\r
 \r
-                       if ( counter && itemClass.indexOf( "ui-li-divider" ) < 0 ) {\r
-                               countParent = item.is( ".ui-li-static:first" ) ? item : item.find( ".ui-link-inherit" );\r
+                               if ( counter && itemClass.indexOf( "ui-li-divider" ) < 0 ) {\r
+                                       countParent = item.is( ".ui-li-static:first" ) ? item : item.find( ".ui-link-inherit" );\r
 \r
-                               countParent.addClass( "ui-li-jsnumbering" )\r
-                                       .prepend( "<span class='ui-li-dec'>" + (counter++) + ". </span>" );\r
-                       }\r
+                                       countParent.addClass( "ui-li-jsnumbering" )\r
+                                               .prepend( "<span class='ui-li-dec'>" + (counter++) + ". </span>" );\r
+                               }\r
 \r
-                       item.add( item.children( ".ui-btn-inner" ) ).addClass( itemClass );\r
+                               item.add( item.children( ".ui-btn-inner" ) ).addClass( itemClass );\r
 \r
-                       self._itemApply( $list, item );\r
-               }\r
+                               self._itemApply( $list, item );\r
+                       }\r
 \r
-               this._refreshCorners( create );\r
-       },\r
-\r
-       //create a string for ID/subpage url creation\r
-       _idStringEscape: function( str ) {\r
-               return str.replace(/[^a-zA-Z0-9]/g, '-');\r
-       },\r
-\r
-       _createSubPages: function() {\r
-               var parentList = this.element,\r
-                       parentPage = parentList.closest( ".ui-page" ),\r
-                       parentUrl = parentPage.jqmData( "url" ),\r
-                       parentId = parentUrl || parentPage[ 0 ][ $.expando ],\r
-                       parentListId = parentList.attr( "id" ),\r
-                       o = this.options,\r
-                       dns = "data-" + $.mobile.ns,\r
-                       self = this,\r
-                       persistentFooterID = parentPage.find( ":jqmData(role='footer')" ).jqmData( "id" ),\r
-                       hasSubPages;\r
-\r
-               if ( typeof listCountPerPage[ parentId ] === "undefined" ) {\r
-                       listCountPerPage[ parentId ] = -1;\r
-               }\r
+                       this._refreshCorners( create );\r
+               },\r
+\r
+               //create a string for ID/subpage url creation\r
+               _idStringEscape: function ( str ) {\r
+                       return str.replace(/\W/g , "-");\r
+\r
+               },\r
+\r
+               _createSubPages: function () {\r
+                       var parentList = this.element,\r
+                               parentPage = parentList.closest( ".ui-page" ),\r
+                               parentUrl = parentPage.jqmData( "url" ),\r
+                               parentId = parentUrl || parentPage[ 0 ][ $.expando ],\r
+                               parentListId = parentList.attr( "id" ),\r
+                               o = this.options,\r
+                               dns = "data-" + $.mobile.ns,\r
+                               self = this,\r
+                               persistentFooterID = parentPage.find( ":jqmData(role='footer')" ).jqmData( "id" ),\r
+                               hasSubPages,\r
+                               newRemove;\r
+\r
+                       if ( typeof listCountPerPage[ parentId ] === "undefined" ) {\r
+                               listCountPerPage[ parentId ] = -1;\r
+                       }\r
 \r
-               parentListId = parentListId || ++listCountPerPage[ parentId ];\r
-\r
-               $( parentList.find( "li>ul, li>ol" ).toArray().reverse() ).each(function( i ) {\r
-                       var self = this,\r
-                               list = $( this ),\r
-                               listId = list.attr( "id" ) || parentListId + "-" + i,\r
-                               parent = list.parent(),\r
-                               nodeEls = $( list.prevAll().toArray().reverse() ),\r
-                               nodeEls = nodeEls.length ? nodeEls : $( "<span>" + $.trim(parent.contents()[ 0 ].nodeValue) + "</span>" ),\r
-                               title = nodeEls.first().getEncodedText(),//url limits to first 30 chars of text\r
-                               id = ( parentUrl || "" ) + "&" + $.mobile.subPageUrlKey + "=" + listId,\r
-                               theme = list.jqmData( "theme" ) || o.theme,\r
-                               countTheme = list.jqmData( "counttheme" ) || parentList.jqmData( "counttheme" ) || o.countTheme,\r
-                               newPage, anchor;\r
-\r
-                       //define hasSubPages for use in later removal\r
-                       hasSubPages = true;\r
-\r
-                       newPage = list.detach()\r
-                                               .wrap( "<div " + dns + "role='page' " + dns + "url='" + id + "' " + dns + "theme='" + theme + "' " + dns + "count-theme='" + countTheme + "'><div " + dns + "role='content'></div></div>" )\r
-                                               .parent()\r
-                                                       .before( "<div " + dns + "role='header' " + dns + "theme='" + o.headerTheme + "'><div class='ui-title'>" + title + "</div></div>" )\r
-                                                       .after( persistentFooterID ? $( "<div " + dns + "role='footer' " + dns + "id='"+ persistentFooterID +"'>" ) : "" )\r
+                       parentListId = parentListId || ++listCountPerPage[ parentId ];\r
+\r
+                       $( parentList.find( "li>ul, li>ol" ).toArray().reverse() ).each(function ( i ) {\r
+                               var self = this,\r
+                                       list = $( this ),\r
+                                       listId = list.attr( "id" ) || parentListId + "-" + i,\r
+                                       parent = list.parent(),\r
+                                       nodeEls,\r
+                                       title = nodeEls.first().getEncodedText(),//url limits to first 30 chars of text\r
+                                       id = ( parentUrl || "" ) + "&" + $.mobile.subPageUrlKey + "=" + listId,\r
+                                       theme = list.jqmData( "theme" ) || o.theme,\r
+                                       countTheme = list.jqmData( "counttheme" ) || parentList.jqmData( "counttheme" ) || o.countTheme,\r
+                                       newPage,\r
+                                       anchor;\r
+\r
+                               nodeEls = $( list.prevAll().toArray().reverse() );\r
+                               nodeEls = nodeEls.length ? nodeEls : $( "<span>" + $.trim(parent.contents()[ 0 ].nodeValue) + "</span>" );\r
+\r
+                               //define hasSubPages for use in later removal\r
+                               hasSubPages = true;\r
+\r
+                               newPage = list.detach()\r
+                                                       .wrap( "<div " + dns + "role='page' " + dns + "url='" + id + "' " + dns + "theme='" + theme + "' " + dns + "count-theme='" + countTheme + "'><div " + dns + "role='content'></div></div>" )\r
                                                        .parent()\r
-                                                               .appendTo( $.mobile.pageContainer );\r
+                                                               .before( "<div " + dns + "role='header' " + dns + "theme='" + o.headerTheme + "'><div class='ui-title'>" + title + "</div></div>" )\r
+                                                               .after( persistentFooterID ? $( "<div " + dns + "role='footer' " + dns + "id='" + persistentFooterID + "'>" ) : "" )\r
+                                                               .parent()\r
+                                                                       .appendTo( $.mobile.pageContainer );\r
 \r
-                       newPage.page();\r
+                               newPage.page();\r
 \r
-                       anchor = parent.find('a:first');\r
+                               anchor = parent.find('a:first');\r
 \r
-                       if ( !anchor.length ) {\r
-                               anchor = $( "<a/>" ).html( nodeEls || title ).prependTo( parent.empty() );\r
-                       }\r
+                               if ( !anchor.length ) {\r
+                                       anchor = $( "<a/>" ).html( nodeEls || title ).prependTo( parent.empty() );\r
+                               }\r
 \r
-                       anchor.attr( "href", "#" + id );\r
+                               anchor.attr( "href", "#" + id );\r
 \r
-               }).extendablelist();\r
+                       }).extendablelist();\r
 \r
-               // on pagehide, remove any nested pages along with the parent page, as long as they aren't active\r
-               // and aren't embedded\r
-               if( hasSubPages &&\r
-                       parentPage.is( ":jqmData(external-page='true')" ) &&\r
-                       parentPage.data( "page" ).options.domCache === false ) {\r
+                       // on pagehide, remove any nested pages along with the parent page, as long as they aren't active\r
+                       // and aren't embedded\r
+                       if ( hasSubPages &&\r
+                                       parentPage.is( ":jqmData(external-page='true')" ) &&\r
+                                       parentPage.data( "page" ).options.domCache === false ) {\r
 \r
-                       var newRemove = function( e, ui ){\r
-                               var nextPage = ui.nextPage, npURL;\r
+                               newRemove = function ( e, ui ) {\r
+                                       var nextPage = ui.nextPage, npURL;\r
 \r
-                               if( ui.nextPage ){\r
-                                       npURL = nextPage.jqmData( "url" );\r
-                                       if( npURL.indexOf( parentUrl + "&" + $.mobile.subPageUrlKey ) !== 0 ){\r
-                                               self.childPages().remove();\r
-                                               parentPage.remove();\r
+                                       if ( ui.nextPage ) {\r
+                                               npURL = nextPage.jqmData( "url" );\r
+                                               if ( npURL.indexOf( parentUrl + "&" + $.mobile.subPageUrlKey ) !== 0 ) {\r
+                                                       self.childPages().remove();\r
+                                                       parentPage.remove();\r
+                                               }\r
                                        }\r
-                               }\r
-                       };\r
+                               };\r
 \r
-                       // unbind the original page remove and replace with our specialized version\r
-                       parentPage\r
-                               .unbind( "pagehide.remove" )\r
-                               .bind( "pagehide.remove", newRemove);\r
-               }\r
-       },\r
+                               // unbind the original page remove and replace with our specialized version\r
+                               parentPage\r
+                                       .unbind( "pagehide.remove" )\r
+                                       .bind( "pagehide.remove", newRemove);\r
+                       }\r
+               },\r
 \r
-       // TODO sort out a better way to track sub pages of the extendable listview this is brittle\r
-       childPages: function(){\r
-               var parentUrl = this.parentPage.jqmData( "url" );\r
+               // TODO sort out a better way to track sub pages of the extendable listview this is brittle\r
+               childPages: function () {\r
+                       var parentUrl = this.parentPage.jqmData( "url" );\r
 \r
-               return $( ":jqmData(url^='"+  parentUrl + "&" + $.mobile.subPageUrlKey +"')" );\r
-       }\r
-});\r
+                       return $( ":jqmData(url^='" +  parentUrl + "&" + $.mobile.subPageUrlKey + "')" );\r
+               }\r
+       });\r
 \r
-//auto self-init widgets\r
-$( document ).bind( "pagecreate create", function( e ){\r
-       $( $.tizen.extendablelist.prototype.options.initSelector, e.target ).extendablelist();\r
-});\r
+       //auto self-init widgets\r
+       $( document ).bind( "pagecreate create", function ( e ) {\r
+               $( $.tizen.extendablelist.prototype.options.initSelector, e.target ).extendablelist();\r
+       });\r
 \r
-})( jQuery );\r
+}( jQuery ));\r