{"version":3,"file":"kendo.groupable.min.js","names":["factory","define","amd","$","kendo","Widget","outerWidth","kendoAttr","extend","each","isRtl","ASCENDING","GROUP_SORT","NS","indicatorTmpl","hint","dropCue","Groupable","window","jQuery","ui","_outerWidth","attr","template","useWithBlock","target","title","htmlEncode","html","prepend","init","element","options","draggable","horizontalCuePosition","that","this","group","guid","intializePositions","_intializePositions","bind","dropCuePositions","_dropCuePositions","fn","call","support","Draggable","filter","draggableElements","groupContainer","kendoDropTarget","dragenter","e","_canDrag","currentTarget","find","removeClass","addClass","css","appendTo","dragleave","remove","drop","position","targetElement","field","colID","sourceIndicator","indicator","lastCuePosition","length","sortOptions","sort","data","dir","hasClass","_dropCuePosition","getOffset","left","parseInt","_canDrop","before","buildIndicator","after","_setIndicatorSortOptions","_change","empty","append","kendoDraggable","dragcancel","_dragCancel","dragstart","marginLeft","elementPosition","dragend","_dragEnd","drag","_drag","on","preventDefault","_removeIndicator","parent","newDir","allowDrag","dataSource","_refreshHandler","unbind","refresh","indicatorHtml","groups","fieldAttr","titleAttr","index","compare","_invalidateGroupContainer","destroy","off","events","name","messages","indicators","grep","item","id","ns","replace","aggregates","names","idx","map","cell","aggregate","member","split","push","toArray","descriptors","indicatorSortOptions","trigger","removeData","is","Math","ceil","right","marginRight","event","x","location","source","next","dropped","plugin"],"sources":["kendo.groupable.js"],"mappings":"CAAA,SAAWA,GACW,mBAAXC,QAAyBA,OAAOC,IAAMD,OAAO,CAAC,iBAAkB,yBAA0BD,GACjGA,IAFJ,EAGG,WACC,IAQUG,EACFC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAKAC,EAGAC,EACAC,EAEAC,EASAC,EAUAC,EAEAC,EAvCEd,EA2bPe,OAAOd,MAAMe,OA1bRf,EAAQc,OAAOd,MACfC,EAASD,EAAMgB,GAAGf,OAClBC,EAAaF,EAAMiB,YACnBd,EAAYH,EAAMkB,KAClBd,EAASL,EAAEK,OACXC,EAAON,EAAEM,KACTC,GAAQ,EAKRC,EAAY,MAGZC,EAAa,aACbC,EAAK,kBAELC,EAAgBV,EAAMmB,SAAS,qyBAQhB,CAAEC,cAAc,IAC/BT,EAAO,SAASU,GACZ,IAAIC,EAAQD,EAAOH,KAAKlB,EAAMkB,KAAK,UAKnC,OAJII,IACAA,EAAQtB,EAAMuB,WAAWD,IAGtBvB,EAAE,4CACJyB,KAAKF,GAASD,EAAOH,KAAKlB,EAAMkB,KAAK,WACrCO,QAAQ,0DAEjBb,EAAUb,EAAE,sCAEZc,EAAYZ,EAAOG,OAAO,CAC1BsB,KAAM,SAASC,EAASC,GACpB,IAGIC,EACAC,EAJAC,EAAOC,KACPC,EAAQjC,EAAMkC,OACdC,EAAqBJ,EAAKK,oBAAoBC,KAAKN,GAGnDO,EAAmBP,EAAKQ,kBAAoB,GAEhDtC,EAAOuC,GAAGd,KAAKe,KAAKV,EAAMJ,EAASC,GAEnCtB,EAAQN,EAAM0C,QAAQpC,MAAMqB,GAC5BG,EAAwBxB,EAAQ,QAAU,OAE1CyB,EAAKF,UAAYA,EAAYE,EAAKH,QAAQC,WAAa,IAAI7B,EAAMgB,GAAG2B,UAAUZ,EAAKJ,QAAS,CACxFiB,OAAQb,EAAKH,QAAQiB,kBACrBlC,KAAMA,EACNsB,MAAOA,IAGXF,EAAKe,eAAiB/C,EAAEgC,EAAKH,QAAQkB,eAAgBf,EAAKJ,SACrDoB,gBAAgB,CACbd,MAAOJ,EAAUD,QAAQK,MACzBe,UAAW,SAASC,GACZlB,EAAKmB,SAASD,EAAEpB,UAAUsB,iBAC1BF,EAAEpB,UAAUlB,KAAKyC,KAAK,kBAAkBC,YAAY,cAAcC,SAAS,YAC3E1C,EAAQ2C,IAAIzB,EAAuB,GAAG0B,SAASzB,EAAKe,kBAG5DW,UAAW,SAASR,GAChBA,EAAEpB,UAAUlB,KAAKyC,KAAK,kBAAkBC,YAAY,YAAYC,SAAS,cACzE1C,EAAQ8C,UAEZC,KAAM,SAASV,GACX,IAOIW,EAPAC,EAAgBZ,EAAEpB,UAAUsB,cAC5BW,EAAQD,EAAc3C,KAAKlB,EAAMkB,KAAK,UACtCI,EAAQuC,EAAc3C,KAAKlB,EAAMkB,KAAK,UACtC6C,EAAQF,EAAc3C,KAAK,MAC3B8C,EAAkBjC,EAAKkC,UAAUH,GACjCxB,EAAmBP,EAAKQ,kBACxB2B,EAAkB5B,EAAiBA,EAAiB6B,OAAS,GAE7DC,EAAchE,EAAO,GAAI2B,EAAKH,QAAQyC,KAAMR,EAAcS,KAAK9D,IAC/D+D,EAAMH,EAAYG,KAEjBV,EAAcW,SAAS,sBAAyBzC,EAAKmB,SAASW,MAG/DK,GACAN,EAAW7B,EAAK0C,iBAAiBzE,EAAM0E,UAAU9D,GAAS+D,KAAOC,SAASV,EAAgBvC,QAAQ4B,IAAI,cAAe,KAAOjD,GAAS,EAAI,GAAKsE,SAASV,EAAgBvC,QAAQ4B,IAAI,eAAgB,OACnLxB,EAAK8C,SAAS9E,EAAEiE,GAAkBJ,EAASjC,QAASiC,EAASe,QACrEf,EAASkB,OACTlB,EAASjC,QAAQmD,OAAOd,GAAmBjC,EAAKgD,eAAejB,EAAOxC,EAAOiD,EAAKR,IAElFH,EAASjC,QAAQqD,MAAMhB,GAAmBjC,EAAKgD,eAAejB,EAAOxC,EAAOiD,EAAKR,IAGrFhC,EAAKkD,yBAAyBnB,EAAOM,GACrCrC,EAAKmD,YAGTnD,EAAKe,eAAeqC,QACpBpD,EAAKe,eAAesC,OAAOrD,EAAKgD,eAAejB,EAAOxC,EAAOiD,EAAKR,IAClEhC,EAAKkD,yBAAyBnB,EAAOM,GACrCrC,EAAKmD,eAIhBG,eAAe,CACZzC,OAAQ,wBACRjC,KAAMA,EACNsB,MAAOJ,EAAUD,QAAQK,MACzBqD,WAAYvD,EAAKwD,YAAYlD,KAAKN,GAClCyD,UAAW,SAASvC,GAChB,IAAItB,EAAUsB,EAAEE,cACZsC,EAAab,SAASjD,EAAQ4B,IAAI,cAAe,IACjDmC,EAAkB/D,EAAQiC,WAC1Be,EAAOrE,EAAQoF,EAAgBf,KAAOc,EAAaC,EAAgBf,KAAOzE,EAAWyB,GAEzFQ,IACAvB,EAAQ2C,IAAI,OAAQoB,GAAMnB,SAASzB,EAAKe,gBACxCd,KAAKrB,KAAKyC,KAAK,kBAAkBC,YAAY,cAAcC,SAAS,aAExEqC,QAAS,WACL5D,EAAK6D,SAAS5D,OAElB6D,KAAM9D,EAAK+D,MAAMzD,KAAKN,KAEzBgE,GAAG,QAAUtF,EAAI,aAAa,SAASwC,GACpCA,EAAE+C,iBACFjE,EAAKkE,iBAAiBlG,EAAEiC,MAAMkE,aAEjCH,GAAG,QAAUtF,EAAG,WAAW,SAASwC,GACjC,IAAIgB,EAAYlE,EAAEiC,MAAMkE,SACpBC,EAASlC,EAAU/C,KAAKf,EA5HlC,UA4HsDI,EAxH/C,OAwHwEA,EAEzE0D,EAAU/C,KAAKf,EA9HrB,OA8HqCgG,GAC/BpE,EAAKmD,UACLjC,EAAE+C,oBAGVnE,EAAUQ,KAAK,CAAE,UAAW,aAAc,YAAa,QACvD,CACIsD,QAAS,WACL5D,EAAK6D,SAAS5D,OAElBsD,WAAYvD,EAAKwD,YAAYlD,KAAKN,GAClCyD,UAAW,SAASvC,GAChB,IAAItB,EAECI,EAAKH,QAAQwE,WAAcrE,EAAKmB,SAASD,EAAEE,gBAKhDhB,IACIG,EAAiB6B,SACjBxC,EAAUW,EAAiBA,EAAiB6B,OAAS,GAAGxC,QAC1CiD,SAASjD,EAAQ4B,IAAI,eAAgB,IAC5C5B,EAAQiC,WAAWe,KAAOzE,EAAWyB,KAR5CsB,EAAE+C,kBAaVH,KAAM9D,EAAK+D,MAAMzD,KAAKN,KAG1BA,EAAKsE,WAAatE,EAAKH,QAAQyE,WAE3BtE,EAAKsE,YAActE,EAAKuE,gBACxBvE,EAAKsE,WAAWE,OAxJf,SAwJ8BxE,EAAKuE,iBAEpCvE,EAAKuE,gBAAkBvE,EAAKyE,QAAQnE,KAAKN,GAGzCA,EAAKsE,aACLtE,EAAKsE,WAAWhE,KAAK,SAAUN,EAAKuE,iBACpCvE,EAAKyE,YAIbA,QAAS,WACL,IAKIC,EALA1E,EAAOC,KAEP0E,EADa3E,EAAKsE,WACEpE,SAAW,GAC/B0E,EAAYxG,EA9KZ,SA+KAyG,EAAYzG,EA9KZ,SAiLA4B,EAAKe,iBACLf,EAAKe,eAAeqC,QAEpB9E,EAAKqG,GAAQ,SAASG,EAAO5E,GACzB,IAAI6B,EAAQ7B,EAAM6B,MACdS,EAAMtC,EAAMsC,IACZ5C,EAAUI,EAAKJ,QACdyB,KAAKrB,EAAKH,QAAQgB,QAClBA,QAAO,WACJ,OAAO7C,EAAEiC,MAAMd,KAAKyF,KAAe7C,KAG3C2C,EAAgB1E,EAAKgD,eAAejB,EAAOnC,EAAQT,KAAK0F,GAAYrC,EAAK5C,EAAQT,KAAK,OACtFa,EAAKe,eAAesC,OAAOqB,GAC3B1E,EAAKkD,yBAAyBnB,EAAO1D,EAAO,GAAI2B,EAAKH,QAAQyC,KAAM,CAAEE,IAAKA,EAAKuC,QAAS7E,EAAM6E,eAItG/E,EAAKgF,6BAGTC,QAAS,WACL,IAAIjF,EAAOC,KAEX/B,EAAOuC,GAAGwE,QAAQvE,KAAKV,GAEvBA,EAAKe,eAAemE,IAAIxG,GAEpBsB,EAAKe,eAAewB,KAAK,oBACzBvC,EAAKe,eAAewB,KAAK,mBAAmB0C,UAG5CjF,EAAKe,eAAewB,KAAK,mBACzBvC,EAAKe,eAAewB,KAAK,kBAAkB0C,UAG1CjF,EAAKH,QAAQC,WACdE,EAAKF,UAAUmF,UAGfjF,EAAKsE,YAActE,EAAKuE,kBACxBvE,EAAKsE,WAAWE,OAAO,SAAUxE,EAAKuE,iBACtCvE,EAAKuE,gBAAkB,MAG3BvE,EAAKe,eAAiBf,EAAKJ,QAAUI,EAAKF,UAAY,MAG1DqF,OAAQ,CAAC,SAAU,eAEnBtF,QAAS,CACLuF,KAAM,YACNvE,OAAQ,KACRC,kBAAmB,KACnBuE,SAAU,CACNjC,MAAO,iEAEXd,KAAM,CACFE,IAAKhE,EACLuG,QAAS,OAIjB7C,UAAW,SAASH,GAChB,IAAIuD,EAAatH,EAAE,qBAAsBiC,KAAKc,gBAC9C,OAAO/C,EAAEuH,KAAKD,GAAY,SAASE,GAE3B,OAAOxH,EAAEwH,GAAMrG,KAAKlB,EAAMkB,KAAK,YAAc4C,KAC9C,IAGXiB,eAAgB,SAASjB,EAAOxC,EAAOiD,EAAKiD,GAUxC,OARgB9G,EAAc,CAC1B+G,GAAIzH,EAAMyH,GACV3D,MAAOA,EAAM4D,QAAQ,KAAM,KAC3BpG,MAAOA,EACPkG,GAAIA,EACJjD,IAAKA,IANEvC,KAMWJ,QAAQyC,MAAQ,IAAIE,KAAOhE,KAMrD0E,yBAA0B,SAASnB,EAAOlC,GACtB7B,EAAEiC,KAAKiC,UAAUH,IACvBQ,KAAK9D,EAAYoB,IAG/B+F,WAAY,WACR,IACIC,EACAC,EACA1D,EAEJ,OALWnC,KAKCL,QAAQyB,KALTpB,KAKmBJ,QAAQgB,QAAQkF,KAAI,WAC9C,IAAIC,EAAOhI,EAAEiC,MACTgG,EAAYD,EAAK7G,KAAKlB,EAAMkB,KAAK,eACjC+G,EAASF,EAAK7G,KAAKlB,EAAMkB,KAAK,UAElC,GAAI8G,GAA2B,KAAdA,EAGb,IAFAJ,EAAQI,EAAUE,MAAM,KACxBF,EAAY,GACPH,EAAM,EAAG1D,EAASyD,EAAMzD,OAAQ0D,EAAM1D,EAAQ0D,IAC/CG,EAAUG,KAAK,CAAErE,MAAOmE,EAAQD,UAAWJ,EAAMC,KAGzD,OAAOG,KACRI,WAGPC,YAAa,WACT,IAEIvE,EAFA/B,EAAOC,KACPqF,EAAatH,EAAE,qBAAsBgC,EAAKe,gBAE1C6E,EAAa5F,EAAK4F,aAEtB,OAAO5H,EAAE+H,IAAIT,GAAY,SAASE,GAC9BA,EAAOxH,EAAEwH,GACTzD,EAAQyD,EAAKrG,KAAKlB,EAAMkB,KAAK,UAC7B,IAAIkD,EAAcrC,EAAKH,QAAQyC,MAAQ,GACnCiE,EAAuBf,EAAKjD,KAAK9D,IAAe,GAEpD,MAAO,CACHsD,MAAOA,EACPS,IAAKgD,EAAKrG,KAAKlB,EAAMkB,KAAK,QAC1ByG,WAAYA,GAAc,GAC1B5D,MAAOwD,EAAKrG,KAAKlB,EAAMkB,KAAK,OAC5B4F,QAASwB,EAAqBxB,SAAW1C,EAAY0C,aAKjEb,iBAAkB,SAAShC,GACvB,IAAIlC,EAAOC,KAEXD,EAAKwG,QAtTK,cAsTgB,CACtBzE,MAAOG,EAAU/C,KAAKlB,EAAMkB,KAAK,UACjC6C,MAAOE,EAAU/C,KAAKlB,EAAMkB,KAAK,SAErC+C,EAAUgD,MACVhD,EAAUuE,aACVvE,EAAUP,SACV3B,EAAKgF,4BACLhF,EAAKmD,WAGTA,QAAS,WACL,IAAInD,EAAOC,KACX,GAAID,EAAKsE,WAAY,CACjB,IAAIgC,EAActG,EAAKsG,cACvB,GAAItG,EAAKwG,QAAQ,SAAU,CAAE7B,OAAQ2B,IAEjC,YADAtG,EAAKyE,UAGTzE,EAAKsE,WAAWpE,MAAMoG,KAI9B5D,iBAAkB,SAASb,GACvB,IAAItB,EAAmBN,KAAKO,kBAC5B,GAAK3B,EAAQ6H,GAAG,aAA2C,IAA5BnG,EAAiB6B,OAAhD,CAIAP,EAAW8E,KAAKC,KAAK/E,GAErB,IAAIM,EAAkB5B,EAAiBA,EAAiB6B,OAAS,GAC7DQ,EAAOT,EAAgBS,KACvBiE,EAAQ1E,EAAgB0E,MACxBnD,EAAab,SAASV,EAAgBvC,QAAQ4B,IAAI,cAAe,IACjEsF,EAAcjE,SAASV,EAAgBvC,QAAQ4B,IAAI,eAAgB,IAsBvE,OApBIK,GAAYgF,IAAUtI,GAASsD,EAAWe,GAAQrE,EAClDsD,EAAW,CACPe,KAAMT,EAAgBvC,QAAQiC,WAAWe,MAASrE,GAA8DmF,EAAtDvF,EAAWgE,EAAgBvC,SAAWkH,GAChGlH,QAASuC,EAAgBvC,QACzBmD,QAAQ,IAGZlB,EAAW7D,EAAEuH,KAAKhF,GAAkB,SAASiF,GACzC,OAAQA,EAAK5C,MAAQf,GAAYA,GAAY2D,EAAKqB,OAAWtI,GAASsD,EAAW2D,EAAKqB,SACvF,MAGChF,EAAW,CACPe,KAAMrE,EAAQsD,EAASjC,QAAQiC,WAAWe,KAAOzE,EAAW0D,EAASjC,SAAWkH,EAAcjF,EAASjC,QAAQiC,WAAWe,KAAOc,EACjI9D,QAASiC,EAASjC,QAClBmD,QAAQ,IAKblB,IAEXkC,MAAO,SAASgD,GACZ,IAAIlF,EAAW5B,KAAKyC,iBAAiBqE,EAAMC,EAAEC,UAEzCpF,GACAhD,EAAQ2C,IAAI,CAAEoB,KAAMf,EAASe,KAAMiE,MAAO,UAGlD1F,SAAU,SAASvB,GACf,IAAImC,EAAQnC,EAAQT,KAAKlB,EAAMkB,KAAK,UAEpC,MAAgD,SAAzCS,EAAQT,KAAKlB,EAAMkB,KAAK,eAC3B4C,IACCnC,EAAQ6C,SAAS,uBACbxC,KAAKiC,UAAUH,KAE5Be,SAAU,SAASoE,EAAQ5H,EAAQuC,GAC/B,IAAIsF,EAAOD,EAAOC,OAElB,OADaD,EAAO,KAAO5H,EAAO,MAAQ6H,EAAK,IAAM7H,EAAO,KAAO6H,EAAK,KAAQ5I,GAASsD,EAAWsF,EAAKtF,WAAWe,MAAQrE,GAASsD,EAAWsF,EAAKtF,WAAWe,OAGpKiB,SAAU,SAAS/D,GACf,IAAIE,EAAOC,KACP8B,EAAQjC,EAAUsB,cAAcjC,KAAKlB,EAAMkB,KAAK,UAChD8C,EAAkBjC,EAAKkC,UAAUH,GAEjCjC,IAAcE,EAAKH,QAAQC,YAAcA,EAAUsH,SAAWnF,GAC9DjC,EAAKkE,iBAAiBlG,EAAEiE,IAG5BjC,EAAKwD,eAETA,YAAa,WACT3E,EAAQ8C,SACR1B,KAAKO,kBAAoB,IAE7BH,oBAAqB,WACjB,IAEIuC,EADA0C,EAAatH,EAAE,qBADRiC,KACmCc,gBADnCd,KAINO,kBAAoBxC,EAAE+H,IAAIT,GAAY,SAASE,GAGhD,OAFAA,EAAOxH,EAAEwH,GACT5C,EAAO3E,EAAM0E,UAAU6C,GAAM5C,KACtB,CACHA,KAAMC,SAASD,EAAM,IACrBiE,MAAOhE,SAASD,EAAOzE,EAAWqH,GAAO,IACzC5F,QAAS4F,OAIrBR,0BAA2B,WACvB,IAAIjE,EAAiBd,KAAKc,eACtBA,GAAkBA,EAAe2F,GAAG,WACpC3F,EAAetB,KAAKQ,KAAKJ,QAAQwF,SAASjC,UAKtDnF,EAAMgB,GAAGoI,OAAOvI","sourcesContent":["(function (factory) {\n typeof define === 'function' && define.amd ? define(['kendo.core', 'kendo.draganddrop'], factory) :\n factory();\n})((function () {\n var __meta__ = {\n id: \"groupable\",\n name: \"Groupable\",\n category: \"framework\",\n depends: [ \"core\", \"draganddrop\" ],\n advanced: true\n };\n\n (function($, undefined$1) {\n var kendo = window.kendo,\n Widget = kendo.ui.Widget,\n outerWidth = kendo._outerWidth,\n kendoAttr = kendo.attr,\n extend = $.extend,\n each = $.each,\n isRtl = false,\n\n DIR = \"dir\",\n FIELD = \"field\",\n TITLE = \"title\",\n ASCENDING = \"asc\",\n DESCENDING = \"desc\",\n REMOVEGROUP = \"removeGroup\",\n GROUP_SORT = \"group-sort\",\n NS = \".kendoGroupable\",\n CHANGE = \"change\",\n indicatorTmpl = kendo.template('
' +\n '' +\n '' +\n '${data.title ? data.title: data.field}' +\n '' +\n '' +\n '' +\n '' +\n '
', { useWithBlock: false }),\n hint = function(target) {\n var title = target.attr(kendo.attr(\"title\"));\n if (title) {\n title = kendo.htmlEncode(title);\n }\n\n return $('
')\n .html(title || target.attr(kendo.attr(\"field\")))\n .prepend('');\n },\n dropCue = $('
');\n\n var Groupable = Widget.extend({\n init: function(element, options) {\n var that = this,\n group = kendo.guid(),\n intializePositions = that._intializePositions.bind(that),\n draggable,\n horizontalCuePosition,\n dropCuePositions = that._dropCuePositions = [];\n\n Widget.fn.init.call(that, element, options);\n\n isRtl = kendo.support.isRtl(element);\n horizontalCuePosition = isRtl ? \"right\" : \"left\";\n\n that.draggable = draggable = that.options.draggable || new kendo.ui.Draggable(that.element, {\n filter: that.options.draggableElements,\n hint: hint,\n group: group\n });\n\n that.groupContainer = $(that.options.groupContainer, that.element)\n .kendoDropTarget({\n group: draggable.options.group,\n dragenter: function(e) {\n if (that._canDrag(e.draggable.currentTarget)) {\n e.draggable.hint.find(\".k-drag-status\").removeClass(\"k-i-cancel\").addClass(\"k-i-plus\");\n dropCue.css(horizontalCuePosition, 0).appendTo(that.groupContainer);\n }\n },\n dragleave: function(e) {\n e.draggable.hint.find(\".k-drag-status\").removeClass(\"k-i-plus\").addClass(\"k-i-cancel\");\n dropCue.remove();\n },\n drop: function(e) {\n var targetElement = e.draggable.currentTarget,\n field = targetElement.attr(kendo.attr(\"field\")),\n title = targetElement.attr(kendo.attr(\"title\")),\n colID = targetElement.attr(\"id\"),\n sourceIndicator = that.indicator(field),\n dropCuePositions = that._dropCuePositions,\n lastCuePosition = dropCuePositions[dropCuePositions.length - 1],\n position;\n var sortOptions = extend({}, that.options.sort, targetElement.data(GROUP_SORT));\n var dir = sortOptions.dir;\n\n if (!targetElement.hasClass(\"k-group-indicator\") && !that._canDrag(targetElement)) {\n return;\n }\n if (lastCuePosition) {\n position = that._dropCuePosition(kendo.getOffset(dropCue).left + parseInt(lastCuePosition.element.css(\"marginLeft\"), 10) * (isRtl ? -1 : 1) + parseInt(lastCuePosition.element.css(\"marginRight\"), 10));\n if (position && that._canDrop($(sourceIndicator), position.element, position.left)) {\n if (position.before) {\n position.element.before(sourceIndicator || that.buildIndicator(field, title, dir, colID));\n } else {\n position.element.after(sourceIndicator || that.buildIndicator(field, title, dir, colID));\n }\n\n that._setIndicatorSortOptions(field, sortOptions);\n that._change();\n }\n } else {\n that.groupContainer.empty();\n that.groupContainer.append(that.buildIndicator(field, title, dir, colID));\n that._setIndicatorSortOptions(field, sortOptions);\n that._change();\n }\n }\n })\n .kendoDraggable({\n filter: \"div.k-group-indicator\",\n hint: hint,\n group: draggable.options.group,\n dragcancel: that._dragCancel.bind(that),\n dragstart: function(e) {\n var element = e.currentTarget,\n marginLeft = parseInt(element.css(\"marginLeft\"), 10),\n elementPosition = element.position(),\n left = isRtl ? elementPosition.left - marginLeft : elementPosition.left + outerWidth(element);\n\n intializePositions();\n dropCue.css(\"left\", left).appendTo(that.groupContainer);\n this.hint.find(\".k-drag-status\").removeClass(\"k-i-cancel\").addClass(\"k-i-plus\");\n },\n dragend: function() {\n that._dragEnd(this);\n },\n drag: that._drag.bind(that)\n })\n .on(\"click\" + NS, \".k-button\", function(e) {\n e.preventDefault();\n that._removeIndicator($(this).parent());\n })\n .on(\"click\" + NS,\".k-link\", function(e) {\n var indicator = $(this).parent();\n var newDir = indicator.attr(kendoAttr(DIR)) === ASCENDING ? DESCENDING : ASCENDING;\n\n indicator.attr(kendoAttr(DIR), newDir);\n that._change();\n e.preventDefault();\n });\n\n draggable.bind([ \"dragend\", \"dragcancel\", \"dragstart\", \"drag\" ],\n {\n dragend: function() {\n that._dragEnd(this);\n },\n dragcancel: that._dragCancel.bind(that),\n dragstart: function(e) {\n var element, marginRight, left;\n\n if (!that.options.allowDrag && !that._canDrag(e.currentTarget)) {\n e.preventDefault();\n return;\n }\n\n intializePositions();\n if (dropCuePositions.length) {\n element = dropCuePositions[dropCuePositions.length - 1].element;\n marginRight = parseInt(element.css(\"marginRight\"), 10);\n left = element.position().left + outerWidth(element) + marginRight;\n } else {\n left = 0;\n }\n },\n drag: that._drag.bind(that)\n });\n\n that.dataSource = that.options.dataSource;\n\n if (that.dataSource && that._refreshHandler) {\n that.dataSource.unbind(CHANGE, that._refreshHandler);\n } else {\n that._refreshHandler = that.refresh.bind(that);\n }\n\n if (that.dataSource) {\n that.dataSource.bind(\"change\", that._refreshHandler);\n that.refresh();\n }\n },\n\n refresh: function() {\n var that = this,\n dataSource = that.dataSource;\n var groups = dataSource.group() || [];\n var fieldAttr = kendoAttr(FIELD);\n var titleAttr = kendoAttr(TITLE);\n var indicatorHtml;\n\n if (that.groupContainer) {\n that.groupContainer.empty();\n\n each(groups, function(index, group) {\n var field = group.field;\n var dir = group.dir;\n var element = that.element\n .find(that.options.filter)\n .filter(function() {\n return $(this).attr(fieldAttr) === field;\n });\n\n indicatorHtml = that.buildIndicator(field, element.attr(titleAttr), dir, element.attr(\"id\"));\n that.groupContainer.append(indicatorHtml);\n that._setIndicatorSortOptions(field, extend({}, that.options.sort, { dir: dir, compare: group.compare }));\n });\n }\n\n that._invalidateGroupContainer();\n },\n\n destroy: function() {\n var that = this;\n\n Widget.fn.destroy.call(that);\n\n that.groupContainer.off(NS);\n\n if (that.groupContainer.data(\"kendoDropTarget\")) {\n that.groupContainer.data(\"kendoDropTarget\").destroy();\n }\n\n if (that.groupContainer.data(\"kendoDraggable\")) {\n that.groupContainer.data(\"kendoDraggable\").destroy();\n }\n\n if (!that.options.draggable) {\n that.draggable.destroy();\n }\n\n if (that.dataSource && that._refreshHandler) {\n that.dataSource.unbind(\"change\", that._refreshHandler);\n that._refreshHandler = null;\n }\n\n that.groupContainer = that.element = that.draggable = null;\n },\n\n events: [\"change\", \"removeGroup\"],\n\n options: {\n name: \"Groupable\",\n filter: \"th\",\n draggableElements: \"th\",\n messages: {\n empty: \"Drag a column header and drop it here to group by that column\"\n },\n sort: {\n dir: ASCENDING,\n compare: null\n }\n },\n\n indicator: function(field) {\n var indicators = $(\".k-group-indicator\", this.groupContainer);\n return $.grep(indicators, function(item)\n {\n return $(item).attr(kendo.attr(\"field\")) === field;\n })[0];\n },\n\n buildIndicator: function(field, title, dir, id) {\n var that = this;\n var indicator = indicatorTmpl({\n ns: kendo.ns,\n field: field.replace(/\"/g, \"'\"),\n title: title,\n id: id,\n dir: dir || (that.options.sort || {}).dir || ASCENDING\n });\n\n return indicator;\n },\n\n _setIndicatorSortOptions: function(field, options) {\n var indicator = $(this.indicator(field));\n indicator.data(GROUP_SORT, options);\n },\n\n aggregates: function() {\n var that = this;\n var names;\n var idx;\n var length;\n\n return that.element.find(that.options.filter).map(function() {\n var cell = $(this),\n aggregate = cell.attr(kendo.attr(\"aggregates\")),\n member = cell.attr(kendo.attr(\"field\"));\n\n if (aggregate && aggregate !== \"\") {\n names = aggregate.split(\",\");\n aggregate = [];\n for (idx = 0, length = names.length; idx < length; idx++) {\n aggregate.push({ field: member, aggregate: names[idx] });\n }\n }\n return aggregate;\n }).toArray();\n },\n\n descriptors: function() {\n var that = this,\n indicators = $(\".k-group-indicator\", that.groupContainer),\n field,\n aggregates = that.aggregates();\n\n return $.map(indicators, function(item) {\n item = $(item);\n field = item.attr(kendo.attr(\"field\"));\n var sortOptions = that.options.sort || {};\n var indicatorSortOptions = item.data(GROUP_SORT) || {};\n\n return {\n field: field,\n dir: item.attr(kendo.attr(\"dir\")),\n aggregates: aggregates || [],\n colID: item.attr(kendo.attr(\"id\")),\n compare: indicatorSortOptions.compare || sortOptions.compare\n };\n });\n },\n\n _removeIndicator: function(indicator) {\n var that = this;\n\n that.trigger(REMOVEGROUP, {\n field: indicator.attr(kendo.attr(\"field\")),\n colID: indicator.attr(kendo.attr(\"id\")),\n });\n indicator.off();\n indicator.removeData();\n indicator.remove();\n that._invalidateGroupContainer();\n that._change();\n },\n\n _change: function() {\n var that = this;\n if (that.dataSource) {\n var descriptors = that.descriptors();\n if (that.trigger(\"change\", { groups: descriptors })) {\n that.refresh();\n return;\n }\n that.dataSource.group(descriptors);\n }\n },\n\n _dropCuePosition: function(position) {\n var dropCuePositions = this._dropCuePositions;\n if (!dropCue.is(\":visible\") || dropCuePositions.length === 0) {\n return;\n }\n\n position = Math.ceil(position);\n\n var lastCuePosition = dropCuePositions[dropCuePositions.length - 1],\n left = lastCuePosition.left,\n right = lastCuePosition.right,\n marginLeft = parseInt(lastCuePosition.element.css(\"marginLeft\"), 10),\n marginRight = parseInt(lastCuePosition.element.css(\"marginRight\"), 10);\n\n if (position >= right && !isRtl || position < left && isRtl) {\n position = {\n left: lastCuePosition.element.position().left + (!isRtl ? outerWidth(lastCuePosition.element) + marginRight : - marginLeft),\n element: lastCuePosition.element,\n before: false\n };\n } else {\n position = $.grep(dropCuePositions, function(item) {\n return (item.left <= position && position <= item.right) || (isRtl && position > item.right);\n })[0];\n\n if (position) {\n position = {\n left: isRtl ? position.element.position().left + outerWidth(position.element) + marginRight : position.element.position().left - marginLeft,\n element: position.element,\n before: true\n };\n }\n }\n\n return position;\n },\n _drag: function(event) {\n var position = this._dropCuePosition(event.x.location);\n\n if (position) {\n dropCue.css({ left: position.left, right: \"auto\" });\n }\n },\n _canDrag: function(element) {\n var field = element.attr(kendo.attr(\"field\"));\n\n return element.attr(kendo.attr(\"groupable\")) != \"false\" &&\n field &&\n (element.hasClass(\"k-group-indicator\") ||\n !this.indicator(field));\n },\n _canDrop: function(source, target, position) {\n var next = source.next(),\n result = source[0] !== target[0] && (!next[0] || target[0] !== next[0] || (!isRtl && position > next.position().left || isRtl && position < next.position().left));\n return result;\n },\n _dragEnd: function(draggable) {\n var that = this,\n field = draggable.currentTarget.attr(kendo.attr(\"field\")),\n sourceIndicator = that.indicator(field);\n\n if (draggable !== that.options.draggable && !draggable.dropped && sourceIndicator) {\n that._removeIndicator($(sourceIndicator));\n }\n\n that._dragCancel();\n },\n _dragCancel: function() {\n dropCue.remove();\n this._dropCuePositions = [];\n },\n _intializePositions: function() {\n var that = this,\n indicators = $(\".k-group-indicator\", that.groupContainer),\n left;\n\n that._dropCuePositions = $.map(indicators, function(item) {\n item = $(item);\n left = kendo.getOffset(item).left;\n return {\n left: parseInt(left, 10),\n right: parseInt(left + outerWidth(item), 10),\n element: item\n };\n });\n },\n _invalidateGroupContainer: function() {\n var groupContainer = this.groupContainer;\n if (groupContainer && groupContainer.is(\":empty\")) {\n groupContainer.html(this.options.messages.empty);\n }\n }\n });\n\n kendo.ui.plugin(Groupable);\n\n })(window.kendo.jQuery);\n\n}));\n"]}