{"version":3,"file":"kendo.selectable.min.js","names":["factory","define","amd","$","undefined$1","kendo","window","Widget","ui","abs","Math","ARIASELECTED","SELECTED","ACTIVE","SELECTABLE","CHANGE","UNSELECT","UNSELECTING","msie","support","browser","supportEventDelegation","extend","on","find","trigger","end","off","Selectable","init","element","options","multiple","dragToSelect","that","this","fn","call","_marquee","_lastActive","addClass","relatedTarget","userEvents","UserEvents","global","allowSelection","filter","tap","_tap","bind","touchAction","_start","_move","_end","_select","events","name","inputSelectors","noop","ignoreOverlapped","addIdToRanges","_isElement","target","idx","elements","length","result","e","selected","ctrlKey","event","metaKey","shiftKey","selectedClass","whichCode","which","buttonCode","button","closest","_allowSelection","hasClass","add","_lastRange","compareElements","selectRange","_firstSelectee","_notify","_unselect","value","clear","_downTarget","currentElement","useAllItems","_items","sender","capture","appendTo","document","body","css","left","x","client","top","y","width","height","_selectElement","cancel","position","startLocation","location","initialDelta","_invalidateSelectables","preventDefault","rangeSelectedAttr","attr","uid","guid","remove","removeClass","i","_currentlyActive","related","toSelect","items","eq","collision","_collidesWithActiveElement","push","marqueeRect","activeElementRect","activeElements","elemRect","getBoundingClientRect","leftRight","isRtl","tempRect","right","bottom","overlaps","val","selectElement","each","selectedRanges","map","_","elem","rangeId","mapLocation","selectedSingleItems","toArray","preventNotify","isPrevented","aria","args","removeAttr","_activeElement","is","resetTouchEvents","start","tmp","continuousItems","inArray","destroy","toCompare","elementPosition","getOffset","_outerWidth","_outerHeight","firstRect","secondRect","parseOptions","selectable","selectableMode","mode","asLowerString","toLowerCase","indexOf","cell","plugin","jQuery"],"sources":["kendo.selectable.js"],"mappings":"CAAA,SAAWA,GACW,mBAAXC,QAAyBA,OAAOC,IAAMD,OAAO,CAAC,iBAAkB,wBAAyBD,GAChGA,IAFJ,EAGG,YASC,SAAUG,EAAGC,GACT,IAAIC,EAAQC,OAAOD,MACfE,EAASF,EAAMG,GAAGD,OAClBE,EAAMC,KAAKD,IACXE,EAAe,gBACfC,EAAW,aACXC,EAAS,cACTC,EAAa,eACbC,EAAS,SAETC,EAAW,WACXC,EAAc,gBAEdC,EAAOb,EAAMc,QAAQC,QAAQF,KAC7BG,GAAyB,EACzBC,EAASnB,EAAEmB,QAEX,SAAUnB,GAEFA,EAAE,2CACDoB,GAAG,QAAS,MAAM,WACfF,GAAyB,KAE5BG,KAAK,QACLC,QAAQ,SACRC,MACAC,MATT,CAWGxB,GAEP,IAAIyB,EAAarB,EAAOe,OAAO,CAC3BO,KAAM,SAASC,EAASC,GACpB,IACIC,EACAC,EAFAC,EAAOC,KAIX5B,EAAO6B,GAAGP,KAAKQ,KAAKH,EAAMJ,EAASC,GAEnCG,EAAKI,SAAWnC,EAAE,oEAClB+B,EAAKK,YAAc,KACnBL,EAAKJ,QAAQU,SAAS1B,GAEtBoB,EAAKO,cAAgBP,EAAKH,QAAQU,cAElCT,EAAWE,EAAKH,QAAQC,SACxBC,EAAeC,EAAKH,QAAQE,aAE5BC,EAAKQ,WAAa,IAAIrC,EAAMsC,WAAWT,EAAKJ,QAAS,CACjDc,QAAQ,EACRC,gBAAgB,EAChBC,QAAUzB,EAAkD,GAAzB,kBAA+Ba,EAAKH,QAAQe,OAC/EC,IAAKb,EAAKc,KAAKC,KAAKf,GACpBgB,YAAalB,EAAW,OAAS,gBAGjCA,IACIC,GACAC,EAAKQ,WACAO,KAAK,QAASf,EAAKiB,OAAOF,KAAKf,IAC/Be,KAAK,OAAQf,EAAKkB,MAAMH,KAAKf,IAC7Be,KAAK,MAAOf,EAAKmB,KAAKJ,KAAKf,IAEpCA,EAAKQ,WACDO,KAAK,SAAUf,EAAKoB,QAAQL,KAAKf,MAI7CqB,OAAQ,CAACxC,EAAQC,GAEjBe,QAAS,CACLyB,KAAM,aACNV,OAAQ,KACRW,eA5DY,sPA6DZzB,UAAU,EACVC,cAAc,EACdQ,cAAetC,EAAEuD,KACjBC,kBAAkB,EAClBC,eAAe,GAGnBC,WAAY,SAASC,GACjB,IACIC,EADAC,EAAW7B,KAAKL,QACXmC,EAASD,EAASC,OAAQC,GAAS,EAI5C,IAFAJ,EAASA,EAAO,GAEXC,EAAM,EAAGA,EAAME,EAAQF,IACxB,GAAIC,EAASD,KAASD,EAAQ,CAC1BI,GAAS,EACT,MAIR,OAAOA,GAGXlB,KAAM,SAASmB,GACX,IAMIC,EANAN,EAAS3D,EAAEgE,EAAEL,QACb5B,EAAOC,KACPkC,EAAUF,EAAEG,MAAMD,SAAWF,EAAEG,MAAMC,QACrCvC,EAAWE,EAAKH,QAAQC,SACxBwC,EAAWxC,GAAYmC,EAAEG,MAAME,SAC/BC,EAAgBvC,EAAKH,QAAQ0C,eAAiB7D,EAE9C8D,EAAYP,EAAEG,MAAMK,MACpBC,EAAaT,EAAEG,MAAMO,QAGpB3C,EAAK2B,WAAWC,EAAOgB,QAAQ,IAAMhE,KAAgB4D,GAA0B,GAAbA,GAAkBE,GAA4B,GAAdA,GAIlGzC,KAAK4C,gBAAgBZ,EAAEG,MAAMR,UAIlCM,EAAWN,EAAOkB,SAASP,GAE3BX,EAASA,EAAOmB,IAAI/C,EAAKO,cAAcqB,IAElC9B,EAUGwC,GACKtC,EAAKgD,YAAeC,EAAgBjD,EAAKgD,WAAYpB,KACtD5B,EAAKkD,YAAYlD,EAAKmD,iBAAkBvB,EAAQK,GAChDjC,EAAKoD,QAAQvE,EAAQoD,IAEzBjC,EAAKgD,WAAapB,IAElB5B,EAAKgD,WAAa,KACdd,GAAYC,GACZnC,EAAKqD,UAAUzB,GACf5B,EAAKoD,QAAQvE,EAAQoD,IACdE,GACPnC,EAAKsD,MAAM1B,EAAQK,GACnBjC,EAAKoD,QAAQvE,EAAQoD,MACbC,GAAYlC,EAAKsD,QAAQvB,OAAS,KAC1C/B,EAAKuD,QACLvD,EAAKsD,MAAM1B,EAAQK,GACnBjC,EAAKoD,QAAQvE,EAAQoD,IAGzBjC,EAAKK,YAAcL,EAAKwD,YAAc5B,GA7BtCM,GAAYC,GACZnC,EAAKqD,UAAUzB,GACf5B,EAAKoD,QAAQvE,EAAQoD,IACbC,IACRlC,EAAKuD,QACLvD,EAAKsD,MAAM1B,EAAQK,GACnBjC,EAAKoD,QAAQvE,EAAQoD,MA4BjChB,OAAQ,SAASgB,GACb,IAIIwB,EAJAzD,EAAOC,KACP2B,EAAS3D,EAAEgE,EAAEL,QACbW,EAAgBvC,EAAKH,QAAQ0C,eAAiB7D,EAC9CwD,EAAWN,EAAOkB,SAASP,GAE3BJ,EAAUF,EAAEG,MAAMD,SAAWF,EAAEG,MAAMC,QAEpCpC,KAAK4C,gBAAgBZ,EAAEG,MAAMR,UAIlC5B,EAAKwD,YAAc5B,EAGd5B,EAAK2B,WAAWC,EAAOgB,QAAQ,IAAMhE,KAKtCoB,EAAKH,QAAQ6D,YACb1D,EAAK2D,OAAS3D,EAAKJ,QAAQN,KAAKU,EAAKH,QAAQe,SAE7C6C,EAAiB7B,EAAOgB,QAAQ5C,EAAKJ,SACrCI,EAAK2D,OAASF,EAAenE,KAAKU,EAAKH,QAAQe,SAGnDqB,EAAE2B,OAAOC,UAET7D,EAAKI,SACA0D,SAASC,SAASC,MAClBC,IAAI,CACDC,KAAMjC,EAAEkC,EAAEC,OAAS,EACnBC,IAAKpC,EAAEqC,EAAEF,OAAS,EAClBG,MAAO,EACPC,OAAQ,IAGXrC,GACDnC,EAAKuD,QAGT3B,EAASA,EAAOmB,IAAI/C,EAAKO,cAAcqB,IACnCM,IACAlC,EAAKyE,eAAe7C,GAAQ,GACxBO,GACAP,EAAOtB,SAASvB,KA9BpBiB,EAAKQ,WAAWkE,WAmCxBxD,MAAO,SAASe,GACZ,IACI0C,EAAW,CACPT,KAAMjC,EAAEkC,EAAES,cAAgB3C,EAAEkC,EAAEU,SAAW5C,EAAEkC,EAAEU,SAAW5C,EAAEkC,EAAES,cAC5DP,IAAKpC,EAAEqC,EAAEM,cAAgB3C,EAAEqC,EAAEO,SAAW5C,EAAEqC,EAAEO,SAAW5C,EAAEqC,EAAEM,cAC3DL,MAAOhG,EAAI0D,EAAEkC,EAAEW,cACfN,OAAQjG,EAAI0D,EAAEqC,EAAEQ,eALb7E,KAQNG,SAAS6D,IAAIU,GARP1E,KAUN8E,uBAAuBJ,EAAW1C,EAAEG,MAAMD,SAAWF,EAAEG,MAAMC,SAElEJ,EAAE+C,kBAGN7D,KAAM,SAASc,GACX,IAAIjC,EAAOC,KACXgF,EAAoB9G,EAAM+G,KAAK,kBAC/BC,EAAMhH,EAAMiH,OAEZpF,EAAKI,SAASiF,SAEdrF,EAAKqD,UAAUrD,EAAKJ,QACfN,KAAKU,EAAKH,QAAQe,OAAS,IAAM7B,IACjCuG,YAAYvG,GAGjB,IAAI6C,EAAS5B,EAAKJ,QAAQN,KAAKU,EAAKH,QAAQe,OAAS,IAAMjC,GAG3D,GAFAiD,EAASA,EAAOmB,IAAI/C,EAAKO,cAAcqB,IAEnC5B,EAAKH,QAAQ6B,cACb,IAAK,IAAI6D,EAAI,EAAGA,EAAIvF,EAAKwF,iBAAiBzD,OAAQwD,IAC9CtH,EAAE+B,EAAKwF,iBAAiBD,IAAIL,KAAKD,EAAmBE,GAIvDnF,EAAKgD,YAAeC,EAAgBjD,EAAKgD,WAAYpB,KACtD5B,EAAKsD,MAAM1B,EAAQK,GACnBjC,EAAKoD,QAAQvE,EAAQoD,IAEzBjC,EAAKgD,WAAapB,EAClB5B,EAAKK,YAAcL,EAAKwD,YACxBxD,EAAK2D,OAAS,MAGlBoB,uBAAwB,SAASJ,EAAUxC,GACvC,IAAIN,EACAE,EAIA0D,EACAC,EAJA9D,EAAS3B,KAAKuD,YAAY,GAC1BmC,EAAQ1F,KAAK0D,OACbpB,EAAgBtC,KAAKJ,QAAQ0C,eAAiB7D,EAMlD,IAFAuB,KAAKuF,iBAAmB,GAEnB3D,EAAM,EAAGE,EAAS4D,EAAM5D,OAAQF,EAAME,EAAQF,IAE/C4D,GADAC,EAAWC,EAAMC,GAAG/D,IACDkB,IAAI9C,KAAKM,cAAcmF,IAEtCG,EAAUH,EAAUf,IAChBe,EAAS5C,SAASP,GACdJ,GAAWP,IAAW8D,EAAS,IAC/BD,EAAQH,YAAY/C,GAAejC,SAASvB,GAExC2G,EAAS5C,SAASnE,IAAY+G,EAAS5C,SAAS/D,IAAiBkB,KAAK6F,2BAA2BL,EAASd,IAClHc,EAAQnF,SAAS3B,GAErBsB,KAAKuF,iBAAiBO,KAAKN,EAAQ,KAE/BC,EAAS5C,SAASnE,GAClB8G,EAAQH,YAAY3G,GACbwD,GAAWuD,EAAS5C,SAAS/D,IACpC0G,EAAQH,YAAYvG,GAAauB,SAASiC,IAM1DuD,2BAA4B,SAASlG,EAASoG,GAC1C,IAAK/F,KAAKJ,QAAQ4B,iBACd,OAAO,EAGX,IAEIwE,EAFAC,EAAiBjG,KAAKuF,iBACtBW,EAAWvG,EAAQ,GAAGwG,wBAEtBP,GAAY,EAEZQ,EADQlI,EAAMc,QAAQqH,MAAM1G,GACR,QAAU,OAC9B2G,EAAW,GAEfP,EAAYQ,MAAQR,EAAY9B,KAAO8B,EAAYzB,MACnDyB,EAAYS,OAAST,EAAY3B,IAAM2B,EAAYxB,OAEnD,IAAK,IAAIe,EAAI,EAAGA,EAAIW,EAAenE,OAAQwD,IAEvC,GAAImB,EAASP,EADbF,EAAoBC,EAAeX,GAAGa,yBACK,CAGvC,GAFAG,EAASF,GAA2B,SAAdA,EAAuBJ,EAAkBO,MAAQP,EAAkB/B,MACzFiC,EAAW/G,EAAO,GAAI+G,EAAUI,IACnBrC,KAAOiC,EAASK,MACzB,OAAO,EAEXX,GAAaa,EAASP,EAAUH,GAGxC,OAAOH,GAGXvC,MAAO,SAASqD,GACZ,IAAI3G,EAAOC,KACP2G,EAAgB5G,EAAKyE,eAAe1D,KAAKf,GAE7C,IAAI2G,EAQJ,OAAO3G,EAAKJ,QAAQN,KAAKU,EAAKH,QAAQe,OAAS,KAAOZ,EAAKH,QAAQ0C,eAAiB7D,IAPhFiI,EAAIE,MAAK,WACLD,EAAc3G,UAS1B6G,eAAgB,WACZ,IACI7B,EAAoB9G,EAAM+G,KAAK,kBAC/B6B,EAAM,GAaV,OAfW9G,KAINL,QAAQN,KAAK,IAAM2F,EAAoB,KAAK4B,MAAK,SAASG,EAAGC,GAC9D,IAAIC,EAAUjJ,EAAEgJ,GAAM/B,KAAKD,GACvBkC,EAAcJ,EAAIG,GAEjBC,IACDA,EAAcJ,EAAIG,GAAW,IAGjCC,EAAYpB,KAAK9H,EAAEgJ,OAGhBF,GAGXK,oBAAqB,WACjB,IAAIpH,EAAOC,KACPgF,EAAoB9G,EAAM+G,KAAK,kBAEnC,OAAOlF,EAAKJ,QAAQN,KAAKU,EAAKH,QAAQe,OAAS,KAAOZ,EAAKH,QAAQ0C,eAAiB7D,GAAY,SAAWuG,EAAoB,MAAMoC,UAAUN,KAAI,SAASE,GACxJ,OAAOhJ,EAAEgJ,OAIjB9D,eAAgB,WACZ,IACIjB,EADAlC,EAAOC,KAGX,OAAyB,OAArBD,EAAKK,YACEL,EAAKK,aAGhB6B,EAAWlC,EAAKsD,SACAvB,OAAS,EACjBG,EAAS,GACTlC,EAAKJ,QAAQN,KAAKU,EAAKH,QAAQe,QAAQ,IAGnD6D,eAAgB,SAAS7E,EAAS0H,GAC9B,IAAI5B,EAAWzH,EAAE2B,GACb2C,EAAgBtC,KAAKJ,QAAQ0C,eAAiB7D,EAC9C6I,GAAeD,GAAiBrH,KAAKmD,QAAQ,SAAU,CAAExD,QAASA,IAEtE8F,EAASJ,YAAY3G,GAChB4I,IACA7B,EAASpF,SAASiC,GAEftC,KAAKJ,QAAQ2H,MACb9B,EAASR,KAAKzG,GAAc,KAKxC2E,QAAS,SAAS9B,EAAMmG,GAEpB,OADAA,EAAOA,GAAQ,GACRxH,KAAKV,QAAQ+B,EAAMmG,IAG9BpE,UAAW,SAASzD,GAChB,IAAIK,KAAKV,QAAQT,EAAU,CAAEc,QAASA,IAAtC,CAIA,IAAIqF,EAAoB9G,EAAM+G,KAAK,kBAQnC,OANAtF,EAAQ0F,YAAYrF,KAAKJ,QAAQ0C,eAAiB7D,GAAUgJ,WAAWzC,GAEnEhF,KAAKJ,QAAQ2H,MACb5H,EAAQsF,KAAKzG,GAAc,GAGxBmB,IAGXwB,QAAS,SAASa,GACVhC,KAAK4C,gBAAgBZ,EAAEG,MAAMR,WACxB5C,GAASA,IAASf,EAAEE,EAAMwJ,kBAAkBC,GAAG3H,KAAKJ,QAAQ0B,kBAC7DU,EAAE+C,kBAKdnC,gBAAiB,SAASjB,GACtB,OAAI3D,EAAE2D,GAAQgG,GAAG3H,KAAKJ,QAAQ0B,kBAC1BtB,KAAKO,WAAWkE,SAChBzE,KAAKuD,YAAc,MACZ,IAMfqE,iBAAkB,WACd5H,KAAKO,WAAWkE,UAGpBnB,MAAO,WACH,IAAIoC,EAAQ1F,KAAKL,QAAQN,KAAKW,KAAKJ,QAAQe,OAAS,KAAOX,KAAKJ,QAAQ0C,eAAiB7D,IACzFuB,KAAKoD,UAAUsC,IAGnBzC,YAAa,SAAS4E,EAAOtI,GACzB,IACIqC,EACAkG,EACApC,EAHA3F,EAAOC,KA4BX,IAvBAD,EAAKuD,QAEDvD,EAAKJ,QAAQmC,OAAS,IACtB4D,EAAQ3F,EAAKH,QAAQmI,mBAGpBrC,GAAUA,EAAM5D,SACjB4D,EAAQ3F,EAAKJ,QAAQN,KAAKU,EAAKH,QAAQe,UAG3CkH,EAAQ7J,EAAEgK,QAAQhK,EAAE6J,GAAO,GAAInC,KAC/BnG,EAAMvB,EAAEgK,QAAQhK,EAAEuB,GAAK,GAAImG,MAGvBoC,EAAMD,EACNA,EAAQtI,EACRA,EAAMuI,GAGL/H,EAAKH,QAAQ6D,cACdlE,GAAOQ,EAAKJ,QAAQmC,OAAS,GAG5BF,EAAMiG,EAAOjG,GAAOrC,EAAKqC,IAC1B7B,EAAKyE,eAAekB,EAAM9D,IAAM,IAIxCqG,QAAS,WACL,IAAIlI,EAAOC,KAEX5B,EAAO6B,GAAGgI,QAAQ/H,KAAKH,GAEvBA,EAAKJ,QAAQH,IAldZ,oBAodDO,EAAKQ,WAAW0H,UAEhBlI,EAAKI,SAAWJ,EAAKK,YAAcL,EAAKJ,QAAUI,EAAKQ,WAAa,QAa5E,SAASyC,EAAgBrD,EAASuI,GAE9B,GAAIvI,EAAQmC,SAAWoG,EAAUpG,OAC7B,OAAO,EAGX,IAAK,IAAIwD,EAAI,EAAGA,EAAI3F,EAAQmC,OAAQwD,IAChC,GAAI3F,EAAQ2F,KAAO4C,EAAU5C,GACzB,OAAO,EAIf,OAAO,EAGX,SAASM,EAAUjG,EAAS+E,GACxB,IAAK/E,EAAQgI,GAAG,YACZ,OAAO,EAGX,IAAIQ,EAAkBjK,EAAMkK,UAAUzI,GAClC4G,EAAQ7B,EAAST,KAAOS,EAASJ,MACjCkC,EAAS9B,EAASN,IAAMM,EAASH,OAKrC,OAHA4D,EAAgB5B,MAAQ4B,EAAgBlE,KAAO/F,EAAMmK,YAAY1I,GACjEwI,EAAgB3B,OAAS2B,EAAgB/D,IAAMlG,EAAMoK,aAAa3I,KAEzDwI,EAAgBlE,KAAOsC,GAC5B4B,EAAgB5B,MAAQ7B,EAAST,MACjCkE,EAAgB/D,IAAMoC,GACtB2B,EAAgB3B,OAAS9B,EAASN,KAG1C,SAASqC,EAAS8B,EAAWC,GACzB,QAASD,EAAUhC,OAASiC,EAAWvE,MACnCsE,EAAUtE,MAAQuE,EAAWjC,OAC7BgC,EAAU/B,QAAUgC,EAAWpE,KAC/BmE,EAAUnE,KAAOoE,EAAWhC,QA9CpC/G,EAAWgJ,aAAe,SAASC,GAC/B,IAAIC,EAAiBD,EAAWE,MAAQF,EACpCG,EAA0C,iBAAnBF,GAA+BA,EAAeG,cACzE,MAAO,CACHjJ,SAAUgJ,GAAiBA,EAAcE,QAAQ,aAAe,EAChEC,KAAMH,GAAiBA,EAAcE,QAAQ,SAAW,IA4ChE7K,EAAMG,GAAG4K,OAAOxJ,GAphBpB,CAshBGtB,OAAOD,MAAMgL","sourcesContent":["(function (factory) {\n typeof define === 'function' && define.amd ? define(['kendo.core', 'kendo.userevents'], factory) :\n factory();\n})((function () {\n var __meta__ = {\n id: \"selectable\",\n name: \"Selectable\",\n category: \"framework\",\n depends: [ \"core\", \"userevents\" ],\n advanced: true\n };\n\n (function($, undefined$1) {\n var kendo = window.kendo,\n Widget = kendo.ui.Widget,\n abs = Math.abs,\n ARIASELECTED = \"aria-selected\",\n SELECTED = \"k-selected\",\n ACTIVE = \"k-selecting\",\n SELECTABLE = \"k-selectable\",\n CHANGE = \"change\",\n NS = \".kendoSelectable\",\n UNSELECT = \"unselect\",\n UNSELECTING = \"k-unselecting\",\n INPUTSELECTOR = \"input,a,textarea,.k-multiselect-wrap,select,button,.k-button>span,.k-button>img,span.k-icon.k-i-arrow-60-down,span.k-icon.k-i-arrow-60-up,label.k-checkbox-label.k-no-text,.k-icon.k-i-collapse,.k-icon.k-i-expand,span.k-numeric-wrap,.k-focusable\",\n msie = kendo.support.browser.msie,\n supportEventDelegation = false,\n extend = $.extend;\n\n (function($) {\n (function() {\n $('
')\n .on(\"click\", \">*\", function() {\n supportEventDelegation = true;\n })\n .find(\"span\")\n .trigger(\"click\")\n .end()\n .off();\n })();\n })($);\n\n var Selectable = Widget.extend({\n init: function(element, options) {\n var that = this,\n multiple,\n dragToSelect;\n\n Widget.fn.init.call(that, element, options);\n\n that._marquee = $(\"
\");\n that._lastActive = null;\n that.element.addClass(SELECTABLE);\n\n that.relatedTarget = that.options.relatedTarget;\n\n multiple = that.options.multiple;\n dragToSelect = that.options.dragToSelect;\n\n that.userEvents = new kendo.UserEvents(that.element, {\n global: true,\n allowSelection: true,\n filter: (!supportEventDelegation ? \".\" + SELECTABLE + \" \" : \"\") + that.options.filter,\n tap: that._tap.bind(that),\n touchAction: multiple ? \"none\" : \"pan-x pan-y\"\n });\n\n if (multiple) {\n if (dragToSelect) {\n that.userEvents\n .bind(\"start\", that._start.bind(that))\n .bind(\"move\", that._move.bind(that))\n .bind(\"end\", that._end.bind(that));\n }\n that.userEvents\n .bind(\"select\", that._select.bind(that));\n }\n },\n\n events: [CHANGE, UNSELECT],\n\n options: {\n name: \"Selectable\",\n filter: \">*\",\n inputSelectors: INPUTSELECTOR,\n multiple: false,\n dragToSelect: true,\n relatedTarget: $.noop,\n ignoreOverlapped: false,\n addIdToRanges: false\n },\n\n _isElement: function(target) {\n var elements = this.element;\n var idx, length = elements.length, result = false;\n\n target = target[0];\n\n for (idx = 0; idx < length; idx ++) {\n if (elements[idx] === target) {\n result = true;\n break;\n }\n }\n\n return result;\n },\n\n _tap: function(e) {\n var target = $(e.target),\n that = this,\n ctrlKey = e.event.ctrlKey || e.event.metaKey,\n multiple = that.options.multiple,\n shiftKey = multiple && e.event.shiftKey,\n selectedClass = that.options.selectedClass || SELECTED,\n selected,\n whichCode = e.event.which,\n buttonCode = e.event.button;\n\n //in case of hierarchy or right-click\n if (!that._isElement(target.closest(\".\" + SELECTABLE)) || whichCode && whichCode == 3 || buttonCode && buttonCode == 2) {\n return;\n }\n\n if (!this._allowSelection(e.event.target)) {\n return;\n }\n\n selected = target.hasClass(selectedClass);\n\n target = target.add(that.relatedTarget(target));\n\n if (!multiple) {\n if (selected && ctrlKey) {\n that._unselect(target);\n that._notify(CHANGE, e);\n } else if (!selected) {\n that.clear();\n that.value(target, e);\n that._notify(CHANGE, e);\n }\n } else {\n if (shiftKey) {\n if (!that._lastRange || !compareElements(that._lastRange, target)) {\n that.selectRange(that._firstSelectee(), target, e);\n that._notify(CHANGE, e);\n }\n that._lastRange = target;\n } else {\n that._lastRange = null;\n if (selected && ctrlKey) {\n that._unselect(target);\n that._notify(CHANGE, e);\n } else if (ctrlKey) {\n that.value(target, e);\n that._notify(CHANGE, e);\n } else if (!selected || that.value().length > 1) {\n that.clear();\n that.value(target, e);\n that._notify(CHANGE, e);\n }\n\n that._lastActive = that._downTarget = target;\n }\n }\n },\n\n _start: function(e) {\n var that = this,\n target = $(e.target),\n selectedClass = that.options.selectedClass || SELECTED,\n selected = target.hasClass(selectedClass),\n currentElement,\n ctrlKey = e.event.ctrlKey || e.event.metaKey;\n\n if (!this._allowSelection(e.event.target)) {\n return;\n }\n\n that._downTarget = target;\n\n //in case of hierarchy\n if (!that._isElement(target.closest(\".\" + SELECTABLE))) {\n that.userEvents.cancel();\n return;\n }\n\n if (that.options.useAllItems) {\n that._items = that.element.find(that.options.filter);\n } else {\n currentElement = target.closest(that.element);\n that._items = currentElement.find(that.options.filter);\n }\n\n e.sender.capture();\n\n that._marquee\n .appendTo(document.body)\n .css({\n left: e.x.client + 1,\n top: e.y.client + 1,\n width: 0,\n height: 0\n });\n\n if (!ctrlKey) {\n that.clear();\n }\n\n target = target.add(that.relatedTarget(target));\n if (selected) {\n that._selectElement(target, true);\n if (ctrlKey) {\n target.addClass(UNSELECTING);\n }\n }\n },\n\n _move: function(e) {\n var that = this,\n position = {\n left: e.x.startLocation > e.x.location ? e.x.location : e.x.startLocation,\n top: e.y.startLocation > e.y.location ? e.y.location : e.y.startLocation,\n width: abs(e.x.initialDelta),\n height: abs(e.y.initialDelta)\n };\n\n that._marquee.css(position);\n\n that._invalidateSelectables(position, (e.event.ctrlKey || e.event.metaKey));\n\n e.preventDefault();\n },\n\n _end: function(e) {\n var that = this,\n rangeSelectedAttr = kendo.attr(\"range-selected\"),\n uid = kendo.guid();\n\n that._marquee.remove();\n\n that._unselect(that.element\n .find(that.options.filter + \".\" + UNSELECTING))\n .removeClass(UNSELECTING);\n\n\n var target = that.element.find(that.options.filter + \".\" + ACTIVE);\n target = target.add(that.relatedTarget(target));\n\n if (that.options.addIdToRanges) {\n for (var i = 0; i < that._currentlyActive.length; i++) {\n $(that._currentlyActive[i]).attr(rangeSelectedAttr, uid);\n }\n }\n\n if (!that._lastRange || !compareElements(that._lastRange, target)) {\n that.value(target, e);\n that._notify(CHANGE, e);\n }\n that._lastRange = target;\n that._lastActive = that._downTarget;\n that._items = null;\n },\n\n _invalidateSelectables: function(position, ctrlKey) {\n var idx,\n length,\n target = this._downTarget[0],\n items = this._items,\n selectedClass = this.options.selectedClass || SELECTED,\n related,\n toSelect;\n\n this._currentlyActive = [];\n\n for (idx = 0, length = items.length; idx < length; idx ++) {\n toSelect = items.eq(idx);\n related = toSelect.add(this.relatedTarget(toSelect));\n\n if (collision(toSelect, position)) {\n if (toSelect.hasClass(selectedClass)) {\n if (ctrlKey && target !== toSelect[0]) {\n related.removeClass(selectedClass).addClass(UNSELECTING);\n }\n } else if (!toSelect.hasClass(ACTIVE) && !toSelect.hasClass(UNSELECTING) && !this._collidesWithActiveElement(related, position)) {\n related.addClass(ACTIVE);\n }\n this._currentlyActive.push(related[0]);\n } else {\n if (toSelect.hasClass(ACTIVE)) {\n related.removeClass(ACTIVE);\n } else if (ctrlKey && toSelect.hasClass(UNSELECTING)) {\n related.removeClass(UNSELECTING).addClass(selectedClass);\n }\n }\n }\n },\n\n _collidesWithActiveElement: function(element, marqueeRect) {\n if (!this.options.ignoreOverlapped) {\n return false;\n }\n\n var activeElements = this._currentlyActive;\n var elemRect = element[0].getBoundingClientRect();\n var activeElementRect;\n var collision = false;\n var isRtl = kendo.support.isRtl(element);\n var leftRight = isRtl ? \"right\" : \"left\";\n var tempRect = {};\n\n marqueeRect.right = marqueeRect.left + marqueeRect.width;\n marqueeRect.bottom = marqueeRect.top + marqueeRect.height;\n\n for (var i = 0; i < activeElements.length; i++) {\n activeElementRect = activeElements[i].getBoundingClientRect();\n if (overlaps(elemRect, activeElementRect)) {\n tempRect[leftRight] = leftRight === \"left\" ? activeElementRect.right : activeElementRect.left;\n elemRect = extend({}, elemRect, tempRect);\n if (elemRect.left > elemRect.right) {\n return true;\n }\n collision = !overlaps(elemRect, marqueeRect);\n }\n }\n return collision;\n },\n\n value: function(val) {\n var that = this,\n selectElement = that._selectElement.bind(that);\n\n if (val) {\n val.each(function() {\n selectElement(this);\n });\n\n return;\n }\n\n return that.element.find(that.options.filter + \".\" + (that.options.selectedClass || SELECTED));\n },\n\n selectedRanges: function() {\n var that = this;\n var rangeSelectedAttr = kendo.attr(\"range-selected\");\n var map = {};\n\n that.element.find(\"[\" + rangeSelectedAttr + \"]\").each(function(_, elem) {\n var rangeId = $(elem).attr(rangeSelectedAttr);\n var mapLocation = map[rangeId];\n\n if (!mapLocation) {\n mapLocation = map[rangeId] = [];\n }\n\n mapLocation.push($(elem));\n });\n\n return map;\n },\n\n selectedSingleItems: function() {\n var that = this;\n var rangeSelectedAttr = kendo.attr(\"range-selected\");\n\n return that.element.find(that.options.filter + \".\" + (that.options.selectedClass || SELECTED) + \":not([\" + rangeSelectedAttr + \"])\").toArray().map(function(elem) {\n return $(elem);\n });\n },\n\n _firstSelectee: function() {\n var that = this,\n selected;\n\n if (that._lastActive !== null) {\n return that._lastActive;\n }\n\n selected = that.value();\n return selected.length > 0 ?\n selected[0] :\n that.element.find(that.options.filter)[0];\n },\n\n _selectElement: function(element, preventNotify) {\n var toSelect = $(element),\n selectedClass = this.options.selectedClass || SELECTED,\n isPrevented = !preventNotify && this._notify(\"select\", { element: element });\n\n toSelect.removeClass(ACTIVE);\n if (!isPrevented) {\n toSelect.addClass(selectedClass);\n\n if (this.options.aria) {\n toSelect.attr(ARIASELECTED, true);\n }\n }\n },\n\n _notify: function(name, args) {\n args = args || { };\n return this.trigger(name, args);\n },\n\n _unselect: function(element) {\n if (this.trigger(UNSELECT, { element: element })) {\n return;\n }\n\n var rangeSelectedAttr = kendo.attr(\"range-selected\");\n\n element.removeClass(this.options.selectedClass || SELECTED).removeAttr(rangeSelectedAttr);\n\n if (this.options.aria) {\n element.attr(ARIASELECTED, false);\n }\n\n return element;\n },\n\n _select: function(e) {\n if (this._allowSelection(e.event.target)) {\n if (!msie || (msie && !$(kendo._activeElement()).is(this.options.inputSelectors))) {\n e.preventDefault();\n }\n }\n },\n\n _allowSelection: function(target) {\n if ($(target).is(this.options.inputSelectors)) {\n this.userEvents.cancel();\n this._downTarget = null;\n return false;\n }\n\n return true;\n },\n\n resetTouchEvents: function() {\n this.userEvents.cancel();\n },\n\n clear: function() {\n var items = this.element.find(this.options.filter + \".\" + (this.options.selectedClass || SELECTED));\n this._unselect(items);\n },\n\n selectRange: function(start, end) {\n var that = this,\n idx,\n tmp,\n items;\n\n that.clear();\n\n if (that.element.length > 1) {\n items = that.options.continuousItems();\n }\n\n if (!items || !items.length) {\n items = that.element.find(that.options.filter);\n }\n\n start = $.inArray($(start)[0], items);\n end = $.inArray($(end)[0], items);\n\n if (start > end) {\n tmp = start;\n start = end;\n end = tmp;\n }\n\n if (!that.options.useAllItems) {\n end += that.element.length - 1;\n }\n\n for (idx = start; idx <= end; idx ++ ) {\n that._selectElement(items[idx], true);\n }\n },\n\n destroy: function() {\n var that = this;\n\n Widget.fn.destroy.call(that);\n\n that.element.off(NS);\n\n that.userEvents.destroy();\n\n that._marquee = that._lastActive = that.element = that.userEvents = null;\n }\n });\n\n Selectable.parseOptions = function(selectable) {\n var selectableMode = selectable.mode || selectable;\n var asLowerString = typeof selectableMode === \"string\" && selectableMode.toLowerCase();\n return {\n multiple: asLowerString && asLowerString.indexOf(\"multiple\") > -1,\n cell: asLowerString && asLowerString.indexOf(\"cell\") > -1\n };\n };\n\n function compareElements(element, toCompare) {\n\n if (element.length !== toCompare.length) {\n return false;\n }\n\n for (var i = 0; i < element.length; i++) {\n if (element[i] !== toCompare[i]) {\n return false;\n }\n }\n\n return true;\n }\n\n function collision(element, position) {\n if (!element.is(\":visible\")) {\n return false;\n }\n\n var elementPosition = kendo.getOffset(element),\n right = position.left + position.width,\n bottom = position.top + position.height;\n\n elementPosition.right = elementPosition.left + kendo._outerWidth(element);\n elementPosition.bottom = elementPosition.top + kendo._outerHeight(element);\n\n return !(elementPosition.left > right ||\n elementPosition.right < position.left ||\n elementPosition.top > bottom ||\n elementPosition.bottom < position.top);\n }\n\n function overlaps(firstRect, secondRect) {\n return !(firstRect.right <= secondRect.left ||\n firstRect.left >= secondRect.right ||\n firstRect.bottom <= secondRect.top ||\n firstRect.top >= secondRect.bottom);\n }\n\n kendo.ui.plugin(Selectable);\n\n })(window.kendo.jQuery);\n\n}));\n"]}