/************************************************\
 *	http://habrahabr.ru/blogs/webdev/18080/		*
\************************************************/
(function() {
	function preventSelection(element) {
		var preventSelection = false;

		function addHandler(element, event, handler) {
			if (element.attachEvent) {
				element.attachEvent('on' + event, handler);
			}
			else if (element.addEventListener) {
				element.addEventListener(event, handler, false);
			}
			else {
				element['on' + event] = handler;
			}
		}
		
		function removeSelection() {
			if (window.getSelection) {
				window.getSelection().removeAllRanges();
			}
			else if (document.selection && document.selection.empty)
				//document.selection.clear();
				document.selection.empty();
		}
	  
		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 == 'A'.charCodeAt(0)) {// 'A'.charCodeAt(0) можно заменить на 65		
				removeSelection();
				
				if (event.preventDefault)
					event.preventDefault();
				else
					event.returnValue = false;
			}
		}
		
		function disableRightClick(event){
			var rightclick;
			var event = event || window.event;
			var sender = event.target || event.srcElement;
			
			if (sender.tagName && sender.tagName.match(/INPUT|TEXTAREA/i))
				return;
			
			if (event.which) {
				rightclick = (event.which == 3 || event.which == 1);
			} else if (event.button) {
				rightclick = (event.button == 2);
			}
			
			if(event.preventDefault) {
				event.preventDefault();
			}
			
			if(event.stopPropagation) {
				event.stopPropagation();
			}
			
			return !rightclick;
		}

		// не даем выделять текст мышкой
		addHandler(element, 'mousemove', function(){
			if(preventSelection)
				removeSelection();
		});
	  
		addHandler(element, 'mousedown', function(event){
			var event = event || window.event;
			var sender = event.target || event.srcElement;
			preventSelection = !sender.tagName.match(/INPUT|TEXTAREA/i);
		});

		// борем dblclick
		// если вешать функцию не на событие dblclick, можно избежать
		// временное выделение текста в некоторых браузерах
		addHandler(element, 'mouseup', function(){
			if (preventSelection)
				removeSelection();
			preventSelection = false;
		});

		// борем ctrl+A
		// скорей всего это и не надо, к тому же есть подозрение
		// что в случае все же такой необходимости функцию нужно 
		// вешать один раз и на document, а не на элемент
		addHandler(element, 'keydown', killCtrlA);
		addHandler(element, 'keyup', killCtrlA);
		
		
		addHandler(element, 'contextmenu', function(){return false;});
		addHandler(element, 'mouseup', disableRightClick);
		addHandler(element, 'mousedown', disableRightClick);	
		addHandler(element, 'contextmenu', function(e) {e.preventDefault();});	
	}
	
	if( !/template\.asp/.test(document.URL) ) {
		preventSelection(document);
	}
})();
