Fix for MDL-7086.

Some versions of IE choke if the second argument of insertBefore() is null. The code in section_class.prototype.insert_resource() wrongly assumed that the value of targetel would be null if that parameter was not passed to the function. The value is actually 'undefined' in this case. The checks that relied on comparison with null were therefore failing in IE (but worked fine in other browsers anyway). Two problems - wrong assumption in code, and IE being stupid.
This commit is contained in:
vyshane
2006-10-19 04:29:55 +00:00
parent ecaa25ff09
commit 03796898f6
+112 -97
View File
@@ -80,7 +80,7 @@ section_class.prototype.init_section = function(id, group, config, isDraggable)
section_class.prototype.init_buttons = function() {
var commandContainer = this.getEl().childNodes[2];
//clear all but show only button
//clear all but show only button
var commandContainerCount = commandContainer.childNodes.length;
for (var i=(commandContainerCount-1); i>0; i--) {
commandContainer.removeChild(commandContainer.childNodes[i])
@@ -131,7 +131,7 @@ section_class.prototype.process_section = function() {
//find/edit resources
this.resources_ul = this.content_td.getElementsByTagName('ul')[0];
if (this.resources_ul == null) {
if (!this.resources_ul) {
this.resources_ul = document.createElement('ul');
this.resources_ul.className='section';
this.content_td.insertBefore(this.resources_ul, this.content_td.childNodes[2]);
@@ -170,8 +170,9 @@ section_class.prototype.onDragDrop = function(e, id) {
// get the drag and drop object that was targeted
var target = YAHOO.util.DDM.getDDById(id);
if (this.debug)YAHOO.log("Section dropped on id="+id+" (I am "+this.getEl().id+") x="+YAHOO.util.Dom.getXY(this.getDragEl()));
if (this.debug) {
YAHOO.log("Section dropped on id="+id+" (I am "+this.getEl().id+") x="+YAHOO.util.Dom.getXY(this.getDragEl()));
}
this.move_to_section(target);
//add back to resources group
@@ -191,43 +192,47 @@ section_class.prototype.move_to_section = function(target) {
var found = null;
//determine if original is above or below target and adjust loop
var oIndex=main.get_section_index(this);
var tIndex=main.get_section_index(target);
if (this.debug)YAHOO.log("original is at: "+oIndex+" target is at:"+tIndex+" of "+(sectionCount-1));
var oIndex = main.get_section_index(this);
var tIndex = main.get_section_index(target);
if (this.debug) {
YAHOO.log("original is at: "+oIndex+" target is at:"+tIndex+" of "+(sectionCount-1));
}
if (oIndex < tIndex) {
var loopCondition = 'i<sectionCount';
var loopStart = 1;
var loopInc = 'i++';
var loopmodifier = 'i-1';
var loopmodifier = 'i - 1';
} else {
var loopCondition = 'i>0';
var loopStart = sectionCount-1;
var loopCondition = 'i > 0';
var loopStart = sectionCount - 1;
var loopInc = 'i--';
var loopmodifier = 'i+1';
var loopmodifier = 'i + 1';
}
//move on backend
main.connect('post','class=section&field=move',null,'id='+this.sectionId+'&value='+(target.sectionId-this.sectionId));
main.connect('post','class=section&field=move',null,'id='+this.sectionId+'&value='
+(target.sectionId-this.sectionId));
//move on front end
for (var i=loopStart; eval(loopCondition); eval(loopInc)) {
if ((main.sections[i] == this)&& !found) {
if ((main.sections[i] == this) && !found) {
//enounter with original node
if (this.debug)YAHOO.log("Found Original "+main.sections[i].getEl().id);
if (this.debug) {
YAHOO.log("Found Original "+main.sections[i].getEl().id);
}
if (main.sections[i] == this) {
found = true;
}
} else if (main.sections[i] == target) {
//encounter with target node
if (this.debug)YAHOO.log("Found target "+main.sections[i].getEl().id);
if (this.debug) {
YAHOO.log("Found target "+main.sections[i].getEl().id);
}
main.sections[i].swap_with_section(main.sections[eval(loopmodifier)]);
found = false;
break;
} else if (found) {
//encounter with nodes inbetween
main.sections[i].swap_with_section(main.sections[eval(loopmodifier)]);
@@ -246,35 +251,36 @@ section_class.prototype.swap_with_section = function(sectionIn) {
this.changeId(targetIndex);
sectionIn.changeId(thisIndex);
if (this.debug)YAHOO.log("Swapping "+this.getEl().id+" with "+sectionIn.getEl().id);
if (this.debug) {
YAHOO.log("Swapping "+this.getEl().id+" with "+sectionIn.getEl().id);
}
YAHOO.util.DDM.swapNode(this.getEl(), sectionIn.getEl());
}
section_class.prototype.toggle_hide = function(e,target,superficial) {
if (this.hidden) {
YAHOO.util.Dom.removeClass(this.getEl(),'hidden');
this.viewButton.childNodes[0].src = this.viewButton.childNodes[0].src.replace(/show.gif/i,'hide.gif');
YAHOO.util.Dom.removeClass(this.getEl(), 'hidden');
this.viewButton.childNodes[0].src = this.viewButton.childNodes[0].src.replace(/show.gif/i, 'hide.gif');
this.hidden = false;
if (!superficial) {
main.connect('post','class=section&field=visible',null,'value=1&id='+this.sectionId);
for (var x=0;x<this.resources.length;x++) {
this.resources[x].toggle_hide(null,null,true,this.resources[x].hiddenStored);
main.connect('post', 'class=section&field=visible', null, 'value=1&id='+this.sectionId);
for (var x=0; x<this.resources.length; x++) {
this.resources[x].toggle_hide(null, null, true, this.resources[x].hiddenStored);
this.resources[x].hiddenStored = null;
}
}
} else {
YAHOO.util.Dom.addClass(this.getEl(),'hidden');
this.viewButton.childNodes[0].src = this.viewButton.childNodes[0].src.replace(/hide.gif/i,'show.gif');
YAHOO.util.Dom.addClass(this.getEl(), 'hidden');
this.viewButton.childNodes[0].src = this.viewButton.childNodes[0].src.replace(/hide.gif/i, 'show.gif');
this.hidden = true;
if (!superficial) {
main.connect('post','class=section&field=visible',null,'value=0&id='+this.sectionId);
for (var x=0;x<this.resources.length;x++) {
main.connect('post', 'class=section&field=visible', null, 'value=0&id='+this.sectionId);
for (var x=0; x<this.resources.length; x++) {
this.resources[x].hiddenStored = this.resources[x].hidden;
this.resources[x].toggle_hide(null,null,true,true);
this.resources[x].toggle_hide(null, null, true, true);
}
}
}
@@ -282,10 +288,10 @@ section_class.prototype.toggle_hide = function(e,target,superficial) {
section_class.prototype.toggle_highlight = function() {
if (this.highlighted) {
YAHOO.util.Dom.removeClass(this.getEl(),'current');
YAHOO.util.Dom.removeClass(this.getEl(), 'current');
this.highlighted = false;
} else {
YAHOO.util.Dom.addClass(this.getEl(),'current');
YAHOO.util.Dom.addClass(this.getEl(), 'current');
this.highlighted = true;
}
}
@@ -297,7 +303,7 @@ section_class.prototype.mk_marker = function() {
} else {//if currently the marker
main.marker = null;
main.connect('post','class=course&field=marker',null,'value=0');
main.connect('post', 'class=course&field=marker', null, 'value=0');
this.toggle_highlight();
}
}
@@ -314,12 +320,12 @@ section_class.prototype.changeId = function(newId) {
}
section_class.prototype.get_resource_index = function(el) {
for (var x=0;x<this.resources.length;x++) {
if (this.resources[x]==el) {
for (var x=0; x<this.resources.length; x++) {
if (this.resources[x] == el) {
return x;
}
}
YAHOO.log("Could not find resource to remove "+el.getEl().id,"error");
YAHOO.log("Could not find resource to remove "+el.getEl().id, "error");
return -1;
}
@@ -327,19 +333,20 @@ section_class.prototype.remove_resource = function(el) {
var resourceCount = this.resources.length;
if (resourceCount == 1) {
if (this.resources[0] == el)
this.resources = new Array();
if (this.resources[0] == el) {
this.resources = new Array();
}
} else {
var found = false;
for (var i=0;i<resourceCount;i++) {
for (var i=0; i<resourceCount; i++) {
if (found) {
this.resources[i-1] = this.resources[i];
if (i==resourceCount-1) {
this.resources = this.resources.slice(0,-1);
this.resources[i - 1] = this.resources[i];
if (i == resourceCount - 1) {
this.resources = this.resources.slice(0, -1);
resourceCount--;
}
this.resources[i-1].update_index(i-1);
} else if (this.resources[i]==el) {
this.resources[i - 1].update_index(i - 1);
} else if (this.resources[i] == el) {
found = true;
}
}
@@ -347,15 +354,18 @@ section_class.prototype.remove_resource = function(el) {
//remove "text" nodes to keep DOM clean
var childIndex = null;
var childrenCount = this.resources_ul.childNodes.length;
for (var i=0;i<childrenCount;i++)
if (this.resources_ul.childNodes[i] == el.getEl())
for (var i=0; i<childrenCount; i++) {
if (this.resources_ul.childNodes[i] == el.getEl()) {
childIndex = i;
if (childIndex > 0 && childIndex < this.resources_ul.childNodes.length)
this.resources_ul.removeChild(this.resources_ul.childNodes[childIndex-1]);
YAHOO.log("removing "+el.getEl().id);
if (el.getEl().parentNode != null)
el.getEl().parentNode.removeChild(el.getEl());
}
}
if (childIndex > 0 && childIndex < this.resources_ul.childNodes.length) {
this.resources_ul.removeChild(this.resources_ul.childNodes[childIndex - 1]);
}
YAHOO.log("Removing "+el.getEl().id);
if (el.getEl().parentNode != null) {
el.getEl().parentNode.removeChild(el.getEl());
}
this.write_sequence_list();
}
@@ -366,7 +376,7 @@ section_class.prototype.insert_resource = function(el, targetel) {
//update in backend
targetId = '';
if (targetel != null) {
if (targetel) {
targetId = targetel.id;
}
@@ -377,23 +387,23 @@ section_class.prototype.insert_resource = function(el, targetel) {
//if inserting into a hidden resource hide
if (this.hidden) {
el.hiddenStored = el.hidden;
el.toggle_hide(null,null,true,true);
el.toggle_hide(null, null, true, true);
} else {
if (el.hiddenStored != null) {
el.toggle_hide(null,null,true,el.hiddenStored);
el.toggle_hide(null, null, true, el.hiddenStored);
el.hiddenStored = null;
}
}
//update model
if (targetel == null) {
if (!targetel) {
this.resources[this.resources.length] = el;
} else {
for (var i=0;i<resourcecount;i++) {
for (var i=0; i<resourcecount; i++) {
if (found) {
tempStore = this.resources[i];
this.resources[i] = nextStore;
nextStore = tempStore;
if (nextStore != null)
nextStore.update_index(i+1);
@@ -403,18 +413,18 @@ section_class.prototype.insert_resource = function(el, targetel) {
this.resources[i] = el;
resourcecount++;
this.resources[i].update_index(i,this.ident);
nextStore.update_index(i+1);
this.resources[i].update_index(i, this.ident);
nextStore.update_index(i + 1);
}
}
}
//update on frontend
if (targetel != null) {
this.resources_ul.insertBefore(el.getEl(),targetel.getEl());
this.resources_ul.insertBefore(document.createTextNode(''),targetel.getEl());
//update on frontend
if (targetel) {
this.resources_ul.insertBefore(el.getEl(), targetel.getEl());
this.resources_ul.insertBefore(document.createTextNode(' '), targetel.getEl());
} else {
this.resources_ul.appendChild(el.getEl());
this.resources_ul.appendChild(document.createTextNode(" "));
this.resources_ul.appendChild(document.createTextNode(' '));
}
el.parentObj = this;
}
@@ -422,7 +432,7 @@ section_class.prototype.insert_resource = function(el, targetel) {
section_class.prototype.write_sequence_list = function(toReturn) {
var listOutput = '';
for (var i=0;i<this.resources.length;i++) {
for (var i=0; i<this.resources.length; i++) {
listOutput += this.resources[i].id;
if (i != (this.resources.length-1)) {
listOutput += ',';
@@ -449,20 +459,20 @@ YAHOO.extend(resource_class, YAHOO.util.DDProxy);
resource_class.prototype.debug = true;
resource_class.prototype.init_resource = function(id,group,config,parentObj) {
resource_class.prototype.init_resource = function(id, group, config, parentObj) {
if (!id) {
YAHOO.log("Init resource, NO ID FOUND!",'error');
YAHOO.log("Init resource, NO ID FOUND!", 'error');
return;
}
this.is = 'resource';
this.init(id,group,config);
this.init(id, group, config);
this.createFrame();
this.isTarget = true;
this.id = this.getEl().id.replace(/module-/i,'');
this.id = this.getEl().id.replace(/module-/i, '');
this.hidden = false;
if (YAHOO.util.Dom.hasClass(this.getEl().getElementsByTagName('a')[0],'dimmed')) {
if (YAHOO.util.Dom.hasClass(this.getEl().getElementsByTagName('a')[0], 'dimmed')) {
this.hidden = true;
}
this.hiddenStored = null;
@@ -482,31 +492,34 @@ resource_class.prototype.init_resource = function(id,group,config,parentObj) {
}
resource_class.prototype.init_buttons = function() {
var commandContainer = YAHOO.util.Dom.getElementsByClassName('commands','span',this.getEl())[0];
var commandContainer = YAHOO.util.Dom.getElementsByClassName('commands', 'span', this.getEl())[0];
if ( commandContainer == null) {
YAHOO.log('Cannot find command container for '+this.getEl().id,'error');
YAHOO.log('Cannot find command container for '+this.getEl().id, 'error');
return;
}
this.commandContainer = commandContainer;
//find edit button
var updateButton = null;
var buttons = commandContainer.getElementsByTagName('a');
var buttons = commandContainer.getElementsByTagName('a');
for (var x=0;x<buttons.length;x++) {
for (var x=0; x<buttons.length; x++) {
if (buttons[x].title == main.portal.strings['update']) {
updateButton = buttons[x];
}
}
if (updateButton == null)
YAHOO.log('Cannot find updateButton for '+this.getEl().id,'error');
YAHOO.log('Cannot find updateButton for '+this.getEl().id, 'error');
commandContainer.innerHTML = '';
//add move-handle
var handleRef = main.mk_button('a','/pix/i/move_2d.gif',[['style','cursor:move']],[['height','11'],['width','11'],['hspace','2'],['border','0']]);
YAHOO.util.Dom.generateId(handleRef,'sectionHandle');
var handleRef = main.mk_button('a', '/pix/i/move_2d.gif',
[['style', 'cursor:move']], [['height', '11'], ['width', '11'],
['hspace', '2'], ['border', '0']]);
YAHOO.util.Dom.generateId(handleRef, 'sectionHandle');
this.handle = handleRef;
commandContainer.appendChild(handleRef);
this.setHandleElId(this.handle.id);
@@ -515,61 +528,63 @@ resource_class.prototype.init_buttons = function() {
commandContainer.appendChild(updateButton);
//add rest
var button = main.mk_button('a','/pix/t/delete.gif');
YAHOO.util.Event.addListener(button,'click',this.delete_button,this,true);
commandContainer.appendChild(button);
var button = main.mk_button('a', '/pix/t/delete.gif');
YAHOO.util.Event.addListener(button, 'click', this.delete_button, this, true);
commandContainer.appendChild(button);
if (this.hidden) {
var button = main.mk_button('a','/pix/t/show.gif');
var button = main.mk_button('a', '/pix/t/show.gif');
} else {
var button = main.mk_button('a','/pix/t/hide.gif');
var button = main.mk_button('a', '/pix/t/hide.gif');
}
YAHOO.util.Event.addListener(button,'click',this.toggle_hide,this,true);
commandContainer.appendChild(button);
YAHOO.util.Event.addListener(button, 'click', this.toggle_hide, this, true);
commandContainer.appendChild(button);
this.viewButton = button;
}
resource_class.prototype.toggle_hide = function(target,e,superficial,force) {
resource_class.prototype.toggle_hide = function(target, e, superficial, force) {
if (force != null) {
if (this.debug)YAHOO.log("Resource "+this.getEl().id+" forced to "+force);
if (this.debug) {
YAHOO.log("Resource "+this.getEl().id+" forced to "+force);
}
this.hidden = !force;
}
if (this.hidden) {
YAHOO.util.Dom.removeClass(this.linkContainer,'dimmed');
this.viewButton.childNodes[0].src = this.viewButton.childNodes[0].src.replace(/show.gif/i,'hide.gif');
YAHOO.util.Dom.removeClass(this.linkContainer, 'dimmed');
this.viewButton.childNodes[0].src = this.viewButton.childNodes[0].src.replace(/show.gif/i, 'hide.gif');
this.hidden = false;
if (!superficial) {
main.connect('post','class=resource&field=visible',null,'value=1&id='+this.id);
main.connect('post', 'class=resource&field=visible', null, 'value=1&id='+this.id);
}
} else {
YAHOO.util.Dom.addClass(this.linkContainer,'dimmed');
this.viewButton.childNodes[0].src = this.viewButton.childNodes[0].src.replace(/hide.gif/i,'show.gif');
YAHOO.util.Dom.addClass(this.linkContainer, 'dimmed');
this.viewButton.childNodes[0].src = this.viewButton.childNodes[0].src.replace(/hide.gif/i, 'show.gif');
this.hidden = true;
if (!superficial) {
main.connect('post','class=resource&field=visible',null,'value=0&id='+this.id);
main.connect('post', 'class=resource&field=visible', null, 'value=0&id='+this.id);
}
}
}
resource_class.prototype.delete_button = function() {
if (this.debug) {
YAHOO.log("Deleting "+this.getEl().id+"from parent "+this.parentObj.getEl().id);
YAHOO.log("Deleting "+this.getEl().id+" from parent "+this.parentObj.getEl().id);
}
if (!confirm(main.getString('deletecheck',main.getString(this.is)+" "+this.id))) {
if (!confirm(main.getString('deletecheck', main.getString(this.is)+" "+this.id))) {
return false;
}
this.getEl().parentNode.removeChild(this.getEl());
this.parentObj.remove_resource(this);
main.connect('delete','class=resource&id='+this.id);
main.connect('delete', 'class=resource&id='+this.id);
}
resource_class.prototype.update_index = function(index) {
if (this.debug) {
YAHOO.log("update Index for resource "+this.getEl().id+"to"+index);
YAHOO.log("Updating Index for resource "+this.getEl().id+" to "+index);
}
}