// ==UserScript==	
// @match http://*/*
// @run-at document-start
// ==/UserScript==
(function() {
	__madblock__setCookie = function(name, value, path)
	{
		path = (path == null || path == ''? '': ';path=' + escape(path));
		document.cookie = escape(name) + '=' + escape(value) + path;
	}
	
	__madblock__getCookie = function(name)
	{
		name = escape(name);
		if (document.cookie.length > 0)
		{
			var start = document.cookie.indexOf(name + '=');
			if (start != -1)
			{ 
				start = start + name.length + 1; 
				var end = document.cookie.indexOf(';', start);
				if (end == -1)
				  end = document.cookie.length;
				return unescape(document.cookie.substring(start, end));
			} 
		}
		return '';		
	}
		
	__madblock__getCookieNames = function(name)
	{
		var cookies = [];
		name = escape(name);
		if (document.cookie.length > 0)
		{
			for(var start = document.cookie.indexOf(name); start != -1; start = document.cookie.indexOf(name, start + 1))
			{
				var end = document.cookie.indexOf('=', start + 1);
				if (end == -1)
					end = document.cookie.length;
				cookies = cookies.concat(unescape(document.cookie.substring(start, end)));
			} 
		}
		return cookies;
	}
	
	__madblock__getPathname = function()
	{
		var path = '';
		var last = window.location.pathname.lastIndexOf('/');
		if(last > 0)
			path = window.location.pathname.substring(0, last);
		else
			path = window.location.pathname;

		return path;
	}
	
	document.addEventListener('mousedown', function(e) {
		if(e.ctrlKey && e.shiftKey && e.button == 2)
		{
			var cookie = __madblock__getCookie('__madblock__');
			if(cookie == '1')
			{
				var path = prompt("<Madblock>\n\nMadblock is currenly disabled within " + location.hostname + " in currrent path. Would you like to enable it?\n\nSetting applies in:", __madblock__getPathname());
				if(path != null)
					__madblock__setCookie('__madblock__', '0', path);
			}
			else
			{
				var path = prompt("<Madblock>\n\nMadblock is currently enabled within " + location.hostname + ". Would you like to disable it?\n\nSetting applies in:", __madblock__getPathname());
				if(path != null)
				{
					__madblock__setCookie('__madblock__', '1');
					var cookies = __madblock__getCookieNames('__madblock__');
					for(i = 0; i < cookies.length; ++i)
						__madblock__setCookie(cookies[i], '1', path);
				}
			}
		}
	}, false);

	
	if(__madblock__getCookie('__madblock__') == '1')
		return;
		
	__madblock__getElementSize = function(element) {
		var w = element.offsetWidth;
		var h = element.offsetHeight;
		if(element.width)
			w = element.width;
		if(element.height)
			h = element.height;
		if(!w)
			w = 1;
		if(!h)
			h = 1;
		
		return [w, h];
	}
	
	__madblock__blockElement = function(element) {
		if(element.style.display == 'none' || element.__madblock__unblock)
			return;
			
		var unblockID = element.nodeName.toLowerCase() + (element.id? ' id="' + element.id + '"': '') + (element.name? ' name="' + element.name + '"' : '') + (element.type? ' type="' + element.type + '"' : '') + (element.alt? ' alt="' + element.alt + '"' : '');
		if(__madblock__getCookie('__madblock__ ' + unblockID) == '0')
		{
			element.__madblock__unblock = true;
			return;
		}
		
		var size = __madblock__getElementSize(element);
		var placeholder = document.createElement('div');
		placeholder.innerHTML = '<div style="display: table-cell; text-align: center; vertical-align: middle; cursor: default">' + element.nodeName.toLowerCase() + (element.id? ' ' + element.id : element.name? ' ' + element.name : element.alt? ' ' + element.alt : '').toLowerCase() + '</div>';
		placeholder.style.textAlign = 'left';
		placeholder.style.cursor = 'default';
		placeholder.style.color = 'black';
		placeholder.style.backgroundColor = 'white';
		placeholder.style.width = (size[0] - 2) + 'px';
		placeholder.style.height = (size[1] - 2) + 'px';
		placeholder.style.overflow = 'hidden';
		placeholder.style.border = 'solid 1px black';
		placeholder.style.margin = '0';
		placeholder.style.padding = '0';
		placeholder.style.fontSize = '11px';
		placeholder.style.fontFamily = document.body.fontFamily? document.body.fontFamily : 'sans-serif';
		placeholder.style.textDecoration = 'none';
		placeholder.style.fontWeight = 'normal';
		placeholder.style.display = 'inline-table';
		placeholder.style.opacity = '0.25';
		placeholder.style.textAlign = 'center';
		placeholder.style.verticalAlign = 'middle';
		
		placeholder.__madblock__styleDisplay = element.style.display;
		element.parentNode.insertBefore(placeholder, element);	
		
		__madblock__showElement = function(element, placeholder) {
			element.__madblock__unblock = true;
			element.style.display = placeholder.__madblock__styleDisplay;
			placeholder.style.display = 'none';
		}
		
		placeholder.addEventListener('mousedown', function(e) {
			if(e.button == 0)
			{
				__madblock__showElement(element, placeholder);
				if(e.shiftKey && e.ctrlKey)
				{
					var path = prompt("<Madblock>\n\nAre you sure you want to unblock\n\n<" + unblockID + ">\n\nwithin " + location.hostname + "?\n\nSetting applies in:", __madblock__getPathname());
					if(path != null)
						__madblock__setCookie('__madblock__ ' + unblockID, '0', path);
				}
			}
		}, true);
		placeholder.addEventListener('mouseover', function() {
			placeholder.__madblock__mouseOverTime = (new Date()).getTime();
			placeholder.style.opacity = '0.5';
		}, true);
		placeholder.addEventListener('mouseout', function() {
			placeholder.__madblock__mouseOverTime = (new Date()).getTime();
			placeholder.style.opacity = '0.25';
		}, true);
		placeholder.addEventListener('mousemove', function(e) {
			if(!e.ctrlKey && !e.shiftKey && (new Date()).getTime() - placeholder.__madblock__mouseOverTime > 1000)
				__madblock__showElement(element, placeholder);
		}, true);
		element.style.display = 'none';
	}

	__madblock__filterElement = function(element) {
		try
		{
			if(element.nodeName == 'IMG')
			{
				var size = __madblock__getElementSize(element);
				if((size[0] < 190 || size[1] < 190) && size[0] * size[1] > 190 * 190)
					__madblock__blockElement(element);
			}
			else if(element.nodeName == 'OBJECT')
			{
				__madblock__blockElement(element);
			}
			else if(element.nodeName == 'EMBED')
			{
				__madblock__blockElement(element);
			}
			else if(element.nodeName == 'IFRAME' || element.nodeName == 'FRAME')
			{
				__madblock__blockElement(element);
				
				if(element.contentDocument && element.contentDocument.body)
				{				
					setTimeout(function() {
						element.removeEventListener('load', __madblock__filterElementEvent, false);
						element.contentDocument.body.addEventListener('DOMNodeInserted', __madblock__filterElementEvent, false);
						
						if(!element.__madblock__scanLoopCount)
							element.__madblock__scanLoopCount = 1;
						else
							element.__madblock__scanLoopCount = element.__madblock__scanLoopCount + 1;
						
						if(element.__madblock__scanLoopCount < 3)
							__madblock__scanLoop(element.contentDocument.body, 100);
					}, 100);
				}
				else
				{
					element.addEventListener('load', __madblock__filterElementEvent, false);
				}
			}
		}
		catch(ex)
		{
		}
	}

	__madblock__filterElements = function(elements)	{
		for(i = 0; i < elements.length; i++)
			__madblock__filterElement(elements[i]);
	}
	
	__madblock__scanElements = function(d) {
		__madblock__filterElements(d.getElementsByTagName('IMG'));
		__madblock__filterElements(d.getElementsByTagName('OBJECT'));
		__madblock__filterElements(d.getElementsByTagName('EMBED'));
		__madblock__filterElements(d.getElementsByTagName('FRAME'));
		__madblock__filterElements(d.getElementsByTagName('IFRAME'));
	}
		
	__madblock__filterElementEvent = function(e) {
		__madblock__filterElement(e.target); 
	}
	

	window.addEventListener('DOMNodeInserted', __madblock__filterElementEvent, false);
	window.addEventListener('load', function() {
		try { __madblock__scanElements(document); } catch(ex) {}
	}, false);
	
	__madblock__scanLoop = function(d, ms) {	
		try { __madblock__scanElements(d); } catch(ex) {}
		
		ms = 1.25 * ms;
		if(ms > 10000)
			ms = 10000;
		
		setTimeout(function() { __madblock__scanLoop(d, ms); }, ms);
	}
		
	setTimeout(function() { __madblock__scanLoop(document, 100); }, 100);
})();
