jquery.cascadingdropdown.min.js.map 22 KB

1
  1. {"version":3,"sources":["jquery.cascadingdropdown.js"],"names":["$","undefined","defaultOptions","usePost","useJson","Dropdown","options","parent","this","el","selector","extend","name","paramName","attr","requiredDropdowns","requires","length","join","isLoadingClassName","CascadingDropdown","element","selectBoxes","_init","prototype","_create","self","pending","initialised","initialState","clone","data","originalDropdownItems","children","onChange","change","event","requirementsMet","_requirementsMet","value","call","val","getRequiredValues","onEnable","on","onDisable","update","_initSource","_destroy","replaceWith","removeData","enable","removeAttr","triggerHandler","disable","requireAll","filter","isArray","source","request","response","map","item","label","selected","url","xhr","abort","ajax","JSON","stringify","dataType","type","contentType","success","error","each","instance","setSelected","_triggerReady","addClass","_response","items","_renderItems","removeClass","find","remove","append","index","_renderItem","push","toString","key","itemData","i","indexOrValue","triggerChange","dropdownItems","selectedValue","selectedItems","concat","is","dropdowns","counter","onReady","bind","readyEventHandler","unbind","getValues","destroy","values","fn","cascadingDropdown","methodOrOptions","$this","args","arguments","apply","Array","slice","jQuery"],"mappings":";CAAA,SAAAA,EAAAC,GACA,aAEA,IAAAC,EAAA,CACAC,SAAA,EACAC,SAAA,GAIA,SAAAC,EAAAC,EAAAC,GACAC,KAAAC,GAAAT,EAAAM,EAAAI,SAAAH,EAAAE,IACAD,KAAAD,OAAAA,EACAC,KAAAF,QAAAN,EAAAW,OAAA,GAAAT,EAAAI,GACAE,KAAAI,KAAAJ,KAAAF,QAAAO,WAAAL,KAAAC,GAAAK,KAAA,QACAN,KAAAO,kBAAAT,EAAAU,UAAAV,EAAAU,SAAAC,OAAAjB,EAAAM,EAAAU,SAAAE,KAAA,KAAAX,EAAAE,IAAA,KACAD,KAAAW,mBAAAX,KAAAF,QAAAa,oBAAAZ,EAAAD,QAAAa,oBAAA,6BA2SA,SAAAC,EAAAC,EAAAf,GACAE,KAAAC,GAAAT,EAAAqB,GACAb,KAAAF,QAAAN,EAAAW,OAAA,CAAAW,YAAA,IAAAhB,GACAE,KAAAe,QA1SAlB,EAAAmB,UAAA,CACAC,QAAA,WACA,IAAAC,EAAAlB,KAEAkB,EAAAC,QAAA,EACAD,EAAAE,aAAA,EACAF,EAAAG,aAAAH,EAAAjB,GAAAqB,OAAA,GACAJ,EAAAjB,GAAAsB,KAAA,2BAAAvB,MACAkB,EAAAM,sBAAAN,EAAAjB,GAAAwB,SAAA,UAGA,mBAAAP,EAAApB,QAAA4B,UACAR,EAAAjB,GAAA0B,OAAA,SAAAC,GACA,IAAAC,EAAAX,EAAAY,oBAAAZ,EAAAjB,GAAA,GAAA8B,MACAb,EAAApB,QAAA4B,SAAAM,KAAAd,EAAAU,EAAAV,EAAAjB,GAAAgC,MAAAf,EAAAgB,oBAAAL,KAIA,mBAAAX,EAAApB,QAAAqC,UACAjB,EAAAjB,GAAAmC,GAAA,UAAA,SAAAR,GACAV,EAAApB,QAAAqC,SAAAH,KAAAd,EAAAU,EAAAV,EAAAjB,GAAAgC,SAIA,mBAAAf,EAAApB,QAAAuC,WACAnB,EAAAjB,GAAAmC,GAAA,WAAA,SAAAR,GACAV,EAAApB,QAAAuC,UAAAL,KAAAd,EAAAU,EAAAV,EAAAjB,GAAAgC,SAIAf,EAAAX,mBACAW,EAAAX,kBAAAoB,OAAA,WACAT,EAAAoB,WAKApB,EAAAqB,cAGArB,EAAAoB,UAIAE,SAAA,WACAxC,KAAAC,GAAAwC,YAAAzC,KAAAqB,cAAAqB,WAAA,6BAIAC,OAAA,WACA3C,KAAAC,GAAAK,KAAA,cAAAb,GACAO,KAAAC,GAAA2C,WAAA,YAAAC,eAAA,YAIAC,QAAA,WACA9C,KAAAC,GAAAK,KAAA,cAAAb,GACAO,KAAAC,GAAAK,KAAA,WAAA,YAAAuC,eAAA,aAIAf,iBAAA,WACA,IAAAZ,EAAAlB,KAEA,OAAAkB,EAAAX,oBAIAW,EAAApB,QAAAiD,WACA7B,EAAAX,kBAAAyC,OAAA,WACA,QAAAxD,EAAAQ,MAAAiC,QACAxB,QAAAS,EAAApB,QAAAU,SAAAC,OAIA,EAFAS,EAAAX,kBAAAyC,OAAA,WACA,QAAAxD,EAAAQ,MAAAiC,QACAxB,SAKA8B,YAAA,WACA,IAAArB,EAAAlB,KAEA,GAAAR,EAAAyD,QAAA/B,EAAApB,QAAAoD,QACAlD,KAAAkD,OAAA,SAAAC,EAAAC,GACAA,EAAA5D,EAAA6D,IAAAnC,EAAApB,QAAAoD,OAAA,SAAAI,GACA,MAAA,CACAC,MAAAD,EAAAC,OAAAD,EAAAvB,OAAAuB,EACAvB,MAAAuB,EAAAvB,OAAAuB,EAAAC,OAAAD,EACAE,SAAAF,EAAAE,mBAIA,GAAA,iBAAAtC,EAAApB,QAAAoD,OAAA,CACA,IAAAO,EAAAvC,EAAApB,QAAAoD,OAEAlD,KAAAkD,OAAA,SAAAC,EAAAC,GACAlC,EAAAwC,KACAxC,EAAAwC,IAAAC,QAEAzC,EAAAwC,IAAAlE,EAAAoE,KAAA,CACAH,IAAAA,EACAlC,KAAAL,EAAApB,QAAAF,QAAAiE,KAAAC,UAAAX,GAAAA,EACAY,SAAA7C,EAAApB,QAAAF,QAAA,OAAAH,EACAuE,KAAA9C,EAAApB,QAAAH,QAAA,OAAA,MACAsE,YAAA,kCACAC,QAAA,SAAA3C,GACA6B,EAAA7B,IAEA4C,MAAA,WACAf,EAAA,aAKApD,KAAAkD,OAAAhC,EAAApB,QAAAoD,QAIAhB,kBAAA,WACA,IAAAX,EAAA,GAUA,OATAvB,KAAAO,mBACAf,EAAA4E,KAAApE,KAAAO,kBAAA,WACA,IAAA8D,EAAA7E,EAAAQ,MAAAuB,KAAA,4BACA8C,EAAAjE,OACAmB,EAAA8C,EAAAjE,MAAAiE,EAAApE,GAAAgC,SAKAV,GAIAe,OAAA,WACA,IAAApB,EAAAlB,KAMA,GAHAkB,EAAA4B,WAGA5B,EAAAY,mBAGA,OAFAZ,EAAAoD,YAAA,GACApD,EAAAqD,gBACArD,EAAAjB,GAIA,IAAAiB,EAAAgC,OAGA,OAFAhC,EAAAyB,SACAzB,EAAAqD,gBACArD,EAAAjB,GAIAiB,EAAAjB,GAAAgC,IAAA,IAAAN,SAGA,IAAAJ,EAAAL,EAAAgB,oBAOA,OAJAhB,EAAAC,UACAD,EAAAjB,GAAAuE,SAAAtD,EAAAP,oBACAO,EAAAgC,OAAA3B,EAAAL,EAAAuD,aAEAvD,EAAAjB,IAGAwE,UAAA,SAAAC,GACA,IAAAxD,EAAAlB,KAEA,OAAA,SAAA0E,GACAxD,EAAAyD,aAAAD,GAEAxD,EAAAC,UACAD,EAAAC,SACAD,EAAAjB,GAAA2E,YAAA1D,EAAAP,sBAMAgE,aAAA,SAAAD,GACA,IAAAxD,EAAAlB,KAMA,GAHAkB,EAAAjB,GAAA4E,KAAA,oBAAAC,SACA5D,EAAAjB,GAAA8E,OAAA7D,EAAAM,uBAEAkD,EAAA,CAKA,IAAAlB,EAAA,GAEAhE,EAAAyD,QAAAyB,GACAlF,EAAA4E,KAAAM,EAAA,SAAAM,EAAA1B,GACApC,EAAAjB,GAAA8E,OAAA7D,EAAA+D,YAAA3B,IACAA,EAAAE,UAAAA,EAAA0B,KAAA5B,EAAAvB,MAAAoD,cAGA3F,EAAA4E,KAAAM,EAAA,SAAAU,EAAArD,GACA,IAAAsD,EAAA,GACAA,EAAAH,KAAA,oBAAAE,EAAA,MACA,IAAA,IAAAE,EAAA,EAAAA,EAAAvD,EAAAtB,OAAA6E,IAAA,CACA,IAAAhC,EAAAvB,EAAAuD,GACAD,EAAAH,KAAAhE,EAAA+D,YAAA3B,IACAA,EAAAE,UAAAA,EAAA0B,KAAA5B,EAAAvB,MAAAoD,YAEAE,EAAAH,KAAA,eACAhE,EAAAjB,GAAA8E,OAAAM,EAAA3E,KAAA,OAKAQ,EAAAyB,SAGAa,EAAA/C,QAAAS,EAAAoD,YAAAd,GAEAtC,EAAAqD,qBA/BArD,EAAAqD,iBAkCAU,YAAA,SAAA3B,GACA,MAAA,kBAAAA,EAAAvB,MAAA,KAAAuB,EAAAE,SAAA,YAAA,IAAA,IAAAF,EAAAC,MAAA,aAIAgB,cAAA,WACAvE,KAAAoB,cAGApB,KAAAF,QAAA0D,UAAAxD,KAAAsE,YAAAtE,KAAAF,QAAA0D,UAEAxD,KAAAoB,aAAA,EACApB,KAAAC,GAAA4C,eAAA,WAIAyB,YAAA,SAAAiB,EAAAC,GACA,IAAAtE,EAAAlB,KACAyF,EAAAvE,EAAAjB,GAAA4E,KAAA,eAGA,IAAAW,IACAA,GAAA,GAGA,IASAE,EATAC,EAAA,GA0CA,OAtCAA,EADAnG,EAAAyD,QAAAsC,GACAA,EAEAI,EAAAC,OAAAL,GAIArE,EAAAjB,GAAA4F,GAAA,cACAH,EAAAC,EAAAtC,IAAA,SAAAC,GACA,MAAA,iBAAAA,GACAA,IAAA7D,IACA,EAAA6D,GACAA,EAAAmC,EAAAhF,OACAgF,EAAAnC,GAAAvB,MAGAuB,KAIAoC,EAAAC,EAAA,GAGA,iBAAAA,EAAA,IACAA,EAAA,KAAAlG,IACA,EAAAkG,EAAA,IACAA,EAAA,GAAAF,EAAAhF,SACAiF,EAAAD,EAAAE,EAAA,IAAA5D,QAKAb,EAAAjB,GAAAgC,IAAAyD,GAGAF,GACAtE,EAAAjB,GAAA0B,SAGAT,EAAAjB,KAUAW,EAAAI,UAAA,CACAD,MAAA,WACA,IAAAG,EAAAlB,KAEAkB,EAAAC,QAAA,EAGAD,EAAA4E,UAAA,GAEA,IAAAA,EAAAtG,EAAAA,EAAA6D,IAAAnC,EAAApB,QAAAgB,YAAA,SAAAwC,GACA,OAAAA,EAAApD,WACAQ,KAAA,KAAAQ,EAAAjB,IAGA8F,EAAA,EAYA,mBAAA7E,EAAApB,QAAAkG,SACAF,EAAAG,KAAA,QAZA,SAAAC,EAAAtE,KACAmE,GAAAD,EAAArF,SACAqF,EAAAK,OAAA,QAAAD,GACAhF,EAAApB,QAAAkG,QAAAhE,KAAAd,EAAAU,EAAAV,EAAAkF,gBAYA,mBAAAlF,EAAApB,QAAA4B,UACAoE,EAAAG,KAAA,SATA,SAAArE,GACAV,EAAApB,QAAA4B,SAAAM,KAAAd,EAAAU,EAAAV,EAAAkF,eAYA5G,EAAA4E,KAAAlD,EAAApB,QAAAgB,YAAA,WAEA,IAAAuD,EAAA,IAAAxE,EAAAG,KAAAkB,GAGAA,EAAA4E,UAAAZ,KAAAb,GAGAA,EAAApD,aAKAoF,QAAA,WAMA,OALA7G,EAAA4E,KAAApE,KAAA8F,UAAA,SAAAd,EAAA1B,GACAA,EAAAd,aAEAxC,KAAAC,GAAAyC,WAAA,4BAEA1C,KAAAC,IAIAmG,UAAA,WACA,IAAAE,EAAA,GASA,OANA9G,EAAA4E,KAAApE,KAAA8F,UAAA,SAAAd,EAAAX,GACAA,EAAAjE,OACAkG,EAAAjC,EAAAjE,MAAAiE,EAAApE,GAAAgC,SAIAqE,IAKA9G,EAAA+G,GAAAC,kBAAA,SAAAC,GACA,IAAAC,EAAAlH,EAAAQ,MACA2G,EAAAC,UACAvC,EAAAqC,EAAAnF,KAAA,4BAEA,GAAA,iBAAAkF,IAAAA,EACA,OAAApC,GAAAqC,EAAAnF,KAAA,2BAAA,IAAAX,EAAAZ,KAAAyG,IACA,GAAA,iBAAAA,EACA,GAAApC,GAEA,GAAAA,EAAAoC,GACA,OAAApC,EAAAoC,GAAAI,MAAAxC,EAAAyC,MAAA9F,UAAA+F,MAAA/E,KAAA2E,EAAA,SAFAnH,EAAA2E,MAAA,sBAAAsC,EAAA,sBAKAjH,EAAA2E,MAAA,UAAAsC,EAAA,gDAvZA,CA0ZAO","file":"jquery.cascadingdropdown.min.js","sourcesContent":["/*! jquery-cascading-dropdown 1.2.9 | (c) 2019 Dzulqarnain Nasir <dzul1983@gmail.com> | MIT */\n(function ($, undefined) {\r\n 'use strict';\r\n\r\n var defaultOptions = {\r\n usePost: false,\r\n useJson: false\r\n };\r\n\r\n // Constructor\r\n function Dropdown(options, parent) {\r\n this.el = $(options.selector, parent.el);\r\n this.parent = parent;\r\n this.options = $.extend({}, defaultOptions, options);\r\n this.name = this.options.paramName || this.el.attr('name');\r\n this.requiredDropdowns = options.requires && options.requires.length ? $(options.requires.join(','), parent.el) : null;\r\n this.isLoadingClassName = this.options.isLoadingClassName || parent.options.isLoadingClassName || 'cascading-dropdown-loading';\r\n }\r\n\r\n // Methods\r\n Dropdown.prototype = {\r\n _create: function() {\r\n var self = this;\r\n\r\n self.pending = 0;\r\n self.initialised = false;\r\n self.initialState = self.el.clone(true);\r\n self.el.data('plugin_cascadingDropdown', this);\r\n self.originalDropdownItems = self.el.children('option');\r\n\r\n // Init event handlers\r\n if(typeof self.options.onChange === 'function') {\r\n self.el.change(function(event) {\r\n var requirementsMet = self._requirementsMet() && self.el[0].value;\r\n self.options.onChange.call(self, event, self.el.val(), self.getRequiredValues(), requirementsMet);\r\n });\r\n }\r\n\r\n if(typeof self.options.onEnable === 'function') {\r\n self.el.on('enabled', function(event) {\r\n self.options.onEnable.call(self, event, self.el.val());\r\n });\r\n }\r\n\r\n if(typeof self.options.onDisable === 'function') {\r\n self.el.on('disabled', function(event) {\r\n self.options.onDisable.call(self, event, self.el.val());\r\n });\r\n }\r\n\r\n if(self.requiredDropdowns) {\r\n self.requiredDropdowns.change(function(event) {\r\n self.update();\r\n });\r\n }\r\n\r\n // Init source\r\n self._initSource();\r\n\r\n // Call update\r\n self.update();\r\n },\r\n \r\n // Destroys the instance and reverts everything back to initial state\r\n _destroy: function() {\r\n this.el.replaceWith(this.initialState).removeData('plugin_cascadingDropdown');\r\n },\r\n\r\n // Enables the dropdown\r\n enable: function() {\r\n if(this.el.attr('disabled') === undefined) return;\r\n this.el.removeAttr('disabled').triggerHandler('enabled');\r\n },\r\n\r\n // Disables the dropdown\r\n disable: function() {\r\n if(this.el.attr('disabled') !== undefined) return;\r\n this.el.attr('disabled', 'disabled').triggerHandler('disabled');\r\n },\r\n\r\n // Checks if required dropdowns have value\r\n _requirementsMet: function() {\r\n var self = this;\r\n\r\n if(!self.requiredDropdowns) {\r\n return true;\r\n }\r\n\r\n if(self.options.requireAll) { // If requireAll is true, return true if all dropdowns have values\r\n return (self.requiredDropdowns.filter(function() {\r\n return !!$(this).val();\r\n }).length == self.options.requires.length);\r\n } else { // Otherwise, return true if any one of the required dropdowns has value\r\n return (self.requiredDropdowns.filter(function() {\r\n return !!$(this).val();\r\n }).length > 0);\r\n }\r\n },\r\n\r\n // Defines dropdown item list source - inspired by jQuery UI Autocomplete\r\n _initSource: function() {\r\n var self = this;\r\n\r\n if($.isArray(self.options.source)) {\r\n this.source = function(request, response) {\r\n response($.map(self.options.source, function(item) {\r\n return {\r\n label: item.label || item.value || item,\r\n value: item.value || item.label || item,\r\n selected: item.selected\r\n };\r\n }));\r\n };\r\n } else if ( typeof self.options.source === 'string' ) {\r\n var url = self.options.source;\r\n\r\n this.source = function(request, response) {\r\n if ( self.xhr ) {\r\n self.xhr.abort();\r\n }\r\n self.xhr = $.ajax({\r\n url: url,\r\n data: self.options.useJson ? JSON.stringify(request) : request,\r\n dataType: self.options.useJson ? 'json' : undefined,\r\n type: self.options.usePost ? 'post' : 'get',\r\n contentType: 'application/json; charset=utf-8',\r\n success: function(data) {\r\n response(data);\r\n },\r\n error: function() {\r\n response([]);\r\n }\r\n });\r\n };\r\n } else {\r\n this.source = self.options.source;\r\n }\r\n },\r\n\r\n getRequiredValues: function() {\r\n var data = {};\r\n if(this.requiredDropdowns) {\r\n $.each(this.requiredDropdowns, function() {\r\n var instance = $(this).data('plugin_cascadingDropdown');\r\n if(instance.name) {\r\n data[instance.name] = instance.el.val();\r\n }\r\n });\r\n }\r\n\r\n return data;\r\n },\r\n\r\n // Update the dropdown\r\n update: function() {\r\n var self = this;\r\n\r\n // Disable it first\r\n self.disable();\r\n\r\n // If required dropdowns have no value, return\r\n if(!self._requirementsMet()) {\r\n self.setSelected(0);\r\n self._triggerReady();\r\n return self.el;\r\n }\r\n\r\n // If source isn't defined, it's most likely a static dropdown, so just enable it\r\n if(!self.source) {\r\n self.enable();\r\n self._triggerReady();\r\n return self.el;\r\n }\r\n\r\n // Reset the dropdown value so we don't trigger a false call\r\n self.el.val('').change();\r\n\r\n // Fetch data from required dropdowns\r\n var data = self.getRequiredValues();\r\n\r\n // Pass it to defined source for processing\r\n self.pending++;\r\n self.el.addClass(self.isLoadingClassName);\r\n self.source(data, self._response());\r\n\r\n return self.el;\r\n },\r\n\r\n _response: function(items) {\r\n var self = this;\r\n\r\n return function(items) {\r\n self._renderItems(items);\r\n\r\n self.pending--;\r\n if(!self.pending) {\r\n self.el.removeClass(self.isLoadingClassName);\r\n }\r\n }\r\n },\r\n\r\n // Render the dropdown items\r\n _renderItems: function(items) {\r\n var self = this;\r\n\r\n // Remove all dropdown items and restore to initial state\r\n self.el.find('option, optgroup').remove();\r\n self.el.append(self.originalDropdownItems);\r\n\r\n if(!items) {\r\n self._triggerReady();\r\n return;\r\n }\r\n\r\n var selected = [];\r\n\r\n if ($.isArray(items)) {\r\n $.each(items, function(index, item) {\r\n self.el.append(self._renderItem(item));\r\n if (item.selected) selected.push(item.value.toString());\r\n });\r\n } else {\r\n $.each(items, function(key, value) {\r\n var itemData = [];\r\n itemData.push('<optgroup label=\"' + key + '\">');\r\n for (var i = 0; i < value.length; i++) {\r\n var item = value[i];\r\n itemData.push(self._renderItem(item));\r\n if (item.selected) selected.push(item.value.toString());\r\n }\r\n itemData.push('</optgroup>');\r\n self.el.append(itemData.join(''));\r\n });\r\n }\r\n\r\n // Enable the dropdown\r\n self.enable();\r\n\r\n // If a selected item exists, set it as default\r\n selected.length && self.setSelected(selected);\r\n\r\n self._triggerReady();\r\n },\r\n\r\n _renderItem: function(item) {\r\n return '<option value=\"' + item.value + '\"' + (item.selected ? ' selected' : '') + '>' + item.label + '</option>';\r\n },\r\n\r\n // Trigger the ready event when instance is initialised for the first time\r\n _triggerReady: function() {\r\n if(this.initialised) return;\r\n\r\n // Set selected dropdown item if defined\r\n this.options.selected && this.setSelected(this.options.selected);\r\n\r\n this.initialised = true;\r\n this.el.triggerHandler('ready');\r\n },\r\n\r\n // Sets the selected dropdown item\r\n setSelected: function(indexOrValue, triggerChange) {\r\n var self = this,\r\n dropdownItems = self.el.find('option');\r\n\r\n // Trigger change event by default\r\n if(typeof triggerChange === 'undefined') {\r\n triggerChange = true;\r\n }\r\n \r\n var selectedItems = [];\r\n \r\n // check if indexOrValue is an array\r\n if($.isArray(indexOrValue)) {\r\n selectedItems = indexOrValue;\r\n } else {\r\n selectedItems = selectedItems.concat(indexOrValue);\r\n }\r\n\r\n var selectedValue;\r\n if(self.el.is('[multiple]')) {\r\n selectedValue = selectedItems.map(function(item) {\r\n if(typeof item === 'number'\r\n && (item !== undefined \r\n && item > -1 \r\n && item < dropdownItems.length)) {\r\n return dropdownItems[item].value\r\n }\r\n \r\n return item;\r\n });\r\n\r\n } else {\r\n selectedValue = selectedItems[0];\r\n\r\n // if selected item is a number, get the value for the item at that index\r\n if(typeof selectedItems[0] === 'number' \r\n && (selectedItems[0] !== undefined \r\n && selectedItems[0] > -1 \r\n && selectedItems[0] < dropdownItems.length)) {\r\n selectedValue = dropdownItems[selectedItems[0]].value;\r\n }\r\n }\r\n \r\n // Set the dropdown item\r\n self.el.val(selectedValue);\r\n\r\n // Trigger change event\r\n if(triggerChange) {\r\n self.el.change();\r\n }\r\n\r\n return self.el;\r\n }\r\n };\r\n\r\n function CascadingDropdown(element, options) {\r\n this.el = $(element);\r\n this.options = $.extend({ selectBoxes: [] }, options);\r\n this._init();\r\n }\r\n\r\n CascadingDropdown.prototype = {\r\n _init: function() {\r\n var self = this;\r\n\r\n self.pending = 0;\r\n\r\n // Instance array\r\n self.dropdowns = [];\r\n \r\n var dropdowns = $($.map(self.options.selectBoxes, function(item) {\r\n return item.selector;\r\n }).join(','), self.el);\r\n\r\n // Init event handlers\r\n var counter = 0;\r\n function readyEventHandler(event) {\r\n if(++counter == dropdowns.length) { // Once all dropdowns are ready, unbind the event handler, and execute onReady\r\n dropdowns.unbind('ready', readyEventHandler);\r\n self.options.onReady.call(self, event, self.getValues());\r\n }\r\n }\r\n\r\n function changeEventHandler(event) {\r\n self.options.onChange.call(self, event, self.getValues());\r\n }\r\n \r\n if(typeof self.options.onReady === 'function') {\r\n dropdowns.bind('ready', readyEventHandler);\r\n }\r\n\r\n if(typeof self.options.onChange === 'function') {\r\n dropdowns.bind('change', changeEventHandler);\r\n }\r\n\r\n // Init dropdowns\r\n $.each(self.options.selectBoxes, function(index, item) {\r\n // Create the instance\r\n var instance = new Dropdown(this, self);\r\n\r\n // Insert it into the dropdown instance array\r\n self.dropdowns.push(instance);\r\n\r\n // Call the create method\r\n instance._create();\r\n });\r\n },\r\n \r\n // Destroys the instance and reverts everything back to its initial state \r\n destroy: function() {\r\n $.each(this.dropdowns, function(index, item){\r\n item._destroy();\r\n });\r\n this.el.removeData('plugin_cascadingDropdown');\r\n \r\n return this.el;\r\n },\r\n\r\n // Fetches the values from all dropdowns in this group\r\n getValues: function() {\r\n var values = {};\r\n\r\n // Build the object and insert values from instances with name\r\n $.each(this.dropdowns, function(index, instance) {\r\n if(instance.name) {\r\n values[instance.name] = instance.el.val();\r\n }\r\n });\r\n\r\n return values;\r\n }\r\n }\r\n\r\n // jQuery plugin declaration\r\n $.fn.cascadingDropdown = function(methodOrOptions) {\r\n var $this = $(this),\r\n args = arguments,\r\n instance = $this.data('plugin_cascadingDropdown');\r\n\r\n if(typeof methodOrOptions === 'object' || !methodOrOptions) {\r\n return !instance && $this.data('plugin_cascadingDropdown', new CascadingDropdown(this, methodOrOptions));\r\n } else if(typeof methodOrOptions === 'string') {\r\n if(!instance) {\r\n $.error('Cannot call method ' + methodOrOptions + ' before init.');\r\n } else if(instance[methodOrOptions]) {\r\n return instance[methodOrOptions].apply(instance, Array.prototype.slice.call(args, 1))\r\n }\r\n } else {\r\n $.error('Method ' + methodOrOptions + ' does not exist in jQuery.cascadingDropdown');\r\n }\r\n };\r\n})(jQuery);\r\n"]}