var aEmousemove, aEmousedown, aEmouseup, aEkeydown, aEkeyup;

function preventSelection(element){
        var preventSelection = false;

        function removeSelection() {
                if (window.getSelection) {
                        window.getSelection().removeAllRanges();
                } else if (document.selection && document.selection.clear) {
                        document.selection.clear();
                }
        }

        function killCtrlA(event) {
                var event = event || window.event;
                var sender = event.target || event.srcElement;
                if (sender.tagName.match(/INPUT|TEXTAREA/i))
                return;
                var key = event.keyCode || event.which;
                if (event.ctrlKey && key == 63)
                {
                        removeSelection();
                        if (event.preventDefault) event.preventDefault();
                        else event.returnValue = false;
                }
        }

        aEmousemove = addEvent(element, 'mousemove', function() { if(preventSelection) removeSelection(); });
        aEmousedown = addEvent(element, 'mousedown', function(event) { var event = event || window.event;
                                                         var sender = event.target || event.srcElement;
                                                         preventSelection = !sender.tagName.match(/INPUT|TEXTAREA/i);
                                                        });
        aEmouseup = addEvent(element, 'mouseup', function() { if (preventSelection) removeSelection(); preventSelection = false; });
        aEkeydown = addEvent(element, 'keydown', killCtrlA);
        aEkeyup = addEvent(element, 'keyup', killCtrlA);
}

function removeSelection(element) {
        removeEvent(element, 'mousemove', aEmousemove);
        removeEvent(element, 'mousedown', aEmousedown);
        removeEvent(element, 'mouseup', aEmouseup);
        removeEvent(element, 'keydown', aEkeydown);
        removeEvent(element, 'keyup', aEkeyup);
}

preventSelection(document);
