C:\Users\Micha\Documents\drupal 7 module\improved_multi_select-7.x-2.x-dev.tar\improved_multi_select-7.x-2.x-dev\improved_multi_sel



Similar documents
Developers Guide version 1.1

jquery Tutorial for Beginners: Nothing But the Goods

Using an Access Database

Using jquery and CSS to Gain Easy Wins in CiviCRM

This matches a date in the MM/DD/YYYY format in the years The date must include leading zeros.

All V7 registers support barcode printing, except the Sharp 410/420 1A ROM and that limitation is based upon the register.

ICP Data Validation and Aggregation Module Training document. HHC Data Validation and Aggregation Module Training Document

Web Intelligence User Guide

UComment. UComment is a comment component for Umbraco, it makes it very easy to add comment functionality to any Umbraco content document you wish.

Virto Active Directory Service for SharePoint. Release Installation and User Guide

Subject Tool Remarks What is JQuery. Slide Javascript Library

RBC myfinance Tracker Expense Analysis

History Explorer. View and Export Logged Print Job Information WHITE PAPER

UNIVERSITY OF CALGARY Information Technologies WEBFORMS DRUPAL 7 WEB CONTENT MANAGEMENT

( François Agneray. Octobre 2012

Create a New Database in Access 2010

How To Set Up A Smartwork Course

Customer to Partner Relationship

Mobile Web Design with HTML5, CSS3, JavaScript and JQuery Mobile Training BSP-2256 Length: 5 days Price: $ 2,895.00

RDM+ Remote Desktop for Android. Getting Started Guide

1 P a g e. Copyright CRMKnowledge.

Printing Schedules. Website:

MyState Internet Banking User Guide

Client Timesheet and Expense Instructions Page 1

customer rewards Use this guide to create customized customer rewards and redeem points earned by customers.

WebFOCUS BI Portal: S.I.M.P.L.E. as can be


WinFlexOne Version 8 How To Guide. Claims Processing

Accounts Receivable. Payment Posting

MicroStrategy Quick Guide: Creating Prompts ITU Data Mart Support Group, Reporting Services

ALON MP3 Dictaphone. User's manual. 1. Introduction 2. Audio Player 3. Voice Dictaphone 4. Phone calls recorder 5. Customer support.

What's New In DITA CMS 4.0

HTML Egg Pro. Tutorials

Access 2010: The Navigation Pane

Click to create a query in Design View. and click the Query Design button in the Queries group to create a new table in Design View.

Web Development Recipes

Application Note No. 12

Purple Mash Shared Folders

Multi-Union Membership System

Trouble Ticket Express

Baylor Secure Messaging. For Non-Baylor Users

Creating a Test in Blackboard

jquery Sliding Image Gallery

Access Tutorial 3 Maintaining and Querying a Database. Microsoft Office 2013 Enhanced

GFI FAXmaker 14 for Exchange/Lotus/SMTP. Fax-Client Manual. By GFI Software Ltd

Tutorial 3 Maintaining and Querying a Database

Managing users. Account sources. Chapter 1

Resco Mobile CRM Woodford (Rules Guide) Document version

User Guide for TeamDirection Dashboard

To access assessments, click the Assessments icon to be directed to the Find Assessments page.

NEW USER REGISTRATION AND VERIFICATION

Creating Dashboards. Intellicus Enterprise Reporting and BI Platform. Intellicus Technologies

Installing and Sending with DocuSign for NetSuite v2.2

How QuickBooks desktop edition features and data are translated into QuickBooks Online: Legend Customers Vendors Employees Banking Lists

Access Database Design

Internet Technologies

1. To start Installation: To install the reporting tool, copy the entire contents of the zip file to a directory of your choice. Run the exe.

Specify the location of an HTML control stored in the application repository. See Using the XPath search method, page 2.

What s new? Tips & Tricks

RECIMG MANAGER USER GUIDE SlimWare Utilities 1 of 7

QaTraq Pro Scripts Manual - Professional Test Scripts Module for QaTraq. QaTraq Pro Scripts. Professional Test Scripts Module for QaTraq

Configuring the JEvents Component

Creating a New MS-Access Database

Chapter 7: Historical and manual data entry

Resource database input tool: Create new resource or a new event process

Adagio Ledger 9.2A 1 of 7 GL Sep-15

The purpose of jquery is to make it much easier to use JavaScript on your website.

Chronicle USER MANUAL

Outlook 2016 for Mac: Advanced Quick Reference Guide

Working with sections in Word

Timed Organizer User s Manual

SKYWARD. Data Mining. Quick Reference Guide

CMSC434 TUTORIAL #3 HTML CSS JavaScript Jquery Ajax + Google AppEngine Mobile WebApp HTML5

SmartTouch R CRM Enhancements. 1. Administrators now have an Account Preferences Section where you can view s & phones in search views.

ITS Spam Filtering Service Quick Guide 2: Using the Quarantine

Merchant On The Move Android Professional Edition User Guide and Tutorial

DVBLink TVSource. Installation and configuration manual

Managing documents, files and folders

Utility Billing Software Manual

ACCOUNT RECEIVABLES TABLE OF CONTENTS

1. Online help for WorkZone Client What's new Getting started with WorkZone Client Working with the user interface 15

Quarantine Central for end users: FAQs

IT Service Manager Agent Guide

To determine the fields in a table decide what you need to know about the subject. Here are a few tips:

M i m o s a A r c h i v e S o f t w a r e ~ S e a r c h i n g f o r m e s s a g e s. Outline. Introduction to Mimosa Archive

Welcome to the topic on creating key performance indicators in SAP Business One, release 9.1 version for SAP HANA.

CHARGE Anywhere Designed for Use with QuickBooks

Introducing Katun Dealer Fleet Management Version 3.0!

Jive Case Escalation for Salesforce

Website in a box 2.0 Users Guide. Contact: enquiries@healthwatch.co.uk Website:

Tutorial JavaScript: Switching panels using a radio button

Dolly Drive User Manual

Transcription:

1 (function ($) { 2 Drupal.behaviors.improved_multi_select = { 3 attach: function(context, settings) { 4 if (settings.improved_multi_select && settings.improved_multi_select. selectors) { 5 var options = settings.improved_multi_select; 6 7 for (var key in options.selectors) { 8 var selector = options.selectors[key]; 9 $(selector, context).once('improvedselect', 10 var $select = $(this), 11 movebuttons = '', 12 improvedselect_id = $select.attr('id'), 13 $cloned_select = null, 14 cloned_select_id = ''; 15 if (options.orderable) { 16 // If the select is orderable then we clone the original select 17 // so that we have the original ordering to use later. 18 $cloned_select = $select.clone(); 19 cloned_select_id = $cloned_select.attr('id'); 20 cloned_select_id += '-cloned'; 21 $cloned_select.attr('id', cloned_select_id); 22 $cloned_select.appendto($select.parent()).hide(); 23 // Move button markup to add to the widget. 24 movebuttons = '<span class="move_up" sid="' + $select.attr('id') + '">' + Drupal.checkPlain(options.buttontext_moveup) + '</span>' + 25 '<span class="move_down" sid="' + $select.attr('id') + '">' + Drupal.checkPlain(options. buttontext_movedown) + '</span>'; 26 } 27 $select.parent().append( 28 '<div class="improvedselect" sid="' + $select.attr('id') + '" id="improvedselect-' + $select.attr('id') + '">' + 29 '<div class="improvedselect-text-wrapper">' + 30 '<input type="text" class="improvedselect_filter" sid="' + $select.attr('id') + '" prev="" />' + 31 '</div>' + 32 '<ul class="improvedselect_sel"></ul>' + 33 '<ul class="improvedselect_all"></ul>' + 34 '<div class="improvedselect_control">' + 35 '<span class="add" sid="' + $select.attr('id') + '">' + Drupal.checkPlain(options.buttontext_add) + '</span>' + 36 '<span class="del" sid="' + $select.attr('id') + '">' + Drupal.checkPlain(options.buttontext_del) + '</span>' + 37 '<span class="add_all" sid="' + $select.attr('id') + '">' + Drupal.checkPlain(options.buttontext_addall) + '</span>' + 38 '<span class="del_all" sid="' + $select.attr('id') + '">' + Drupal.checkPlain(options.buttontext_delall) + '</span>' + 39 movebuttons + 40 '</div>' + 41 '<div class="clear"></div>' + 42 '</div>'); 43 if ($select.find('optgroup').has('option').length > 0) { 44 $select.parent().find('.improvedselect').addclass('has_group'); 45 // Build groups. 46 $('#improvedselect-' + improvedselect_id + '.improvedselect-text-wrapper', context) -1-

47.after('<div class="improvedselect_tabs-wrapper" sid="' + $select.attr('id') + '"><ul class="improvedselect_tabs"></ul></div>'); 48 $select.find('optgroup').has('option').each( 49 $('#improvedselect-' + improvedselect_id + '.improvedselect_tabs', context) 50.append('<li><a href="">' + $(this).attr('label') + '</a></li>'); 51 }); 52 // Show all groups option. 53 $('#improvedselect-' + improvedselect_id + '.improvedselect_tabs', context) 54.prepend('<li class="all"><a href="">' + Drupal.t('All') + '</a></li>'); 55 // Select group. 56 $('#improvedselect-' + improvedselect_id + '.improvedselect_tabs li a', context).click(function(e) { 57 var $group = $(this), 58 sid = $group.parent().parent().parent().attr('sid'); 59 $('#improvedselect-' + improvedselect_id + '.improvedselect_tabs li.selected', context).removeclass( 'selected').find('a').unwrap(); 60 $group.wrap('<div>').parents('li').first().addclass('selected'); 61 62 // Any existing selections in the all list need to be unselected 63 // if they aren't part of the newly selected group. 64 if (!$group.hasclass('all')) { 65 $('#improvedselect-' + improvedselect_id + '.improvedselect_all li.selected[group!=' + $group.text() + ']', context).removeclass('selected'); 66 } 67 68 // Clear the filter if we have to. 69 if (options.groupresetfilter) { 70 // Clear filter box. 71 $('#improvedselect-' + improvedselect_id + '.improvedselect_filter', context).val(''); 72 } 73 // Force re-filtering. 74 $('#improvedselect-' + improvedselect_id + '.improvedselect_filter', context).attr('prev', ''); 75 // Re-filtering will handle the rest. 76 improvedselectfilter(sid, options, context); 77 e.preventdefault(); 78 }); 79 // Select all to begin. 80 $('#improvedselect-' + improvedselect_id + '.improvedselect_tabs li.all a', context).click(); 81 } 82 83 $select.find('option, optgroup').each( 84 var $opt = $(this), 85 group = ''; 86 if ($opt.attr('tagname') == 'OPTGROUP') { 87 if ($opt.has('option').length) { 88 $('#improvedselect-'+ improvedselect_id +'.improvedselect_all', context) -2-

89.append('<li isgroup="isgroup" so="---' + $opt.attr('label') + '---">--- '+ $opt.attr('label') +' ---</li>'); 90 } 91 } 92 else { 93 group = $opt.parent("optgroup").attr("label"); 94 if (group) { 95 group = ' group="' + group + '"'; 96 } 97 if ($opt.attr('selected')) { 98 $('#improvedselect-' + improvedselect_id + '.improvedselect_sel', context) 99.append('<li so="' + $opt.attr('value') + '"' + group + '>' + $opt.text() + '</li>'); 100 } 101 else { 102 $('#improvedselect-' + improvedselect_id + '.improvedselect_all', context) 103.append('<li so="' + $opt.attr('value') + '"' + group + '>' + $opt.text() + '</li>'); 104 } 105 } 106 }); 107 $('#improvedselect-'+ improvedselect_id + '.improvedselect_sel li, #improvedselect-' + improvedselect_id + '.improvedselect_all li[isgroup!="isgroup"]', context).click( 108 $(this).toggleclass('selected'); 109 }); 110 $select.hide(); 111 // Double click feature request. 112 $('#improvedselect-'+ improvedselect_id + '.improvedselect_sel li, #improvedselect-' + improvedselect_id + '.improvedselect_all li[isgroup!="isgroup"]', context).dblclick( 113 // Store selected items. 114 var selected = $(this).parent().find('li.selected'), 115 current_class = $(this).parent().attr('class'); 116 // Add item. 117 if (current_class == 'improvedselect_all') { 118 $(this).parent().find('li.selected').removeclass('selected'); 119 $(this).addclass('selected'); 120 $(this).parent().parent().find('.add').click(); 121 } 122 // Remove item. 123 else { 124 $(this).parent().find('li.selected').removeclass('selected'); 125 $(this).addclass('selected'); 126 $(this).parent().parent().find('.del').click(); 127 } 128 // Restore selected items. 129 if (selected.length) { 130 for (var k = 0; k < selected.length; k++) { 131 if ($(selected[k]).parent().attr('class') == current_class) { 132 $(selected[k]).addclass('selected'); 133 } 134 } 135 } 136 }); -3-

137 138 // Set the height of the select fields based on the height of the 139 // parent, otherwise it can end up with a lot of wasted space. 140 $('.improvedselect_sel,.improvedselect_all').each( 141 $(this).height($(this).parent().height() - 35); 142 }); 143 }); 144 } 145 146 $('.improvedselect_filter', context).keyup( 147 improvedselectfilter($(this).attr('sid'), options, context); 148 }); 149 150 // Add selected items. 151 $('.improvedselect.add', context).click( 152 var sid = $(this).attr('sid'); 153 $('#improvedselect-' + sid + '.improvedselect_all.selected', context ).each( 154 $opt = $(this); 155 $opt.removeclass('selected'); 156 improvedselectupdategroupvisibility($opt, 1); 157 $('#improvedselect-' + sid + '.improvedselect_sel', context).append ($opt); 158 }); 159 improvedselectupdate(sid, context); 160 }); 161 162 // Remove selected items. 163 $('.improvedselect.del', context).click( 164 var sid = $(this).attr('sid'); 165 $('#improvedselect-' + sid + '.improvedselect_sel.selected', context ).each( 166 $opt = $(this); 167 $opt.removeclass('selected'); 168 $('#improvedselect-' + sid + '.improvedselect_all', context).append ($opt); 169 improvedselectupdategroupvisibility($opt, 0); 170 }); 171 // Force re-filtering. 172 $('#improvedselect-' + sid + '.improvedselect_filter', context).attr( 'prev', ''); 173 // Re-filtering will handle the rest. 174 improvedselectfilter(sid, options, context); 175 improvedselectupdate(sid, context); 176 }); 177 178 // Add all items. 179 $('.improvedselect.add_all', context).click( 180 var sid = $(this).attr('sid'); 181 $('#improvedselect-' + sid + '.improvedselect_all li[isgroup!=isgroup]', context).each( 182 $opt = $(this); 183 if ($opt.css('display')!= 'none') { 184 $opt.removeclass('selected'); 185 improvedselectupdategroupvisibility($opt, 1); 186 $('#improvedselect-' + sid + '.improvedselect_sel', context). append($opt); -4-

187 } 188 }); 189 improvedselectupdate(sid, context); 190 }); 191 192 // Remove all items. 193 $('.improvedselect.del_all', context).click( 194 var sid = $(this).attr('sid'); 195 $('#improvedselect-' + sid + '.improvedselect_sel li', context).each( 196 $opt = $(this); 197 $opt.removeclass('selected'); 198 $('#improvedselect-' + sid + '.improvedselect_all', context).append ($opt); 199 improvedselectupdategroupvisibility($opt, 0); 200 }); 201 // Force re-filtering. 202 $('#improvedselect-' + sid + '.improvedselect_filter', context).attr( 'prev', ''); 203 // Re-filtering will handle the rest. 204 improvedselectfilter(sid, options, context); 205 improvedselectupdate(sid, context); 206 }); 207 208 // Move selected items up. 209 $('.improvedselect.move_up', context).click( 210 var sid = $(this).attr('sid'); 211 $('#improvedselect-' + sid + '.improvedselect_sel.selected', context ).each( 212 var $selected = $(this); 213 // Don't move selected items past other selected items or there will 214 // be problems when moving multiple items at once. 215 $selected.prev(':not(.selected)').before($selected); 216 }); 217 improvedselectupdate(sid, context); 218 }); 219 220 // Move selected items down. 221 $('.improvedselect.move_down', context).click( 222 var sid = $(this).attr('sid'); 223 // Run through the selections in reverse, otherwise problems occur 224 // when moving multiple items at once. 225 $($('#improvedselect-' + sid + '.improvedselect_sel.selected', context).get().reverse()).each( 226 var $selected = $(this); 227 // Don't move selected items past other selected items or there will 228 // be problems when moving multiple items at once. 229 $selected.next(':not(.selected)').after($selected); 230 }); 231 improvedselectupdate(sid, context); 232 }); 233 } 234 } 235 }; 236 237 /** 238 * Filter the all options list. -5-

239 */ 240 function improvedselectfilter(sid, options, context) { 241 $filter = $('.improvedselect_filter', context); 242 // Get current selected group. 243 var $selectedgroup = $('#improvedselect-' + sid + '.improvedselect_tabs li.selected:not(.all) a', context), 244 text = $filter.val(), 245 pattern, 246 regex, 247 words; 248 249 if (text.length && text!= $filter.attr('prev')) { 250 $filter.attr('prev', text); 251 switch (options.filtertype) { 252 case 'partial': 253 default: 254 pattern = text; 255 break; 256 case 'exact': 257 pattern = '^' + text + '$'; 258 break; 259 case 'anywords': 260 words = text.split(' '); 261 pattern = ''; 262 for (var i = 0; i < words.length; i++) { 263 if (words[i]) { 264 pattern += (pattern)? ' \\b' + words[i] + '\\b' : '\\b' + words[i ] + '\\b'; 265 } 266 } 267 break; 268 case 'anywords_partial': 269 words = text.split(' '); 270 pattern = ''; 271 for (var i = 0; i < words.length; i++) { 272 if (words[i]) { 273 pattern += (pattern)? ' ' + words[i] + '' : words[i]; 274 } 275 } 276 break; 277 case 'allwords': 278 words = text.split(' '); 279 pattern = '^'; 280 // Add a lookahead for each individual word. 281 // Lookahead is used because the words can match in any order 282 // so this makes it simpler and faster. 283 for (var i = 0; i < words.length; i++) { 284 if (words[i]) { 285 pattern += '(?=.*?\\b' + words[i] + '\\b)'; 286 } 287 } 288 break; 289 case 'allwords_partial': 290 words = text.split(' '); 291 pattern = '^'; 292 // Add a lookahead for each individual word. 293 // Lookahead is used because the words can match in any order -6-

294 // so this makes it simpler and faster. 295 for (var i = 0; i < words.length; i++) { 296 if (words[i]) { 297 pattern += '(?=.*?' + words[i] + ')'; 298 } 299 } 300 break; 301 } 302 303 regex = new RegExp(pattern,'i'); 304 $('#improvedselect-' + sid + '.improvedselect_all li', context).each( 305 $opt = $(this); 306 if ($opt.attr('isgroup')!= 'isgroup') { 307 var str = $opt.text(); 308 if (str.match(regex) && (!$selectedgroup.length $selectedgroup.text () == $opt.attr('group'))) { 309 $opt.show(); 310 if ($opt.attr('group')) { 311 // If a group is selected we don't need to show groups. 312 if (!$selectedgroup.length) { 313 $opt.siblings('li[isgroup="isgroup"][so="---' + $opt.attr( 'group') + '---"]').show(); 314 } 315 else { 316 $opt.siblings('li[isgroup="isgroup"][so="---' + $opt.attr( 'group') + '---"]').hide(); 317 } 318 } 319 } 320 else { 321 $opt.hide(); 322 if ($opt.attr('group')) { 323 if ($opt.siblings('li[isgroup!="isgroup"][group="' + $opt.attr( 'group') + '"]:visible').length == 0) { 324 $opt.siblings('li[isgroup="isgroup"][so="---' + $opt.attr( 'group') + '---"]').hide(); 325 } 326 } 327 } 328 } 329 }); 330 } 331 else { 332 if (!text.length) { 333 $filter.attr('prev', ''); 334 } 335 $('#improvedselect-' + sid + '.improvedselect_all li', context).each( 336 var $opt = $(this); 337 if ($opt.attr('isgroup')!= 'isgroup') { 338 if (!$selectedgroup.length $selectedgroup.text() == $opt.attr( 'group')) { 339 $opt.show(); 340 } 341 else { 342 $opt.hide(); -7-

343 } 344 improvedselectupdategroupvisibility($opt, 0); 345 } 346 }); 347 } 348 } 349 350 /** 351 * Update the visibility of an option's group. 352 * 353 * @param $opt 354 * A jquery object of a select option. 355 * @param numitems 356 * How many items should be considered an empty group. Generally zero or one 357 * depending on if an item has been or is going to be removed or added. 358 */ 359 function improvedselectupdategroupvisibility($opt, numitems) { 360 var $selectedgroup = $opt.parents('.improvedselect').first().find( '.improvedselect_tabs li.selected:not(.all) a'); 361 362 // Don't show groups if a group is selected. 363 if ($opt.parent().children('li[isgroup!="isgroup"][group="' + $opt.attr( 'group') + '"]:visible').length <= numitems $selectedgroup.length) { 364 $opt.siblings('li[isgroup="isgroup"][so="---' + $opt.attr('group') + '---"]').hide(); 365 } 366 else { 367 $opt.siblings('li[isgroup="isgroup"][so="---' + $opt.attr('group') + '---"]').show(); 368 } 369 } 370 371 function improvedselectupdate(sid, context) { 372 // If we have sorting enabled, make sure we have the results sorted. 373 var $select = $('#' + sid), 374 $cloned_select = $('#' + sid + '-cloned'); 375 376 if ($cloned_select.length) { 377 $select.find('option, optgroup').remove(); 378 $('#improvedselect-' + sid + '.improvedselect_sel li', context).each( 379 var $li = $(this); 380 $select.append($('<option></option').attr('value', $li.attr('so')).attr( 'selected', 'selected').text($li.text())); 381 }); 382 // Now that the select has the options in the correct order, use the 383 // cloned select for resetting the ul values. 384 $select = $cloned_select; 385 } 386 else { 387 $select.find('option:selected').attr("selected", ""); 388 $('#improvedselect-' + sid + '.improvedselect_sel li', context).each( 389 $('#' + sid + ' [value="' + $(this).attr('so') + '"]', context).attr( "selected", "selected"); 390 }); 391 } -8-

392 393 $select.find('option, optgroup').each( 394 $opt = $(this); 395 if ($opt.attr('tagname') == 'OPTGROUP') { 396 if ($opt.has('option').length) { 397 $('#improvedselect-' + sid + '.improvedselect_all', context).append($ ('#improvedselect-' + sid + '.improvedselect_all [so="---' + $opt. attr('label') + '---"]', context)); 398 } 399 } 400 else { 401 // When using reordering, the options will be from the cloned select, 402 // meaning that there will be none selected, which means that items 403 // in the selected list will not be reordered, which is what we want. 404 if ($opt.attr("selected")) { 405 $('#improvedselect-' + sid + '.improvedselect_sel', context).append($ ('#improvedselect-' + sid + '.improvedselect_sel [so="' + $opt.attr( 'value') + '"]', context)); 406 } 407 else { 408 $('#improvedselect-' + sid + '.improvedselect_all', context).append($ ('#improvedselect-' + sid + '.improvedselect_all [so="' + $opt.attr( 'value') + '"]', context)); 409 } 410 } 411 }); 412 // Don't use the $select variable here as it might be the clone. 413 // Tell the ajax system the select has changed. 414 $('#'+ sid, context).trigger('change'); 415 } 416 417 })(jquery, Drupal); 418-9-