How to "decode" some obfuscated JavaScript in HTML? - javascript
Here is one example:
eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('4.h={H:9(d){T 7.F(9(){g 1=7;1.3={8:4(d.8,7),i:4(d.i,7),m:4.z.J(7),5:d.5,t:d.t,j:d.j,K:d.K,b:d.b,A:d.A};4.h.s(1,0);4(S).v(\'W\',9(){1.3.m=4.z.J(1);4.h.s(1,0);4.h.E(1)});4.h.E(1);1.3.8.v(\'O\',9(){4(1.3.t,7).l(0).a.I=\'P\'}).v(\'R\',9(){4(1.3.t,7).l(0).a.I=\'11\'});4(Z).v(\'10\',9(e){g p=4.z.Y(e);g c=0;k(1.3.b&&1.3.b==\'L\')g r=p.x-1.3.m.x-(1.w-1.3.5*1.3.8.n())/2-1.3.5/2;u k(1.3.b&&1.3.b==\'N\')g r=p.x-1.3.m.x-1.w+1.3.5*1.3.8.n();u g r=p.x-1.3.m.x;g M=B.G(p.y-1.3.m.y-1.X/2,2);1.3.8.F(9(q){6=B.Q(B.G(r-q*1.3.5,2)+M);6-=1.3.5/2;6=6<0?0:6;6=6>1.3.j?1.3.j:6;6=1.3.j-6;C=1.3.A*6/1.3.j;7.a.D=1.3.5+C+\'f\';7.a.o=1.3.5*q+c+\'f\';c+=C});4.h.s(1,c)})})},s:9(1,c){k(1.3.b)k(1.3.b==\'L\')1.3.i.l(0).a.o=(1.w-1.3.5*1.3.8.n())/2-c/2+\'f\';u k(1.3.b==\'o\')1.3.i.l(0).a.o=-c/1.3.8.n()+\'f\';u k(1.3.b==\'N\')1.3.i.l(0).a.o=(1.w-1.3.5*1.3.8.n())-c/2+\'f\';1.3.i.l(0).a.D=1.3.5*1.3.8.n()+c+\'f\'},E:9(1){1.3.8.F(9(q){7.a.D=1.3.5+\'f\';7.a.o=1.3.5*q+\'f\'})}};4.V.U=4.h.H;',62,64,'|el||fisheyeCfg|jQuery|itemWidth|distance|this|items|function|style|halign|toAdd|options||px|var|iFisheye|container|proximity|if|get|pos|size|left|pointer|nr|posx|positionContainer|itemsText|else|bind|offsetWidth|||iUtil|maxWidth|Math|extraWidth|width|positionItems|each|pow|build|display|getPosition|valign|center|posy|right|mouseover|block|sqrt|mouseout|window|return|Fisheye|fn|resize|offsetHeight|getPointer|document|mousemove|none'.split('|'),0,{}))
Obviously, this code is intentionally written to confuse other people. How can I understand it and rewrite it in simple code?
Is there some tool for this job? This is very common in HTML.
This is not "encrypted", it is just obfuscated.
Yes, there are tools available to help, but it isn't a perfect process. All of the original variable names and comments and what not are gone, so a tool can't really add that stuff back in. You have to figure out the details yourself, but a tool can make it easier.
I wish people would stop doing that. There's just no way to "encrypt" JavaScript. It's an exercise in futility (minification is good, but obfuscation is bad and useless)
That being said, try using JSBeautifier. It gives me the following result:
jQuery.iFisheye = {
build: function (options) {
return this.each(function () {
var el = this;
el.fisheyeCfg = {
items: jQuery(options.items, this),
container: jQuery(options.container, this),
pos: jQuery.iUtil.getPosition(this),
itemWidth: options.itemWidth,
itemsText: options.itemsText,
proximity: options.proximity,
valign: options.valign,
halign: options.halign,
maxWidth: options.maxWidth
};
jQuery.iFisheye.positionContainer(el, 0);
jQuery(window).bind('resize', function () {
el.fisheyeCfg.pos = jQuery.iUtil.getPosition(el);
jQuery.iFisheye.positionContainer(el, 0);
jQuery.iFisheye.positionItems(el)
});
jQuery.iFisheye.positionItems(el);
el.fisheyeCfg.items.bind('mouseover', function () {
jQuery(el.fisheyeCfg.itemsText, this).get(0).style.display = 'block'
}).bind('mouseout', function () {
jQuery(el.fisheyeCfg.itemsText, this).get(0).style.display = 'none'
});
jQuery(document).bind('mousemove', function (e) {
var pointer = jQuery.iUtil.getPointer(e);
var toAdd = 0;
if (el.fisheyeCfg.halign && el.fisheyeCfg.halign == 'center') var posx = pointer.x - el.fisheyeCfg.pos.x - (el.offsetWidth - el.fisheyeCfg.itemWidth * el.fisheyeCfg.items.size()) / 2 - el.fisheyeCfg.itemWidth / 2;
else if (el.fisheyeCfg.halign && el.fisheyeCfg.halign == 'right') var posx = pointer.x - el.fisheyeCfg.pos.x - el.offsetWidth + el.fisheyeCfg.itemWidth * el.fisheyeCfg.items.size();
else var posx = pointer.x - el.fisheyeCfg.pos.x;
var posy = Math.pow(pointer.y - el.fisheyeCfg.pos.y - el.offsetHeight / 2, 2);
el.fisheyeCfg.items.each(function (nr) {
distance = Math.sqrt(Math.pow(posx - nr * el.fisheyeCfg.itemWidth, 2) + posy);
distance -= el.fisheyeCfg.itemWidth / 2;
distance = distance < 0 ? 0 : distance;
distance = distance > el.fisheyeCfg.proximity ? el.fisheyeCfg.proximity : distance;
distance = el.fisheyeCfg.proximity - distance;
extraWidth = el.fisheyeCfg.maxWidth * distance / el.fisheyeCfg.proximity;
this.style.width = el.fisheyeCfg.itemWidth + extraWidth + 'px';
this.style.left = el.fisheyeCfg.itemWidth * nr + toAdd + 'px';
toAdd += extraWidth
});
jQuery.iFisheye.positionContainer(el, toAdd)
})
})
},
positionContainer: function (el, toAdd) {
if (el.fisheyeCfg.halign) if (el.fisheyeCfg.halign == 'center') el.fisheyeCfg.container.get(0).style.left = (el.offsetWidth - el.fisheyeCfg.itemWidth * el.fisheyeCfg.items.size()) / 2 - toAdd / 2 + 'px';
else if (el.fisheyeCfg.halign == 'left') el.fisheyeCfg.container.get(0).style.left = -toAdd / el.fisheyeCfg.items.size() + 'px';
else if (el.fisheyeCfg.halign == 'right') el.fisheyeCfg.container.get(0).style.left = (el.offsetWidth - el.fisheyeCfg.itemWidth * el.fisheyeCfg.items.size()) - toAdd / 2 + 'px';
el.fisheyeCfg.container.get(0).style.width = el.fisheyeCfg.itemWidth * el.fisheyeCfg.items.size() + toAdd + 'px'
},
positionItems: function (el) {
el.fisheyeCfg.items.each(function (nr) {
this.style.width = el.fisheyeCfg.itemWidth + 'px';
this.style.left = el.fisheyeCfg.itemWidth * nr + 'px'
})
}
};
jQuery.fn.Fisheye = jQuery.iFisheye.build;
Other links (lifted from the very same page):
Chrome: jsbeautify-for-chrome by Tom Rix,
Chrome: Pretty Beautiful JavaScript by Will McSweeney,
Firefox: Javascript deminifier by Ben Murphy,
to be used together with the firebug,
Safari: Safari extension by Sandro Padin,
Opera: Readable JavaScript by Dither,
Opera: Source extension by Deathamns,
Fiddler proxy: JavaScript Formatter addon
Using one of the unpackers mentioned on this question:
How to unpack the contents of a Javascript file?
you can unpack the packed javascript to the following code:
jQuery.iFisheye = {
build: function (options) {
return this.each(function () {
var el = this;
el.fisheyeCfg = {
items: jQuery(options.items, this),
container: jQuery(options.container, this),
pos: jQuery.iUtil.getPosition(this),
itemWidth: options.itemWidth,
itemsText: options.itemsText,
proximity: options.proximity,
valign: options.valign,
halign: options.halign,
maxWidth: options.maxWidth
};
jQuery.iFisheye.positionContainer(el, 0);
jQuery(window).bind('resize', function () {
el.fisheyeCfg.pos = jQuery.iUtil.getPosition(el);
jQuery.iFisheye.positionContainer(el, 0);
jQuery.iFisheye.positionItems(el)
});
jQuery.iFisheye.positionItems(el);
el.fisheyeCfg.items.bind('mouseover', function () {
jQuery(el.fisheyeCfg.itemsText, this).get(0).style.display = 'block'
}).bind('mouseout', function () {
jQuery(el.fisheyeCfg.itemsText, this).get(0).style.display = 'none'
});
jQuery(document).bind('mousemove', function (e) {
var pointer = jQuery.iUtil.getPointer(e);
var toAdd = 0;
if (el.fisheyeCfg.halign && el.fisheyeCfg.halign == 'center') var posx = pointer.x - el.fisheyeCfg.pos.x - (el.offsetWidth - el.fisheyeCfg.itemWidth * el.fisheyeCfg.items.size()) / 2 - el.fisheyeCfg.itemWidth / 2;
else if (el.fisheyeCfg.halign && el.fisheyeCfg.halign == 'right') var posx = pointer.x - el.fisheyeCfg.pos.x - el.offsetWidth + el.fisheyeCfg.itemWidth * el.fisheyeCfg.items.size();
else var posx = pointer.x - el.fisheyeCfg.pos.x;
var posy = Math.pow(pointer.y - el.fisheyeCfg.pos.y - el.offsetHeight / 2, 2);
el.fisheyeCfg.items.each(function (nr) {
distance = Math.sqrt(Math.pow(posx - nr * el.fisheyeCfg.itemWidth, 2) + posy);
distance -= el.fisheyeCfg.itemWidth / 2;
distance = distance < 0 ? 0 : distance;
distance = distance > el.fisheyeCfg.proximity ? el.fisheyeCfg.proximity : distance;
distance = el.fisheyeCfg.proximity - distance;
extraWidth = el.fisheyeCfg.maxWidth * distance / el.fisheyeCfg.proximity;
this.style.width = el.fisheyeCfg.itemWidth + extraWidth + 'px';
this.style.left = el.fisheyeCfg.itemWidth * nr + toAdd + 'px';
toAdd += extraWidth
});
jQuery.iFisheye.positionContainer(el, toAdd)
})
})
},
positionContainer: function (el, toAdd) {
if (el.fisheyeCfg.halign) if (el.fisheyeCfg.halign == 'center') el.fisheyeCfg.container.get(0).style.left = (el.offsetWidth - el.fisheyeCfg.itemWidth * el.fisheyeCfg.items.size()) / 2 - toAdd / 2 + 'px';
else if (el.fisheyeCfg.halign == 'left') el.fisheyeCfg.container.get(0).style.left = -toAdd / el.fisheyeCfg.items.size() + 'px';
else if (el.fisheyeCfg.halign == 'right') el.fisheyeCfg.container.get(0).style.left = (el.offsetWidth - el.fisheyeCfg.itemWidth * el.fisheyeCfg.items.size()) - toAdd / 2 + 'px';
el.fisheyeCfg.container.get(0).style.width = el.fisheyeCfg.itemWidth * el.fisheyeCfg.items.size() + toAdd + 'px'
},
positionItems: function (el) {
el.fisheyeCfg.items.each(function (nr) {
this.style.width = el.fisheyeCfg.itemWidth + 'px';
this.style.left = el.fisheyeCfg.itemWidth * nr + 'px'
})
}
};
jQuery.fn.Fisheye = jQuery.iFisheye.build;
In this case, you can get the original source here: http://interface.eyecon.ro/download. It's not really "obfuscated", in that the goal wasn't really obfuscation; rather, the goal was "compression" (minification), and the tool for that was a compressor/obfuscator.
(Of course, the tools that everyone else mentions are indispensable here. I used jsbeautifier.org to find that the whole thing is an assignment to jQuery.iFisheye, which then told me what to Google to find the above.)
Related
Adding decimals to rangeslider
This is the function I'm using for making the range slider: function rangeSlider(id, onDrag) { var range = document.getElementById(id), dragger = range.children[0], draggerWidth = 20, // width of your dragger down = false, rangeWidth, rangeLeft; dragger.style.width = draggerWidth + 'px'; dragger.style.left = -draggerWidth + 'px'; dragger.style.marginLeft = (draggerWidth / 2) + 'px'; range.addEventListener("mousedown", function(e) { rangeWidth = this.offsetWidth; rangeLeft = this.offsetLeft; down = true; updateDragger(e); return false; }); document.addEventListener("mousemove", function(e) { updateDragger(e); }); document.addEventListener("mouseup", function() { down = false; }); function updateDragger(e) { if (down && e.pageX >= rangeLeft && e.pageX <= (rangeLeft + rangeWidth)) { dragger.style.left = e.pageX - rangeLeft - draggerWidth + 'px'; if (typeof onDrag == "function") onDrag(Math.round(((e.pageX - rangeLeft) / rangeWidth) * 100)); } } } // Run! rangeSlider('range-slider-1', function(value) { document.getElementById('test-result').innerHTML = value + '%'; }); rangeSlider('range-slider-2', function(value) { document.getElementById('test-result').innerHTML = value + '%'; }); JSBIN: http://jsbin.com/yuvekecodo/edit?html,js,output How can I have the output in decimals? For example if I set the range from 10 - 100 I want it to be able to have the decimals. 10.01, 10.02, 10.03 ~ 99.97. 99.98, 99.99, etc. What is the best way to achieve this? Thanks guys, I'm loosing my mind over this for days. Cheers. Thanksl
Please try this may help to get 2 digit decimal point values: if (typeof onDrag == "function") onDrag(parseFloat(((e.pageX - rangeLeft) / rangeWidth) * 100).toFixed(2)); Use it for like: function updateDragger(e) { if (down && e.pageX >= rangeLeft && e.pageX <= (rangeLeft + rangeWidth)) { dragger.style.left = e.pageX - rangeLeft - draggerWidth + 'px'; var startpnt=10,endpnt=50,baseval_percent,baseval; baseval_percent = ((e.pageX - rangeLeft) / rangeWidth) * 100; baseval = (endpnt-startpnt)*baseval_percent/100; baseval = baseval+startpnt; if (typeof onDrag == "function") onDrag(parseFloat(baseval).toFixed(2)); } }
JavaScript Css Animation
I have a Javascript animation at http://dev17.edreamz3.com/css/ All code works, however, there are performance problems. on Desktop, its good, On mobile things are so slow that it's unusable. I want to optimize the animation so that it runs smoothly on mobile. It can take 20 seconds or more for the animation to render. Right now the way the code is designed is in js/anim.js there is a render() function that gets executed every time a scroll event happens. The problem is that this routine is not efficient, that's what I think of. Each time render() executes it loops through all the paths and sections of the maze and redraws them, is there any alternative way or a strategy to get it working both on mobile as well as desktop. var offPathTime = 1000; window.offSection = -1; function render() { // var top = ($window.scrollTop() + (0.4 * $window.height())) / window.scale; var top = ($('.parent-div').scrollTop() + (0.4 * $('.parent-div').height())) / window.scale; top -= 660; top /= mazeSize.h; if (window.offSection != -1) { $body.addClass("blockScroll"); $('.parent-div').addClass("blockScroll"); // var wtop = $window.scrollTop() / window.scale; var wtop = $('.parent-div').scrollTop() / window.scale; wtop -= 660; wtop /= mazeSize.h; var $offSection = $("#offSection" + window.offSection); var $section = $("#section" + window.offSection); $(".section").removeClass("sectionActive"); $offSection.addClass("sectionActive"); $section.addClass("sectionActive"); var sTop = 200 -(mazeSize.h * (window.offSections[window.offSection].cy - wtop)); $container.animate({ left: 290 -(mazeSize.w * window.offSections[window.offSection].cx) + "px", top: sTop + "px" }, offPathTime); // Path var lr = offPaths[window.offSection].x1 > offPaths[window.offSection].x0; var dx = Math.abs(offPaths[window.offSection].x1 - offPaths[window.offSection].x0); var dashw = (dx * mazeSize.w) | 0; $offPaths[window.offSection].css("width", "0px"); $offPaths[window.offSection].show(); if (lr) { $offPaths[window.offSection].animate({ width: dashw + "px" }, offPathTime); } else { var x0 = offPaths[window.offSection].x0 * mazeSize.w; var x1 = offPaths[window.offSection].x1 * mazeSize.w; $offPaths[window.offSection].css("left", x0 + "px"); $offPaths[window.offSection].animate({ width: dashw + "px", left: x1 + "px" }, offPathTime); } return; } $body.removeClass("blockScroll"); $('.parent-div').removeClass("blockScroll"); $(".offPath").hide(); if ($container.css("top") != "0px") { $container.animate({ left: "-1550px", top: "0px" }, 500); } var pathIdx = -1; var path0 = paths[0]; var path1; var inPath = 0; var i; var curTop = 0; var found = false; for (i=0; i<paths.length; i++) { var top0 = (i == 0) ? 0 : paths[i-1].y; var top1 = paths[i].y; if (top >= top0 && top < top1) { pathIdx = i; path1 = paths[i]; inPath = (top - top0) / (top1 - top0); found = true; if (i > 0) { var dy = paths[i].y - paths[i-1].y; var dx = paths[i].x - paths[i-1].x; var vert = dx == 0; if (vert) $paths[i-1].css("height", (dy * mazeSize.h * inPath) + "px"); $paths[i-1].show(); } } else if (top >= top0) { path0 = paths[i]; var dy = paths[i].y - top0; var vert = dy != 0; if (i > 0) { if (vert) $paths[i-1].css("height", (dy * mazeSize.h) + "px"); $paths[i-1].show(); } } else { if (i > 0) { $paths[i-1].hide(); } } curTop = top1; } // Check for an active section $(".section").removeClass("sectionActive"); var section; for (i=0; i<sections.length; i++) { var d = Math.abs(sections[i].cy - (top - 0.05)); if (d < 0.07) { var $section = $("#section" + i); $section.addClass("sectionActive"); } } }
1) At the very least - assign all DOM objects to variables outside of the function scope. Like this: var $parentDiv = $('.parent-div'); var $sections = $(".section"); ... function render() { ... 2) Also you should probably stop animation before executing it again, like this: $container.stop(true).animate({ ... If you are running render() function on scroll - it will run many times per second. stop() helps to prevent it somewhat. 3) If it will not be sufficient - you can switch from jQuery to Zepto(jQuery-like api, but much faster and uses css transitions for animations) or to Velocity(basically drop-in replacement for jQuery $.animate and much faster than original) or even to GSAP - much more work obviously, but it is very fast and featured animation library.
Want the script corrected not to change the size of images
I want this script not to change the sizes of the images but the same sizes anywhere they are during sliding. The issue is somewhere in this code but i don't know which one that is changing the size. I want an even size /** * Given the item and position, this function will calculate the new data * for the item. One the calculations are done, it will store that data in * the items data object */ function performCalculations($item, newPosition) { var newDistanceFromCenter = Math.abs(newPosition); // Distance to the center if (newDistanceFromCenter < options.flankingItems + 1) { var calculations = data.calculations[newDistanceFromCenter]; } else { var calculations = data.calculations[options.flankingItems + 1]; } var distanceFactor = Math.pow(options.sizeMultiplier, newDistanceFromCenter) var newWidth = distanceFactor * $item.data('original_width'); var newHeight = distanceFactor * $item.data('original_height'); var widthDifference = Math.abs($item.width() - newWidth); var heightDifference = Math.abs($item.height() - newHeight); var newOffset = calculations.offset var newDistance = calculations.distance; if (newPosition < 0) { newDistance *= -1; } if (options.orientation == 'horizontal') { var center = data.containerWidth / 2; var newLeft = center + newDistance - (newWidth / 2); var newTop = options.horizon - newOffset - (newHeight / 2); } else { var center = data.containerHeight / 2; var newLeft = options.horizon - newOffset - (newWidth / 2); var newTop = center + newDistance - (newHeight / 2); } var newOpacity; if (newPosition === 0) { newOpacity = 1; } else { newOpacity = calculations.opacity; } // Depth will be reverse distance from center var newDepth = options.flankingItems + 2 - newDistanceFromCenter; $item.data('width',newWidth); $item.data('height',newHeight); $item.data('top',newTop); $item.data('left',newLeft); $item.data('oldPosition',$item.data('currentPosition')); $item.data('depth',newDepth); $item.data('opacity',newOpacity); } function moveItem($item, newPosition) { // Only want to physically move the item if it is within the boundaries // or in the first position just outside either boundary if (Math.abs(newPosition) <= options.flankingItems + 1) { performCalculations($item, newPosition); data.itemsAnimating++; $item .css('z-index',$item.data().depth) // Animate the items to their new position values .animate({ left: $item.data().left, width: $item.data().width, height: $item.data().height, top: $item.data().top, opacity: $item.data().opacity }, data.currentSpeed, options.animationEasing, function () { // Animation for the item has completed, call method itemAnimationComplete($item, newPosition); }); } else { $item.data('currentPosition', newPosition) // Move the item to the 'hidden' position if hasn't been moved yet // This is for the intitial setup if ($item.data('oldPosition') === 0) { $item.css({ 'left': $item.data().left, 'width': $item.data().width, 'height': $item.data().height, 'top': $item.data().top, 'opacity': $item.data().opacity, 'z-index': $item.data().depth }); } } }
Stop function when pressing ctrl jQuery
So I am making a little game where you have to press Ctrl to stop a div from jumping randomly. However I can't get it working... The jumpRandom function works fine, until i put the randomJump(){return false;}; inside the if (event.ctrlKey) {}. What should I do to get it working? js: $(document).ready(function() { function randomFromTo(from, to){ return Math.floor(Math.random() * (to - from + 1) + from); } $( "#goal" ).bind('mouseenter keypress', function(event) { if (event.ctrlKey) { randomJump(){return false;}; } }); $('#goal').mouseenter(randomJump); function randomJump(){ /* get Window position and size * -- access method : cPos.top and cPos.left*/ var cPos = $('#pageWrap').offset(); var cHeight = $(window).height() - $('header').height() - $('footer').height(); var cWidth = $(window).width(); // get box padding (assume all padding have same value) var pad = parseInt($('#goal').css('padding-top').replace('px', '')); // get movable box size var bHeight = $('#goal').height(); var bWidth = $('#goal').width(); // set maximum position maxY = cPos.top + cHeight - bHeight - pad; maxX = cPos.left + cWidth - bWidth - pad; // set minimum position minY = cPos.top + pad; minX = cPos.left + pad; // set new position newY = randomFromTo(minY, maxY); newX = randomFromTo(minX, maxX); $('#goal').fadeOut(50, function(){ $('#goal').fadeIn(700); }); $('#goal').animate({ left: newX, top: newY, duration: 500 }); } });
Try this: $("#goal").bind('mouseenter keypress', function (e) { randomJump(e); }); function randomJump(e) { if (!e.ctrlKey) { //do normal stuff } else { //depending on how permanent you need this to be... //$("#goal").unbind('mouseenter keypress'); } return !e.ctrlKey; }
This javascript fails on mouseover
can anyone figure out why this JavaScript won't work? It correctly generates the document.write output, but when you try to drag it it starts complaining about top and left not being set. any idea whats wrong? abilitynames=new Array('Heal','Slash','Stab','Poison Slash','Knockout','','','','Tornado','','','','','','','','Icespike','','','','','','','','Bolt','Jumping Bolt','','','','','','','Roast','Burn','','','','','','','Earthquake','Rockwall','','','','','','','Kill','Deflect','Anti-Heal','','','','','','Backslash','Darkwall','Steal','Take','','','',''); abilitytypes=new Array(3,1,1,1,1,2,2,2,1,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,2,1,2,3,2,2,2,2,2,1,2,3,3,2,2,2,2); abilitycolors=new Array('#00FF00','#FFFFFF','#0000FF','#FFFF00','#FF0000','#AD6C00','#AD00FF','#000000'); for(i=0;i<64;i++){ document.write("<div onmousedown='dragging=this.id;this.style.position=\"fixed\";this.style.zIndex=1000;this.style.left=event.clientX-75;this.style.top=event.clientY-15;' onmouseout='if(dragging===this.id){this.style.left=event.clientX-75;this.style.top=event.clientY-15;}' onmousemove='if(dragging===this.id){this.style.left=event.clientX-75;this.style.top=event.clientY-15;}' onmouseup='dragging=false;if(event.clientX<450||event.clientY>"+(180+(abilitytypes[i]*90))+"||event.clientY<"+(100+((abilitytypes[i]-1)*(90*abilitytypes[i])/((4%abilitytypes[i])+1)))+"){this.style.position=\"relative\";this.style.top=0;this.style.left=0;this.style.zIndex=0;}else{this.style.left=460;this.style.top=(Math.round((event.clientY-30)/45)*45)+15;if(abilitys[Math.round((event.clientY-120)/45)]!=\"\"&&abilitys[Math.round((event.clientY-120)/45)]!=this.id){document.getElementById(abilitys[Math.round((event.clientY-120)/45)]).style.position=\"relative\";document.getElementById(abilitys[Math.round((event.clientY-120)/45)]).style.left=0;document.getElementById(abilitys[Math.round((event.clientY-120)/45)]).style.top=0;}abilitys[Math.round((event.clientY-120)/45)]=this.id;alert(abilitys);}' id='"+i+"' class='abilityblock"+abilitytypes[i]+"'><div class='abilityicon' style='background-position:"+(Math.floor(i/8)*-20)+"px "+((i%8)*-20)+"px;'></div><div class='abilityname' style='color:"+abilitycolors[Math.floor(i/8)]+";'>"+abilitynames[i]+"</div></div>"); }
I've probably broken the script just TRYING to clean up this unholy mess and simplifying things a little, but at least it seems to be a bit more readable now (not including the array definitions): <script type="text/javascript"> var dragging; function mouseDown(el) { dragging = el.id; el.style.position = "fixed"; el.style.zIndex = 1000; el.style.left = event.clientX - 75; el.style.top = event.clientY-15; } function mouseOut(el) { if (dragging === el.id) { el.style.left = event.clientX - 75; el.style.top = event.clientY - 15; } } function mouseMove(el) { if (dragging === el.id) { el.style.left = event.clientX - 75; el.style.top = event.clientY - 15; } } function mouseUp(el, i) { dragging = false; if ( (event.clientX < 450) || (event.clientY > (180 + (abilitytypes[i] * 90)) ) || (event.clientY < (100 + (abilitytypes[i] - 1) * (90 * abilitytypes[i]) / ((4 % abilitytypes[i]) + 1)))) { el.style.position = "relative"; el.style.top = 0; el.style.left = 0; el.style.zIndex = 0; } else { el.style.left = 460; el.style.top = (Math.round((event.clientY - 30) / 45) * 45) + 15; if ((abilitys[Math.round((event.clientY - 120) / 45)] != "") && (abilitys[Math.round((event.clientY - 120) / 45)] != el.id)) { var subel = document.getElementById(abilitys[Math.round((event.clientY-120)/45)]); subel.style.position="relative"; subel.style.left=0; subel.style.top=0; } abilitys[Math.round((event.clientY - 120) / 45)] = el.id; alert(abilitys); } } for(var i = 0; i < 64; i++){ document.write(" <div onmousedown='mouseDown(this);' onmouseout='mouseOut(this);' onmousemove='mouseMove(el);' onmouseup='mouseUp(this, i);' id='"+i+"' class='abilityblock"+abilitytypes[i]+"'> <div class='abilityicon' style='background-position:"+(Math.floor(i/8)*-20)+"px "+((i%8)*-20)+"px;'></div> <div class='abilityname' style='color:"+abilitycolors[Math.floor(i/8)]+";'>"+abilitynames[i]+"</div> </div>"); } </script> Phew. And after all that, I'm guessing your missing 'left' and 'top' parameters are because your dynamically computed element IDs are generating non-existent IDs in the mouseup handler. My suggestion? Scrap this home-brew drag 'n drop stuff and use the functionality provided by Mootools or jQuery. Far less trouble, especially when having to deal with cross-browser differences.
Searching your code, you haven't defined an onmouseover event. You define onmousedown, onmouseout, onmousemove, and onmouseup. No onmouseover.