(函数($){/***通过字段操作拖放表行。**使用drupal_add_tabledrag()函数,任何具有权重或父级的表*可以将关系制成可拖动的表。包含字段的列*可以选择隐藏,以提供更好的用户体验。**可以使用自定义行为修改已创建的tableDrag实例*覆盖.onDrag、.onDrop、.row.onSwap和.row.on Indent方法。*有关向tableDrag添加附加功能的示例,请参见blocks.js。*/Drupal.behaviors.tableDrag={附加:函数(上下文,设置){for(settings.tableDrag中的var base){$('#'+base,context).once('tabledrag',function(){//创建新的tableDrag实例。保存在Drupal变量中//以允许其他脚本访问该对象。Drupal.tableDrag[base]=新Drupal.tableDrag(this,settings.tableDrug[base]);});}}};/***tableDrag对象的构造函数。提供表和字段操作。**@param表格*要使表可拖动的DOM对象。*@param tableSettings(@param表格设置)*通过drupal_add_dragtable()添加的表的设置。*/Drupal.tableDrag=函数(table,tableSettings){var self=此;//必需的对象变量。this.table=表格;this.tableSettings=表格设置;this.dragObject=空;//用于保存有关当前拖动操作的信息。this.rowObject=空;//提供行操作的操作。this.oldRowElement=空;//记住前面的元素。this.oldY=0;//用于确定上一次鼠标移动的上下方向。this.changed=false;//整个表中是否有任何更改。this.max深度=0;//允许的最大育儿量。this.rtl=$(this.table).css('direction')=='rtl'-1 : 1; // 表格的方向。//配置滚动设置。this.scrollSettings={数量:4,间隔:50,触发:70};this.scrollInterval=空;this.scrollY=0;this.windowHeight=0;//检查此表的设置以查看中是否存在父关系//这张桌子。为了提高效率,如果我们//不需要跟踪水平移动和缩进。this.indentEnabled=假;for(tableSettings中的var组){for(tableSettings[group]中的var n){if(tableSettings[group][n].relationship==“parent”){this.indentEnabled=true;}if(tableSettings[group][n].limit>0){this.maxDepth=tableSettings[group][n].limit;}}}if(this.indentEnabled){this.indentCount=1;//缩进的总宽度,在makeDraggable中设置。//找到用于测量鼠标移动的缩进宽度。//因为表格不需要以任何缩进开始,我们//在第一个可拖动行中手动附加2个缩进,测量//偏移,然后删除。var indent=Drupal.theme('tableDragIndentation');var testRow=$('').addClass('dragable').appendTo(table);var testCell=$('').appendTo(testRow).prepend(indent).prepond(indet);this.indentAmount=$('.indentation',testCell).get(1).offsetLeft-$('.indentation`,testCell).get;testRow.remove();}//使每个适用的行都可拖动。//匹配父元素的直接子元素以允许嵌套。$('>tr.draggable,>tbody>tr.drapgable',table).each(function(){self.makeDragable(this);});//在表前添加链接,以便用户显示或隐藏权重列。$(表).在($(')之前').attr('title',Drupal.t('Reorder rows by numerical weight',not draging.')).单击(函数(){if($.cookie('Rupal.tableDrag.showWeight')==1){self.hideColumns();}其他{self.showColumns();}返回false;}).wraph('
').parent());//初始化指定的列(例如,权重列或父列)//根据用户偏好显示或隐藏。这有助于访问//例如,屏幕阅读器用户可以选择输入重量值和//直接操作表单元素,而不是使用拖放。。self.initColumns();//向文档添加鼠标绑定。传递自变量//因为事件处理程序不能直接访问tableDrag对象。$(document).bind('mousemove pointermove',function(event){return self.dragRow(event,self);});$(document).bind('mouseup pointerup',function(event){return self.dropRow(event,self);});$(document).bind('touchmove',function(event){return self.dragRow(event.originalEvent.touchs[0],self);});$(document).bind('touchend',function(event){return self.dropRow(event.originalEvent.touchs[0],self);});};/***初始化包含默认隐藏的表单元素的列,*根据此tableDrag实例的设置。**使用CSS类标识和标记每个单元格,以便轻松切换*显示/隐藏它。最后,如果用户没有*“Drupal.tableDrag.showWeight”cookie。*/Drupal.tableDrag.prototype.initColumns=函数(){for(this.tableSettings中的var组){//查找此组中的第一个字段。for(this.tableSettings[group]中的var d){var字段=$('.'+this.tableSettings[group][d].target+':first',this.table);if(field.length和this.tableSettings[group][d].hidden){var hidden=this.tableSettings[group][d].hidden;var单元格=字段.最近('td');断裂;}}//标记包含此字段的列,以便将其隐藏。if(隐藏&&单元格[0]){//将1添加到索引中。第n个子选择器基于1,而不是基于0。//匹配父元素的直接子元素以允许嵌套。var-columnIndex=$('>td',cell.parent()).index(cell.get(0))+1;$('>thead>tr,>tbody>tr、>tr',this.table).each(函数(){//获取columnIndex并调整此行中的所有列跨度。var index=列索引;var单元格=$(this).children();cells.each(函数(n){如果(n<index&&this.colSpan&&this.colSpan>1){索引-=this.colSpan-1;}});if(索引>0){cell=cells.filter(':nth-child('+index+')');if(单元格[0].colSpan和单元格[0].colSpan>1){//如果此单元格有列跨度,请标记它,以便我们可以减少列跨度。cell.addClass('tabledrag-has-colspan');}其他{//标记此单元格,以便我们可以隐藏它。cell.addClass(“tabledrag-hide”);}}});}}//现在隐藏单元格并减少列跨度,除非cookie指示以前的选择。//如果cookie不存在,请设置它。if($.cookie('Drupal.tableDrag.showWeight')===null){$.cookie('Drupal.tableDrag.showWeight',0{路径:Drupal.settings.basePath,//饼干一年后到期。到期时间:365});this.hideColumns();}//检查cookie值并相应地显示/隐藏权重列。其他{if($.cookie('Drupal.tableDrag.showWeight')==1){this.showColumns();}其他{this.hideColumns();}}};/***隐藏包含权重/父表单元素的列。*撤消showColumns()。*/Drupal.tableDrag.prototype.hideColumns=函数(){//隐藏权重/父单元格和标题。$('.tabledrag-hide','table.tabledrage-processed').css('display','none');//显示TableDrag句柄。$('.tabledrag-handle','table.tabledrage-processed').css('display','');//减少任何受影响的多跨柱的柱跨。$('.tabledrag-has-colspan','table.tabledrage-processed').each(function(){this.colSpan=this.colSpan-1;});//更改链接文本。$('.tabledrag-toggle-weight').text(Drupal.t('显示行权重'));//更改cookie。$.cookie('Drupal.tableDrag.showWeight',0{路径:Drupal.settings.basePath,//饼干一年后到期。过期时间:365});//触发一个事件以允许其他脚本对此显示更改做出反应。$('table.tabledrag-processed').trigger('columnschange','hide');};/***显示包含权重/父表单元素的列*撤消hideColumns()。*/Drupal.tableDrag.prototype.showColumns=函数(){//显示权重/父单元格和标题。$('.tabledrag-hide','table.tabledrage-processed').css('display','');//隐藏TableDrag句柄。$('.tabledrag-handle','table.tabledrage-processed').css('display','none');//增加之前减少的任何列的列跨度。$('.tabledrag-has-colspan','table.tabledrage-processed').each(function(){this.colSpan=this.colSpan+1;});//更改链接文本。$('.tabledrag-toggle-weight').text(Drupal.t('隐藏行权重'));//更改cookie。$.cookie('Drupal.tableDrag.showWeight',1{路径:Drupal.settings.basePath,//饼干一年后到期。到期时间:365});//触发事件以允许其他脚本对此显示更改作出反应。$('table.tabledrag-processed').trigger('columnschange','show');};/***查找特定行和组中使用的目标。*/Drupal.tableDrag.prototype.rowSettings=函数(组,行){var字段=$('.'+组,行);for(this.tableSettings[group]中的var delta){var targetClass=this.tableSettings[group][delta].target;if(字段.is('.'+目标类)){//返回行设置的副本。var rowSettings={};for(this.tableSettings[group][delta]中的var n){rowSettings[n]=this.tableSettings[group][delta][n];}return rowSettings;}}};/***获取一个项并添加事件处理程序以使其可拖动。*/Drupal.tableDrag.prototype.makeDraggable=功能(项){var self=此;//创建控制柄。var句柄=$('
 
').attr('title',Drupal.t('拖动以重新排序');//在凹痕(如有)后插入把手。if($('td:first.indentation:last',item).length){$('td:first.indentation:last',item).after(handle);//更新整个表中的缩进总宽度。self.indentCount=数学.max($('.indentation',item).length,self.identCount);}其他{$('td:first',item).prepend(句柄);}//为句柄添加悬停操作。handle.hover(函数(){self.dragObject==空$(this).addClass('tabledrag-handle-hover'):空;},函数(){self.dragObject==空$(this).removeClass('tabledrag-handle-hover'):空;});//为句柄添加mousedown操作。handle.bind('mousedown touchstart pointerdown',函数(事件){if(event.originalEvent.type==“touchstart”){event=event.originalEvent.touchs[0];}//创建记录事件信息的新dragObject。self.dragObject={};self.dragObject.initMouseOffset=self.getMouseOffset(项,事件);self.dragObject.initMouseCoords=self.mouseCoords(事件);if(self.indentEnabled){self.dragObject.indentMousePos=self.dragObject.initMouseCoords;}//如果键盘上有一个挥之不去的行对象,请移除其焦点。if(self.rowObject){$('a.tabledrag-handle',self.rowObject.element).blur();}//创建新的rowObject以操作此行。self.rowObject=新self.row(item,'mouse',self.indentEnabled,self.maxDepth,true);//保存表格的位置。self.table.topY=$(self.table).offset().top;self.table.bottomY=self.tTable.topY+self.table偏移高度;//将类添加到句柄和行。$(this).addClass(“tabledrag-handle-hover”);$(item).addClass('drag');//将文档设置为在拖动期间使用移动光标。$('body').addClass('drag');if(self.oldRowElement){$(self.oldRowElement).removeClass('drag-previous');}//如果移动了选择列表,IE6会不受控制地闪烁。if(navigator.userAgent.indexOf('MSIE 6.')!=-1) {$('select',this.table).css('display','none');}//攻击Konqueror,防止模糊处理程序被触发。//Konqueror总是关注链接,即使在mousedown返回false后也是如此。self.safeBlur=错误;//调用可选占位符函数。self.onDrag();返回false;});//防止锚标签将我们跳到页面顶部。handle.click(函数(){返回false;});//与悬停事件类似,在句柄聚焦时添加一个类。handle.focus(函数(){$(this).addClass(“tabledrag-handle-hover”);self.safeBlur=真;});//删除blur上的句柄类,并触发与mouseup相同的函数。handle.blur(函数(事件){$(this).removeClass(“tabledrag-handle-hover”);if(self.rowObject和self.safeBlur){self.dropRow(事件,self);}});//向手柄添加箭头键支撑。handle.keydown(函数(事件){//如果rowObject尚不存在,并且这不是tab键。if(event.keyCode!=9&&!self.rowObject){self.rowObject=新self.row(item,'keyboard',self.indentEnabled,self.maxDepth,true);}var keyChange=false;开关(event.keyCode){case 37://左箭头。案例63234://Safari左箭头。keyChange=true;self.rowObject.indent(-1*self.rtl);断裂;case 38://向上箭头。case 63232://Safari向上箭头。var previousRow=$(self.rowObject.element).prev('tr').get(0);while(previousRow&&$(previoursRow).is(':hidden)){previousRow=$(previous Row).prev('tr').get(0);}if(前置行){self.safeBlur=错误;//不允许onBlur清理。self.rowObject.direction=“向上”;keyChange=true;if($(item).is('.tabledrag-root')){//与上一个顶级行交换。var groupHeight=0;while(previousRow&&$('.indentation',previous Row).length){previousRow=$(previous Row).prev('tr').get(0);groupHeight+=$(previousRow)。是(':hidden')吗?0:previousRow.offsetHeight;}if(前一行){self.rowObject.swap('before',previousRow);//无需检查缩进,0是唯一有效的缩进。window.srollBy(0,-groupHeight);}}else if(self.table.tBodies[0].rows[0]!=previousRow||$(previoussRow).is('.draggable')){//与前一行交换(除非前一行是第一行//和不可折叠)。self.rowObject.swap('before',previousRow);self.rowObject.interval=空;self.rowObject.indent(0);window.srollBy(0,-parseInt(item.offsetHeight,10));}handle.get(0).focus();//DOM操作后重新获得焦点。}断裂;case 39://右箭头。案例63235://Safari右箭头。keyChange=true;self.rowObject.indent(1*self.rtl);断裂;case 40://向下箭头。案例63233://Safari向下箭头。var nextRow=$(self.rowObject.group).filter(':last').next('tr').get(0);while(nextRow&&$(nexdRow).is(':hidden')){nextRow=$(nextRaw).next('tr').get(0);}if(nextRow){self.safeBlur=错误;//不允许onBlur清理。self.rowObject.direction=“向下”;keyChange=true;if($(item).is('.tabledrag-root')){//与下一组交换(必须是顶级组)。var groupHeight=0;var nextGroup=新self.row(nextRow,'keyboard',self.indentEnabled,self.maxDepth,false);if(nextGroup){$(nextGroup.group).each(函数(){groupHeight+=$(this)。是(':hidden')吗?0:this.offsetHeight;});var nextGroupRow=$(nextGroup.group).filter(':last').get(0);self.rowObject.swap('after',nextGroupRow);//无需检查缩进,0是唯一有效的缩进。window.srollBy(0,parseInt(groupHeight,10));}}其他{//与下一行交换。self.rowObject.swap('after',nextRow);self.rowObject.interval=空;self.rowObject.indent(0);window.srollBy(0,parseInt(item.offsetHeight,10));}handle.get(0).focus();//DOM操作后重新获得焦点。}断裂;}if(self.rowObject和self.row Object.changed==true){$(item).addClass('drag');if(self.oldRowElement){$(self.oldRowElement).removeClass('drag-previous');}self.oldRowElement=项目;self.restipeTable();self.onDrag();}//如果我们有一个箭头键来防止滚动,则返回false。if(键更改){返回false;}});//兼容性添加,按键时返回false以防止不需要的滚动。//IE和Safari将禁止按键滚动,但所有其他浏览器//需要在按键时返回false。http://www.quirksmode.org/js/keys.html手柄.按键(功能(事件){开关(event.keyCode){case 37://左箭头。case 38://向上箭头。case 39://右箭头。case 40://向下箭头。返回false;}});};/***Mousemove事件处理程序,绑定到文档。*/Drupal.tableDrag.prototype.dragRow=函数(事件,自身){if(self.dragObject){self.currentMouseCoords=self.mouseCoords(事件);var y=self.currentMouseCoords.y-self.dragObject.initMouseOffset.y;var x=self.currentMouseCoords.x-self.dragObject.initMouseOffset.x;//检查行交换和垂直滚动。if(y!=self.oldY){self.rowObject.direction=y>self.oldY?'down:“向上”;self.oldY=y;//更新旧值。//检查窗口是否应该滚动(以及滚动速度)。var scrollAmount=self.checkScroll(self.currentMouseCoords.y);//停止任何当前滚动。clearInterval(self.crollInterval);//如果鼠标已沿滚动方向移动,请继续滚动。if(scrollAmount>0&&self.rowObject.direction=='down'||scrollAmount<0&&self.rowObject_direction=='up'){self.setScroll(scrollAmount);}//如果我们有一个有效的目标,那么执行交换并重新调整表。var currentRow=self.findDropTargetRow(x,y);if(currentRow){if(self.rowObject.direction==“向下”){self.rowObject.swap('after',currentRow,self);}其他{self.rowObject.swap('before',currentRow,self);}self.restipeTable();}}//与行交换类似,处理缩进。if(self.indentEnabled){var xDiff=self.currentMouseCoords.x-self.dragObject.indentMousePos.x;//设置鼠标向左或向右移动的缩进数。var indentDiff=数学.round(xDiff/self.indentAmount);//用我们估计的差异缩进行,这可能会更进一步//根据此行周围的行进行限制。var indentChange=self.rowObject.indent(indentDiff);//更新表格和鼠标缩进。self.dragObject.indentMousePos.x+=self.indentAmount*indentChange*self.rtl;self.indentCount=数学.max(self.inderCount,self.rowObject.indents);}返回false;}};/***鼠标事件处理程序,绑定到文档。*模糊事件处理程序,绑定到拖动句柄以支持键盘。*/Drupal.tableDrag.prototype.dropRow=函数(事件,自身){//鼠标上移和模糊事件之间共享的删除行功能。if(self.rowObject!=空){var droppedRow=self.rowObject.element;//该行已经在正确的位置,所以我们只需释放它。if(self.rowObject.changed==true){//更新拖放行中的字段。self.updateFields(droppedRow);//如果存在影响整个组的设置,请更新所有//整个拖动组中的字段。for(self.tableSettings中的var组){var rowSettings=self.rowSettings(group,droppedRow);if(rowSettings.relationship==“组”){for(self.rowObject.childrens中的var n){self.updateField(self.rowObject.childrens[n],group);}}}self.rowObject.markChanged();if(self.changed==false){$(Drupal.theme('tableDragChangedWarning')).insertBefore(self.table).hide().fadeIn('slow');self.changed=真;}}if(self.indentEnabled){self.rowObject.removeIndentClasses();}if(self.oldRowElement){$(self.oldRowElement).removeClass('drag-previous');}$(droppedRow).removeClass('drag').addClass(`drag-previous');self.oldRowElement=droppedRow;self.onDrop();self.rowObject=空;}//仅特定于鼠标事件的功能。if(self.dragObject!=空){$('.tabledrag-handle',droppedRow).removeClass('tabledrag-handle-hover');self.dragObject=空;$('body').removeClass('drag');clearInterval(self.crollInterval);//如果选择列表被移动,IE6将无法控制地闪烁。if(navigator.userAgent.indexOf('MSIE 6.')!=-1) {$(“选择”,this.table).css(“显示”,“块”);}}};/***从事件中获取鼠标坐标(允许浏览器差异)。*/Drupal.tableDrag.prototype.mouseCords=函数(事件){//通过使用!=同时匹配null和未定义,但不匹配零无效的。//请参见https://stackoverflow.com/questions/2647867/how-to-determine-if-variable-is-undefined-or-nullif(event.pageX!=空&&event.page Y!=空){返回{x:event.pageX,y:event.pageY};}//仅在中向jQuery引入了对指针事件的完全支持//版本1.11.1;在版本1.7和1.11.0之间,指针事件具有//pageX和pageY属性未定义。在这些情况下,属性必须//而是从event.originalEvent对象中检索。if(event.originalEvent&&event.oiginalEvent.pageX!=null&&event原始事件.pageY!=null){return{x:event.originalEvent.pageX,y:event.orgirginalEvent.pageY};}//一些旧浏览器根本不支持MouseEvent.pageX和*.pageY。//请参见https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/pageY//对于这些,我们将查看event.clientX和event.crientY。if(event.clientX==空||event.crientY==空){//在某些jQuery版本中,jQuery创建的某些事件没有//clientX和clientY。但最初的事件可能有。if(!event.originalEvent){throw new Error(“事件没有坐标,也没有event.originalEvent.”);}event=事件.originalEvent;if(event.clientX==空||event.crientY==空){throw new Error(“原始事件没有坐标。”);}}//从jQuery 1.4.1中的jQuery.event.fix()复制而来。//在较新的jQuery版本中,此代码位于jQuery.event.mouseHooks.filter()中。var doc=document.documentElement,body=文档.body;var pageX=event.clientX+(doc&&doc.scrollLeft||body&&body.scroll Left||0)-(doc&&doc.clientLeft|| body&&body.client左||0);var pageY=event.clientY+(doc&&doc.scrollTop||body&&body.scroll Top||0)-(doc&&doc.clientTop|| body&&body.clientTop||0);返回{x:pageX,y:pageY};};/***给定一个目标元素和一个鼠标事件,从中获取鼠标偏移量*元素。为此,我们需要元素的位置和鼠标位置。*/Drupal.tableDrag.prototype.getMouseOffset=函数(目标,事件){var docPos=$(目标).offset();var mousePos=this.mouseCoords(事件);return{x:mousePos.x-docPos.left,y:mousePos.y-docPos.top};};/***查找鼠标当前所在的行。然后取下并交换此行*拖着一个。**@参数x*鼠标在页面(而不是屏幕)上的x坐标。*@参数y*鼠标在页面(而不是屏幕)上的y坐标。*/Drupal.tableDrag.prototype.findDropTargetRow=函数(x,y){var行=$(this.table.tBodies[0].rows).not(':hidden');for(var n=0;n<行长度;n++){var行=行[n];var indentDiff=0;var rowY=$(row).offset().top;//因为Safari不在表行上报告offsetHeight,但在//表单元格,获取行的第一个子元素并使用它。// http://jacob.peargrove.com/blog/2006/technical/table-row-offsettop-bug-in-safari。if(row.offsetHeight==0){var rowHeight=parseInt(row.firstChild.offsetHeight,10)/2;}//其他浏览器。其他{var rowHeight=parseInt(row.offsetHeight,10)/2;}//因为我们总是在前面插入,所以需要稍微偏移高度。if((y>(rowY-rowHeight))&&(y<(rowY+rowHeight)){if(this.indentEnabled){//检查该行是否不是被拖动行的子行。for(this.rowObject.group中的var n){if(this.rowObject.group[n]==行){返回null;}}}其他{//不允许将行与其自身交换。if(行==this.rowObject.element){返回null;}}//检查是否允许与此行交换。if(!this.rowObject.isValidSwap(行)){返回null;}//我们可能已经找到了鼠标刚刚经过的那一行,但它没有找到//考虑隐藏行。向后跳,直到我们找到一个可拖动的//行。while($(row).is(':hidden')&&$(row).prev('tr').is(':hidden')){row=$(row).prev('tr').get(0);}返回行;}}返回null;};/***删除行后,根据设置更新表字段*为这张桌子设置。**@param changedRow*刚删除的行的DOM对象。*/Drupal.tableDrag.prototype.updateFields=函数(changedRow){for(this.tableSettings中的var组){//每个小组可能有不同的关系设置,因此我们发现//每个源行分别对应。this.updateField(changedRow,group);}};/***删除行后,根据特定的*设置。**@param changedRow*刚删除的行的DOM对象。*@param组*将在其上进行字段更新的设置组。*/Drupal.tableDrag.prototype.updateField=函数(changedRow,group){var rowSettings=this.rowSettings(group,changedRow);//将行设置为自己的目标。if(rowSettings.relationship==“self”||rowSettings.lationship==“group”){var sourceRow=changedRow;}//兄弟姐妹很容易,请检查上一行和下一行。else if(rowSettings.relationship=='sibling'){var previousRow=$(changedRow).prev('tr').get(0);var nextRow=$(changedRow).next('tr').get(0);var sourceRow=changedRow;if($(previousRow).is('.draggable')&&$('.'+组,previoussRow).length){if(this.indentEnabled){if($('.indentations',previousRow).length==$('.indentations',changedRow)){sourceRow=previousRow;}}其他{sourceRow=previousRow;}}else if($(nextRow).is('.draggable')&&$('.'+group,nextRaw).length){if(this.indentEnabled){if($('.indentations',nextRow).length==$('.indentations',changedRow)){sourceRow=下一行;}}其他{sourceRow=下一行;}}}//家长们,向树上看,直到我们找到一块不属于这一组的田地。//增加更改行中缩进的家长数量。else if(rowSettings.relationship=='parent'){var previousRow=$(changedRow).prev('tr');while(previousRow.length&&$('.indentation',previous Row).length>=this.rowObject.indents){previousRow=previous Row.prev('tr');}//如果我们找到一排。if(上一行长度){sourceRow=previousRow[0];}//否则,我们一直走到桌子的左边,没有找到//父级,表示此项已放置在根级别。其他{//使用表中的第一行作为源,因为它保证//处于根级别。找到第一项,然后比较此行//作为兄弟姐妹反对。sourceRow=$(this.table).find('tr.draggable:first').get(0);if(sourceRow==this.rowObject.element){sourceRow=$(this.rowObject.group[this.row Object.group.length-1]).next('tr.draggable').get(0);}var useSibling=true;}}//因为我们可能已经将行从一个类别移到了另一个类别,//看看我们的兄弟姐妹,并借用其来源和目标。this.copyDragClasses(sourceRow,changedRow,group);rowSettings=this.rowSettings(group,changedRow);//在这种情况下,我们正在寻找一位家长,但该行位于顶部//复制同级树的值。if(使用Sibling){rowSettings.relationship='sibling';rowSettings.source=rowSettings.target;}var targetClass=“.”+rowSettings.target;var targetElement=$(targetClass,changedRow).get(0);//检查此行中是否存在目标元素。if(targetElement){var源类=“.”+rowSettings.source;var sourceElement=$(sourceClass,sourceRow).get(0);switch(rowSettings.action){案例“深度”://获取目标行的深度。targetElement.value=$('.indentation',$(sourceElement).closest('tr')).length;断裂;大小写“匹配”://更新值。targetElement.value=源元素值;断裂;案例“订单”:var兄弟姐妹=this.rowObject.findSiblings(rowSettings);if($(targetElement).is('select')){//获取可接受值的列表。var值=[];$('option',targetElement).each(function(){values.push(this.value);});var maxVal=值[values.length-1];//填充同级中的值。$(targetClass,兄弟).each(function(){//如果项目多于可能的值,请为该行指定最大值。if(values.length>0){this.value=values.shift();}其他{this.value=最大值;}});}其他{//假设输入字段为数字。var-weight=parseInt($(targetClass,兄弟[0]).val(),10)|0;$(targetClass,兄弟).each(function(){this.value=重量;权重++;});}断裂;}}};/***复制所有特殊表格将类从一行的表单元素拖动到*不同的,删除目标行中的任何特殊类*可能有过。*/Drupal.tableDrag.prototype.copyDragClasses=函数(sourceRow,targetRow,group){var sourceElement=$('.'+组,sourceRow);var targetElement=$('.'+组,targetRow);if(源元素长度和目标元素长度){targetElement[0].className=源元素[0].calsName;}};Drupal.tableDrag.prototype.checkScroll=函数(cursorY){var de=document.documentElement;var b=文档.正文;var windowHeight=this.windowHeight=window.innerHeight||(de.clientHeight&&de.client宽度!=0?de.clienteHeight:b.offsetHeight);var scrollY=this.scrollY=(document.all?(!de.scrollTop?b.crollTop:de.scrrollTop):(window.pageYOffset?window.page YOffset:window.srollY));var触发器=this.scrollSettings.trigger;var delta=0;//返回相对于屏幕边缘的滚动速度。如果(cursorY-scrollY>windowHeight-trigger){delta=触发器/(windowHeight+scrollY-cursorY);增量=(增量>0和增量<触发器)?delta:触发器;return delta*this.scrollSettings.aumount;}else if(cursorY-scrollY<触发器){delta=触发器/(光标Y-滚动Y);增量=(增量>0和增量<触发器)?delta:触发器;return-delta*this.scrollSettings.aumount;}};Drupal.tableDrag.prototype.setScroll=函数(scrollAmount){var self=此;this.scrollInterval=设置间隔(函数(){//更新对象中存储的滚动值。self.checkScroll(self.currentMouseCoords.y);var aboverTable=self.scrollY>self.table.topY;var belowTable=self.scrollY+self.windowHeight<self.table.bottomY;if(scrollAmount>0&belowTable||scrollAmount<0&aboverTable){window.srollBy(0,scrollAmount);}},this.scrollSettings.interval);};Drupal.tableDrag.prototype.restripeTable=函数(){//:偶数和:奇数颠倒,因为jQuery从0和//我们从1开始计数,所以我们不同步。//匹配父元素的直接子元素以允许嵌套。$('>tbody>tr.draggable:可见,>tr.drapgable:可见',this.table).removeClass(“偶数加法”).filter(“:odd”).addClass(“even”).end().filter(':even').addClass('add');};/***存根功能。允许在行开始拖动时使用自定义处理程序。*/Drupal.tableDrag.prototype.onDrag=函数(){返回null;};/***存根功能。允许在删除行时使用自定义处理程序。*/Drupal.tableDrag.prototype.onDrop=函数(){返回null;};/***构造函数生成一个新对象来操作表行。**@param table行*我们将要处理的表行的DOM元素。*@param方法*移动此行的方法。“键盘”或“鼠标”。*@param indentEnabled(@param indentEnabled)*包含表是否使用缩进。用于优化。*@param maxDepth(@param最大深度)*此行可能包含的最大缩进量。*@param addClasses*是否要将类添加到此行以指示子关系。*/Drupal.tableDrag.prototype.row=函数(tableRow,method,indentEnabled,maxDepth,addClasses){this.element=表格行;this.method=方法;this.group=[表格行];this.groupDepth=$('.indentation',tableRow).length;this.changed=假;this.table=$(tableRow).closest('table').get(0);this.indentEnabled=indentEnable;this.maxDepth=最大深度;this.direction=“”;//移动行的方向。if(this.indentEnabled){this.indents=$('.indentation',tableRow).length;this.children=this.findChildren(addClasses);this.group=$.merge(this.group,this.children);//找出整个团队的深度。对于(var n=0;n<this.group.length;n++){this.groupDepth=数学最大值($('.indentation',this.group[n]).length,this.gopDepth);}}};/***通过缩进查找rowObject的所有子级。**@param addClasses*是否要将类添加到此行以指示子关系。*/Drupal.tableDrag.prototype.row.prototype.findChildren=函数(addClasses){var parentIndentation=this.indents;var currentRow=$(this.element,this.table).next('tr.draggable');var行=[];var子级=0;while(当前行长度){var rowIndentation=$('.indentation',currentRow).length;//缩进越大表示这是一个子项。if(rowIndentation>parentIndentation){儿童++;rows.push(currentRow[0]);if(addClasses){$('.indentation',currentRow).each(函数(indentNum){if(child==1&&(indentNum==parentIndentation)){$(this).addClass('tre-child-first');}if(indentNum==parentIndentation){$(this).addClass('tre-child');}else if(indentNum>parentIndentation){$(this).addClass('tre-child-horizontal');}});}}其他{断裂;}currentRow=当前行下一个('tr.draggable');}if(addClasses和rows.length){$('.indentation:nth-child('+(parentIndentation+1)+')',行[rows.length-1]).addClass('tre-child-last');}返回行;};/***确保允许交换两行。**@param行*正在考虑交换的行的DOM对象。*/Drupal.tableDrag.prototype.row.prototype.isValidSwap=函数(行){if(this.indentEnabled){var prevRow,nextRow;if(this.direction==“向下”){prevRow=行;nextRow=$(row).next('tr').get(0);}其他{prevRow=$(行).prev('tr').get(0);nextRow=行;}this.interval=this.validIndentInterval(prevRow,nextRow);//如果有效缩进间隔为空,则交换无效。if(this.interval.min>this.interface.max){返回false;}}//不要让不可拖动的第一行前面放置任何内容。if(this.table.tBodies[0].rows[0]==row&&$(row).is(':not(.draggable)'){返回false;}返回true;};/***在两行之间执行交换。**@param位置*交换是在给定行的“之前”还是“之后”进行。*@param行*将与行组交换的DOM元素。*/Drupal.tableDrag.prototype.row.prototype.swap=函数(位置,行){Drupal.dettachBehaviors(this.group,Drupal.settings,'move');$(行)[位置](this.group);Drupal.attachBehaviors(this.group,Drupal.settings);this.change=true;this.onSwap(行);};/***确定给定位置行的有效缩进间隔*在表中。**@param prevRow*测试位置前一行的DOM对象*(或表中第一个位置为null)。*@param nextRow*测试位置后的行的DOM对象*(或表中最后一个位置为null)。*/Drupal.tableDrag.prototype.row.prototype.validIndentInterval=函数(prevRow,nextRow){var最小缩进,最大缩进;//最小压痕://不要孤立下一行。minIndent=下一行$('.indentation',nextRow).长度:0;//最大压痕:if(!prevRow||$(prevRow).is(':not(.draggable)')||${//不缩进://-表中的第一行,//-拖动到不可拖动行下方的行,//-“root”行。最大缩进=0;}其他{//不要比作为前一行的孩子更深入。maxIndent=$('.indentation',prevRow).length+($(prevRow).is('.tabledrag-leaf')?0 : 1);//限制表的最大允许深度。if(this.maxDepth){maxIndent=数学最小值(maxIndent,this.maxDepth-(this.groupDepth-this.indents));}}return{“min”:最小缩进,“max”:最大缩进};};/***在表的合法边界内缩进行。**@param indentDiff*为行建议的附加缩进数(可以是*正或负)。此数字将调整为最接近的有效值*行的缩进级别。*/Drupal.tableDrag.prototype.row.prototype.indent=函数(indentDiff){//如果还不可用,请确定有效缩进间隔。如果(!this.interval){var prevRow=$(this.element).prev('tr').get(0);var nextRow=$(this.group).filter(':last').next('tr').get(0);this.interval=this.validIndentInterval(prevRow,nextRow);}//调整到最近的有效缩进。var indent=this.indents+indentDiff;indent=数学最大值(indent,this.interval.min);indent=数学最小值(indent,this.interval.max);indentDiff=indent-this.indents;for(var n=1;n<=数学.abs(indentDiff);n++){//添加或删除缩进。if(indentDiff<0){$('.indentation:first',this.group).remove();this.indents--;}其他{$('td:first',this.group).prefend(Drupal.theme('tableDragIndentation'));this.indents++;}}if(indentDiff){//更新此行的缩进。this.changed=真;this.groupDepth+=indentDiff;this.onIndent();}返回indentDiff;};/***根据子组或缩进查找行的所有同级。*请注意,传入行包含在同级列表中。**@param设置*我们用来识别兄弟姐妹的字段设置。*/Drupal.tableDrag.prototype.row.prototype.findSiblings=函数(rowSettings){var兄弟=[];var方向=['prev','next'];var rowIndentation=this.indents;对于(var d=0;d<方向.长度;d++){var checkRow=$(this.element)[directions[d]]();while(选中Row.length){//检查同级是否包含类似的目标字段。if($('.'+rowSettings.target,checkRow)){//如果这是一个平面表,请立即添加,或者检查以确保//该行具有相同的缩进级别。如果(this.indentEnabled){var checkRowIndentation=$('.indentation',checkRow).length;}if(!(this.indentEnabled)||(checkRowIndentation==行缩进)){兄弟姐妹.push(checkRow[0]);}else if(选中rowIndentation<rowIndention){//当我们找到父母时,没有必要一直寻找兄弟姐妹。断裂;}}其他{断裂;}checkRow=$(checkRow)[方向[d]]();}//由于同级项是按与前一个相反的顺序添加的,因此将//以前兄弟姐妹的完整列表。添加当前行并继续。if(方向[d]==“上一个”){兄弟姐妹.reverse();siblies.push(this.element);}}返回兄弟姐妹;};/***从当前行组中删除缩进帮助器类。*/Drupal.tableDrag.prototype.row.prototype.removeIndentClasses=函数(){for(this.children中的var n){$('.indentation',this.childrens[n]).removeClass(“tre-child”).removeClass('tre-child-first').removeClass('tre-child-last').removeClass('tre-child-horizontal');}};/***将星号或其他标记添加到更改的行。*/Drupal.tableDrag.prototype.row.prototype.markChanged=函数(){var-marker=Drupal.theme('tableDragChangedMarker');var单元格=$('td:first',this.element);if($('span.tabledrag-changed',cell).length==0){单元格追加(标记);}};/***存根功能。当行缩进时,允许使用自定义处理程序。*/Drupal.tableDrag.prototype.row.prototype.onIndent=函数(){返回null;};/***存根功能。交换行时允许自定义处理程序。*/Drupal.tableDrag.prototype.row.prototype.onSwap=函数(swappedRow){返回null;};Drupal.theme.prototype.tableDragChangedMarker=函数(){返回'*';};Drupal.theme.prototype.tableDragIndentation=函数(){返回'
 
';};Drupal.theme.prototype.tableDragChangedWarning=函数(){返回
'+Drupal.theme('tableDragChangedMarker')+''+Drupali.t('在提交表单之前,不会保存此表中所做的更改。')+'
';};})(jQuery);