From Wikipedia, the free encyclopedia
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.

/*** Todo List ***/



// Adds a todo list that also has a convient popup

// Documentation at [[en:w:User:BrandonXLF/TodoList]]

// By [[en:w:User:BrandonXLF]]



$.when(mw.loader.using([

	'mediawiki.user',

	'oojs-ui-core',

	'oojs-ui-windows',

	'oojs-ui.styles.icons-movement',

	'oojs-ui.styles.icons-editing-core',

	'oojs-ui.styles.icons-interactions',

	'oojs-ui.styles.icons-moderation',

	'oojs-ui.styles.icons-content'

]), $.ready).then(function() {

	var messages = function() {

		var translations = {

			en: {

				todoPortlet: 'Todo',

				todoHover: 'Click to see your todo list',

				saving: 'Saving changes...',

				drag: 'Drag',

				delete: 'Delete',

				: 'Edit',

				pageNameUrl: 'Page name or URL',

				comment: 'Comment',

				save: 'Save',

				cancel: 'Cancel',

				moreinfo: 'More information',

				undo: 'Undo',

				redo: 'Redo',

				clear: 'Clear',

				clearConfirm: 'Are you sure you want to clear your todo list?',

				download: 'Download',

				upload: 'Upload',

				help: 'Help',

				add: 'Add',

				close: 'Close',

				yourList: 'Your todo list',

				noPopup: 'Unable to open todo list popup while on the todo list page.',

				addedTime: 'Added: $dateDate $dateMonth, $dateYear at $dateHours:$dateMinutes'

			},

			nb: {

				todoPortlet: 'Huskeliste',

				todoHover: 'Klikk for å se huskelista di',

				saving: 'Lagrer endringer …',

				drag: 'Dra',

				delete: 'Slett',

				: 'Rediger',

				pageNameUrl: 'Sidenavn eller URL',

				comment: 'Merknad',

				save: 'Lagre',

				cancel: 'Avbryt',

				moreinfo: 'Mer informasjon',

				undo: 'Angre',

				redo: 'Angre angring',

				clear: 'Tøm',

				clearConfirm: 'Er du sikker på at du vil tømme huskelista di?',

				download: 'Last ned',

				upload: 'Last opp',

				help: 'Hjelp',

				add: 'Legg til',

				close: 'Lukk',

				yourList: 'Huskelista di',

				noPopup: 'Kan ikke åpne oppsprettsboksen med huskelista mens du er på huskelistesiden.',

				addedTime: 'Lagt til: $dateDate. $dateMonth $dateYear kl. $dateHours.$dateMinutes'

			},

			nn: {

				todoPortlet: 'Hugseliste',

				todoHover: 'Klikk for å sjå hugselista di',

				saving: 'Lagrar endringar …',

				drag: 'Dra',

				delete: 'Slett',

				: 'Endre',

				pageNameUrl: 'Sidenamn eller URL',

				comment: 'Merknad',

				save: 'Lagre',

				cancel: 'Avbryt',

				moreinfo: 'Meir informasjon',

				undo: 'Angre',

				redo: 'Angre angring',

				clear: 'Tøm',

				clearConfirm: 'Er du sikker på at du vil tømme hugselista di?',

				download: 'Last ned',

				upload: 'Last opp',

				help: 'Hjelp',

				add: 'Legg til',

				close: 'Lukk',

				yourList: 'Hugselista di',

				noPopup: 'Kan ikkje opna oppsprettsboksen med hugselista mens du er på hugselistesida.',

				addedTime: 'Lagt til: $dateDate. $dateMonth $dateYear kl. $dateHours.$dateMinutes'

			},

			ka: {

				todoPortlet: 'გასაკეთებელი',

				todoHover: 'დააწკაპეთ თქვენი გასაკეთებლების სიის სანახავად',

				saving: 'ინახება…',

				drag: 'გადაადგილება',

				delete: 'წაშლა',

				: 'რედაქტირება',

				pageNameUrl: 'გვერდის სახელი ან ბმული',

				comment: 'კომენტარი',

				save: 'შენახვა',

				cancel: 'გაუქმება',

				moreinfo: 'მეტი ინფორმაცია',

				undo: 'უკან დაბრუნება',

				redo: 'წინ დაბრუნება',

				clear: 'გასუფთავება',

				clearConfirm: 'დარწმუნებული ხართ, რომ თქვენი სიის გასუფთავება გსურთ?',

				download: 'ჩამოტვირთვა',

				upload: 'ატვირთვა',

				help: 'დახმარება',

				add: 'დამატება',

				close: 'დახურვა',

				yourList: 'თქვენი გასაკეთებლების სია',

				noPopup: 'გასაკეთებლების სიის გვერდზე ყოფნის დროს შეუძლებელია სიის ფანჯრის გახსნა.',

				addedTime: 'დამატების თარიღი: $dateDate $dateMonth, $dateYear; $dateHours:$dateMinutes'

			}

		},

			chain = mw.language.getFallbackLanguageChain(),

			len = chain.length,

			ret = {},

			i = len - 1;

		while ( i >= 0 ) {

			if ( translations.hasOwnProperty( chain i  ) ) {

      	$.extend( ret, translations chain i   );

    	}

    	i = i - 1;

  	}

		return ret;

	}();

	

	mw.util.addCSS(

		'.userjs-todo-list .item:hover .act { visibility: visible !important; }' +

		'[data-drop="above"]::before { display: block; border-top: 2px solid #066; margin-top: -2px; content: ""; }' +

		'[data-drop="below"]::after { display: block; border-top: 2px solid #066; margin-top: -2px; content: ""; }' +

		'.userjs-todo-list .items:empty { border: none !important; margin: 0 !important; padding: 0 !important;}' +

		'.userjs-todo-moreinfo > a { min-width: unset !important; min-height: unset !important; padding: 0.65em !important; }' +

		'.userjs-todo-moreinfo > a > span { min-width: unset !important; min-height: unset !important; width: 1.3em !important; left: 0 !important; }'

	);



	if (mw.config.get('skin') === 'minerva') {

		mw.util.addCSS(

			'.userjs-todo-list .item .act { visibility: visible !important; }' +

			'#userjs-todo-popup { top: 0 !important; bottom: 0 !important; left: 0 !important; right: 0 !important; width: 100%; height: 100%; }' +

			'#userjs-todo-popup .userjs-todo-list { width: 100%; height: 100%; } '

		);

	}



	var api = new mw.Api(),

		link = $(mw.util.addPortletLink(

			'p-personal',

			mw.util.getUrl('Special:BlankPage/todo'),

			messages.todoPortlet,

			'userjs-todo',

			messages.todoHover,

			'd',

			'#pt-preferences')

		),

		changes = mw.user.options.get('userjs-todo-script')],

		undo = 0,

		req = 0,

		parent,

		ispopup = false,

		loader = $('<input type="file" accept=".json" style="display:none;">').on('change', function() {

			if (!this.files || !this.files0]) return;

			var file = this.files0],

				reader = new FileReader();

			reader.onload = function() {

				save(reader.result, true, true);

			};

			reader.readAsText(file);

		}).appendTo(document.body);



	$(window).on('beforeunload', function() {

		if (req > 0) return true;

	});



	function save(what, record, relist) {

		if (typeof what != 'string') {

			what = JSON.stringify(what);

		}



		mw.user.options.set('userjs-todo-script', what);

		req++;

		parent.find('.status').text( messages.saving );



		api.saveOption('userjs-todo-script', what).done(function() {

			req--;

			if (req === 0) {

				parent.find('.status').text('');

			}

		});



		if (record !== false) {

			while (undo > 0) {

				changes.pop();

				undo--;

			}



			changes.push(mw.user.options.get('userjs-todo-script'));



			if (changes.length > 50) changes.shift();

		}



		if (relist) {

			list();



			if (req > 0) {

				parent.find('.status').text( messages.saving );

			}

		}

	}



	Math.clamp = function(max, x, min) {

		return Math.min(max, Math.max(min, x));

	};



	function item(parent, array) {

		var date = new Date(+array2]),

			url = array0 || '',

			txt = array0 || '';



		if (url.match(/^(https:|http:|:)\/\//) && url.match(/ /)) {

			var reg = /(.*?) (.*)/.exec(url);

			url = reg1];

			txt = reg2];

		} else if (!url.match(/^(https:|http:|:)\/\//)) {

			url = mw.util.getUrl(url);

		}



		parent.append($('<div class="item" style="margin:5px 0;white-space:nowrap;"></div>')

			.attr('data-page', array0 || '')

			.attr('data-info', array1 || '')

			.attr('data-date', array2 || '')

			.append((new OO.ui.IconWidget({icon: 'draggable', title: messages.drag })).$element

				.css({cursor: 'move', height: '1.2em', width: '1.2em', minWidth: 'unset', minHeight: 'unset', marginRight: '0.5em'})

				.on('mousedown', function() {

					$(this).parent().attr('draggable', 'true');

				})

				.on('mouseup', function() {

					$(this).parent().attr('draggable', 'false');

				})

			)

			.append($('<a>').addClass('page').attr('href', url).text(txt))

			.append(array0 && array1 ? ' . . ' : '')

			.append($('<span>').addClass('info').text(array1 || ''))

			.append(array0 || array1 ? '<span class="act" style="visibility:hidden;"> . . </span>' : '')

			.append((new OO.ui.IconWidget({icon: 'trash', title: messages.delete, flags: 'destructive']})).$element

				.css({cursor: 'pointer', visibility: 'hidden', height: '1.1em', width: '1.1em', minWidth: 'unset', minHeight: 'unset', marginRight: '0.5em'})

				.addClass('act')

				.click(function() {

					var arr = [];

					$(this).parent().siblings().each(function() {

						arr.push([$(this).attr('data-page'), $(this).attr('data-info'), $(this).attr('data-date')]);

					});

					$(this).parent().remove();

					save(arr);

				})

			)

			.append((new OO.ui.IconWidget({icon: 'edit', title: messages., flags: 'progressive']})).$element

				.css({cursor: 'pointer', visibility: 'hidden', height: '1em', width: '1em', minWidth: 'unset', minHeight: 'unset', marginRight: '0.5em'})

				.addClass('act edit')

				.click(function() {

					$(this).css('display', 'none');

					$('<div style="border:1px solid #a2a9b1;padding:0 4px;margin:0.5em 0;border-radius:4px;"></div>')

						.append((new OO.ui.TextInputWidget({

							placeholder: messages.pageNameUrl,

							classes:  'todo-pageNameUrl' ],

							value: $(this).parent().attr('data-page')

						})).$element.css({maxWidth: 'unset', margin: '4px 0'}))

						.append((new OO.ui.TextInputWidget({

							placeholder: messages.comment,

							classes:  'todo-comment' ],

							value: $(this).parent().attr('data-info')

						})).$element.css({maxWidth: 'unset', margin: '4px 0'}))

						.append($('<table style="width:100%;border-spacing:0;margin-bottom:0.5em;"></table>').append($('<tr></tr>')

							.append($('<td style="width:50%;padding-right:4px;"></td>').append((new OO.ui.ButtonWidget({

								label: messages.save,

								flags: 'progressive'

							}).$element.css('width', '100%').children().css('width', '100%').parent()).click(function() {

								var editbox = $(this).parent().parent().parent().parent(),

									listitem = editbox.parent();

								listitem.find('.page').text(editbox.find('.todo-pageNameUrl input').val());

								listitem.attr('data-page', editbox.find('.todo-pageNameUrl input').val());

								listitem.find('.info').text(editbox.find('.todo-comment input').val());

								if (listitem.find('.info')[0].previousSibling.nodeType != 3 && editbox.find('.todo-comment input').val() !== '') {

									listitem.find('.info').before(' . . ');

								} else if (

									listitem.find('.info')[0].previousSibling.nodeType == 3 &&

									editbox.find('.todo-comment input').val() === ''

								) {

									$(listitem.find('.info')[0].previousSibling).remove();

								}

								listitem.attr('data-info', editbox.find('.todo-comment input').val());

								var arr = [];

								listitem.parent().children().each(function() {

									arr.push([$(this).attr('data-page'), $(this).attr('data-info'), $(this).attr('data-date')]);

								});

								save(arr);

								link.find('.redo').remove();

								listitem.find('.edit').css('display', 'inline-block');

								editbox.remove();

							})

							))

							.append($('<td style="width:50%;padding-left:4px;"></td>').append((new OO.ui.ButtonWidget({

								label: messages.cancel,

								flags: 'destructive'

							}).$element.css('width', '100%').children().css('width', '100%').parent()).click(function() {

								var editbox = $(this).parent().parent().parent().parent(),

									listitem = editbox.parent();

								listitem.find('.edit').css('display', 'inline-block');

								editbox.remove();

							})

							))

						)).appendTo(this.parentNode);

				})

			)

			.append(array2 ? (new OO.ui.PopupButtonWidget({

				icon: 'info',

				framed: false,

				label: messages.moreinfo,

				invisibleLabel: true,

				title: messages.moreinfo,

				popup: {

					$content: $('<p></p>').text( messages.addedTime

					 	.replace( '$dateDate', date.getDate() )

						.replace( '$dateMonth', mw.config.get('wgMonthNames')[date.getMonth() + 1 )

						.replace( '$dateYear', date.getFullYear() )

						.replace( '$dateHours', date.getHours() )

						.replace( '$dateMinutes', ('' + date.getMinutes()).padStart(2, '0') )

					),

					padded: true,

					align: 'forwards'

				}

			})).$element

				.addClass('userjs-todo-moreinfo')

				.css({cursor: 'pointer', visibility: 'hidden', height: '1.3em', width: '1.3em', minWidth: 'unset', minHeight: 'unset', marginRight: '0.5em'})

				.addClass('act') : ''

			)

			.on('dragover', function(e) {

				e.preventDefault();

				e.dataTransfer = e.originalEvent.dataTransfer;

				if (e.offsetY < ($(this).height()/2)) {

					this.setAttribute('data-drop', 'above');

				} else {

					this.setAttribute('data-drop', 'below');

				}

			})

			.on('dragleave', function() {

				this.setAttribute('data-drop', '');

			})

			.on('drop', function(e) {

				e.dataTransfer = e.originalEvent.dataTransfer;

				this.setAttribute('data-drop', '');

				var ele = $('[data-dragid="' + e.dataTransfer.getData('text/plain') + '"]')[0];

				if (e.offsetY < ($(this).height()/2)) {

					this.insertAdjacentElement('beforebegin', ele);

				} else {

					this.insertAdjacentElement('afterend', ele);

				}

				var arr = [];

				$(this).parent().children().each(function() {

					arr.push([$(this).attr('data-page'), $(this).attr('data-info'), $(this).attr('data-date') || '']);

				});

				save(arr);

			})

			.on('dragstart', function(e) {

				e.dataTransfer = e.originalEvent.dataTransfer;

				var uid = ('' + Math.random()).replace('.', '');

				$(this).attr('data-dragid', uid);

				e.dataTransfer.setData('text/plain', uid);

			})

		);

	}



	function list() {

		$('.userjs-todo-list').remove();

		var todo = parent.append($('<div class="userjs-todo-list" style="overflow:auto;"></div>')

			.append($('<div style="padding:0.5em;" class="todo-menu"></div>')

				.append(new OO.ui.ButtonWidget({

					framed: false,

					icon: 'undo',

					invisibleLabel: true,

					title: messages.undo

				}).$element.click(function() {

					if (changeschanges.length-undo-2 !== undefined) {

						save(changeschanges.length-undo-2], false, true);

						undo++;

					}

				}))

				.append(new OO.ui.ButtonWidget({

					framed: false,

					icon: 'redo',

					invisibleLabel: true,

					title: messages.redo

				}).$element.click(function() {

					if (changeschanges.length-undo !== undefined) {

						save(changeschanges.length-undo], false, true);

						undo--;

					}

				}))

				.append(new OO.ui.ButtonWidget({

					framed: false,

					icon: 'trash',

					invisibleLabel: true,

					title: messages.clear

				}).$element.click(function() {

					OO.ui.confirm( messages.clearConfirm ).done(function(confirmed) {

						if (confirmed) {

							parent.find('.items').empty();

							save('', true, true);

						}

					});

				}))

				.append(new OO.ui.ButtonWidget({

					framed: false,

					icon: 'download',

					invisibleLabel: true,

					title: messages.download

				}).$element.click(function() {

					$($('<a download="todo.json" style="display:none;"></a>')

						.attr('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(mw.user.options.get('userjs-todo-script')))

						.appendTo(document.body)[0].click()

					).remove();

				}))

				.append(new OO.ui.ButtonWidget({

					framed: false,

					icon: 'upload',

					invisibleLabel: true,

					title: messages.upload

				}).$element.click(function() {

					loader.click();

				}))

				.append(new OO.ui.ButtonWidget({

					framed: false,

					icon: 'info',

					invisibleLabel: true,

					title: messages.help

				}).$element.click(function() {

					window.open('/info/en/?search=User:BrandonXLF/TodoList/Help');

				}))

			)

			.append($('<div style="padding:0 0.5em 0.5em;"></div>')

				.append((new OO.ui.TextInputWidget({

					placeholder: messages.pageNameUrl,

					classes:  'todo-pageNameUrl' ],

					value: mw.config.get('wgPageName').replace(/_/g, ' ') != 'Special:BlankPage/todo' ? mw.config.get('wgPageName').replace(/_/g, ' ') : ''

				})).$element.css({maxWidth: 'unset', margin: '4px 0'}))

				.append((new OO.ui.TextInputWidget({

					placeholder: messages.comment,

					classes:  'todo-comment' 

				})).$element.css({maxWidth: 'unset', margin: '4px 0'}))

				.append((new OO.ui.ButtonWidget({

					label: messages.add

				}).$element.css('width', '100%').children().css('width', '100%').parent()).click(function() {

					var opts = JSON.parse(mw.user.options.get('userjs-todo-script') || '[]'),

						arr = [];



					arr.push($(this).parent().parent().find('.todo-pageNameUrl input').val());

					arr.push($(this).parent().parent().find('.todo-comment input').val());



					if (!arr.join('')) return;



					arr.push((new Date()).getTime());

					item($('.userjs-todo-list .items'), arr);

					opts.push(arr);

					save(opts);



					$('#userjs-todo-popup').css({top: Math.max(parseInt($('#userjs-todo-popup').css('top')), 0)});

				}))

			)

			.append($('<div class="items" style="margin:0.5em;padding-top:0.5em;border-top:1px solid #a2a9b1;"></div>'))

			.append('<div class="status" style="padding:0 0.5em 0.5em;"></div>')

		);

		if (ispopup) {

			todo.find('.todo-menu')

				.css('cursor', 'grab')

				.append((new OO.ui.ButtonWidget({

					framed: false,

					icon: 'close',

					invisibleLabel: true,

					title: messages.close

				}).$element.css({float: 'right', marginRight: '0'}).click(function() {

					parent.remove();

				})))

				.append(($('<a></a>').attr('href', mw.util.getUrl('Special:BlankPage/todo')).append((new OO.ui.ButtonWidget({

					framed: false,

					icon: 'newWindow',

					invisibleLabel: true,

					title: messages.yourList

				}).$element.css('float', 'right').click(function() {

					location.url = mw.util.getUrl('Special:BlankPage/todo');

				})))))

				.on('mousedown', function(e) {

					if (e.target !== this) return;

					this.style.cursor = 'grabbing';

					var x = parent.position().left - e.pageX,

						y = parent.position().top - e.pageY,

						b = $(document.body);

					function move(e) {

						parent.css({

							left: Math.clamp($(window).width() - parent.width(), e.pageX + x, 0) + 'px',

							top: Math.clamp($(window).height() - parent.height(), e.pageY +	y, 0) + 'px',

							right: '',

							bottom: ''

						});

					}

					function up() {

						e.target.style.cursor = 'grab';

						b.off('mousemove', move);

						b.off('mouseup', up);

					}

					b.on('mousemove', move);

					b.on('mouseup', up);

				});

		}



		$.each(JSON.parse(mw.user.options.get('userjs-todo-script') || '[]'), function(a, b) {

			item(todo.find('.items'), b);

		});



		return todo;

	}



	function repos(pos, css, pvar, cond, pcss, ccss) {

		return $('<div style="pointer-events:all;position:absolute;"></div>').attr('id', pos + 'gfdgfdgfd').css('cursor', pos + '-resize').css(css).on('mousedown', function(e) {

			if (e.target !== this) return;



			var p = parent,

				c = p.find('.userjs-todo-list'),

				q = eval(pvar),

				b = $(document.body);



			b.css('user-select', 'none');



			function move(e) {

				if (eval(cond)) return;

				(new Function('e', 'p', 'q', 'p.css(' + pcss + ')'))(e, p, q);

				(new Function('e', 'c', 'q', 'c.css(' + ccss + ')'))(e, c, q);

			}



			function up() {

				b.css('user-select', '');

				b.off('mousemove', move);

				b.off('mouseup', up);

			}



			b.on('mousemove', move);

			b.on('mouseup', up);

		});

	}



	if ( ( mw.config.get( 'wgCanonicalSpecialPageName' ) === 'Blankpage' ) && ( mw.config.get('wgPageName').split('/').pop() === 'todo' ) ) {

		document.title = messages.yourList + ' – ' + mw.config.get('wgSiteName');

		$('#firstHeading').text( messages.yourList );

		parent = mw.util.$content.empty();

		list();



		link.children().first().click(function(e) {

			e.preventDefault();

			mw.notify( messages.noPopup, {tag: 'rtbyilounmt7udfnod'});

		});

	} else {

		link.children().first().click(function(e) {

			e.preventDefault();

			if ($('#userjs-todo-popup')[0]) {

				$('#userjs-todo-popup').remove();

				return;

			}

			ispopup = true;

			parent = $('<div style="overflow:auto;min-height:3em;z-index:' + (mw.config.get('skin') === 'minerva' ? '3' : '4') + ';box-shadow:0 2px 2px 0 rgba(0,0,0,0.25);color:#222;min-width:20em;position:fixed;right:1em;background-color:white;border-radius:4px;border: 1px solid #a2a9b1;font-size:0.75rem;max-width:100vw;max-height:100vh;" id="userjs-todo-popup"></div>')

				.appendTo(document.body)

				.css('top', link.position().top + link.height() + 8 + 'px')

				.append($('<div style="pointer-events:none;position:absolute;top:0;left:0;bottom:0;right:0;"></div>')

					.append(repos('e', {top: 0, right: 0, width: '7px', height: '100%'}, 'p.position().left', 'e.clientX - q < 40', '{right:"",minWidth:"",left:q	+ "px"}', '{width:e.clientX - q + "px"}'))

					.append(repos('n', {top: 0, height: '7px', width: '100%'}, 'p.position().top + p.height()', 'q <= e.clientY + 40', '{top:Math.max(e.clientY, 0) + "px"}', '{height:q - e.clientY + "px"}'))

					.append(repos('s', {bottom: 0, height: '7px', width: '100%'}, 'p.position().top', 'e.clientY - q < 40', '{top:Math.max(q,0) + "px"}', '{height:e.clientY - q + "px"}'))

					.append(repos('w', {left: 0, width: '7px', height: '100%'}, 'p.position().left + parent.width()', 'q <= e.clientX + 40', '{right:"",minWidth:"",left:e.clientX + "px"}', '{width:q - e.clientX + "px"}'))

					.append($('<div style="pointer-events:all;position:absolute;height:100%;top:0;right:0;width:7px;height:7px;cursor:ne-resize;"></div>').on('mousedown', function(e) {

						e.originalEvent.stopImmediatePropagation();

						$('#egfdgfdgfd').trigger('mousedown');

						$('#ngfdgfdgfd').trigger('mousedown');

					}))

					.append($('<div style="pointer-events:all;position:absolute;height:100%;top:0;left:0;width:7px;height:7px;cursor:nw-resize;"></div>').on('mousedown', function(e) {

						e.originalEvent.stopImmediatePropagation();

						$('#wgfdgfdgfd').trigger('mousedown');

						$('#ngfdgfdgfd').trigger('mousedown');

					}))

					.append($('<div style="pointer-events:all;position:absolute;height:100%;bottom:0;right:0;width:7px;height:7px;cursor:se-resize;"></div>').on('mousedown', function(e) {

						e.originalEvent.stopImmediatePropagation();

						$('#egfdgfdgfd').trigger('mousedown');

						$('#sgfdgfdgfd').trigger('mousedown');

					}))

					.append($('<div style="pointer-events:all;position:absolute;height:100%;bottom:0;left:0;width:7px;height:7px;cursor:sw-resize;"></div>').on('mousedown', function(e) {

						e.originalEvent.stopImmediatePropagation();

						$('#wgfdgfdgfd').trigger('mousedown');

						$('#sgfdgfdgfd').trigger('mousedown');

					}))

				);



			parent.css('top', Math.max(parseInt(parent.css('top')), 0));

			list();

		});

	}

});
From Wikipedia, the free encyclopedia
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.

/*** Todo List ***/



// Adds a todo list that also has a convient popup

// Documentation at [[en:w:User:BrandonXLF/TodoList]]

// By [[en:w:User:BrandonXLF]]



$.when(mw.loader.using([

	'mediawiki.user',

	'oojs-ui-core',

	'oojs-ui-windows',

	'oojs-ui.styles.icons-movement',

	'oojs-ui.styles.icons-editing-core',

	'oojs-ui.styles.icons-interactions',

	'oojs-ui.styles.icons-moderation',

	'oojs-ui.styles.icons-content'

]), $.ready).then(function() {

	var messages = function() {

		var translations = {

			en: {

				todoPortlet: 'Todo',

				todoHover: 'Click to see your todo list',

				saving: 'Saving changes...',

				drag: 'Drag',

				delete: 'Delete',

				: 'Edit',

				pageNameUrl: 'Page name or URL',

				comment: 'Comment',

				save: 'Save',

				cancel: 'Cancel',

				moreinfo: 'More information',

				undo: 'Undo',

				redo: 'Redo',

				clear: 'Clear',

				clearConfirm: 'Are you sure you want to clear your todo list?',

				download: 'Download',

				upload: 'Upload',

				help: 'Help',

				add: 'Add',

				close: 'Close',

				yourList: 'Your todo list',

				noPopup: 'Unable to open todo list popup while on the todo list page.',

				addedTime: 'Added: $dateDate $dateMonth, $dateYear at $dateHours:$dateMinutes'

			},

			nb: {

				todoPortlet: 'Huskeliste',

				todoHover: 'Klikk for å se huskelista di',

				saving: 'Lagrer endringer …',

				drag: 'Dra',

				delete: 'Slett',

				: 'Rediger',

				pageNameUrl: 'Sidenavn eller URL',

				comment: 'Merknad',

				save: 'Lagre',

				cancel: 'Avbryt',

				moreinfo: 'Mer informasjon',

				undo: 'Angre',

				redo: 'Angre angring',

				clear: 'Tøm',

				clearConfirm: 'Er du sikker på at du vil tømme huskelista di?',

				download: 'Last ned',

				upload: 'Last opp',

				help: 'Hjelp',

				add: 'Legg til',

				close: 'Lukk',

				yourList: 'Huskelista di',

				noPopup: 'Kan ikke åpne oppsprettsboksen med huskelista mens du er på huskelistesiden.',

				addedTime: 'Lagt til: $dateDate. $dateMonth $dateYear kl. $dateHours.$dateMinutes'

			},

			nn: {

				todoPortlet: 'Hugseliste',

				todoHover: 'Klikk for å sjå hugselista di',

				saving: 'Lagrar endringar …',

				drag: 'Dra',

				delete: 'Slett',

				: 'Endre',

				pageNameUrl: 'Sidenamn eller URL',

				comment: 'Merknad',

				save: 'Lagre',

				cancel: 'Avbryt',

				moreinfo: 'Meir informasjon',

				undo: 'Angre',

				redo: 'Angre angring',

				clear: 'Tøm',

				clearConfirm: 'Er du sikker på at du vil tømme hugselista di?',

				download: 'Last ned',

				upload: 'Last opp',

				help: 'Hjelp',

				add: 'Legg til',

				close: 'Lukk',

				yourList: 'Hugselista di',

				noPopup: 'Kan ikkje opna oppsprettsboksen med hugselista mens du er på hugselistesida.',

				addedTime: 'Lagt til: $dateDate. $dateMonth $dateYear kl. $dateHours.$dateMinutes'

			},

			ka: {

				todoPortlet: 'გასაკეთებელი',

				todoHover: 'დააწკაპეთ თქვენი გასაკეთებლების სიის სანახავად',

				saving: 'ინახება…',

				drag: 'გადაადგილება',

				delete: 'წაშლა',

				: 'რედაქტირება',

				pageNameUrl: 'გვერდის სახელი ან ბმული',

				comment: 'კომენტარი',

				save: 'შენახვა',

				cancel: 'გაუქმება',

				moreinfo: 'მეტი ინფორმაცია',

				undo: 'უკან დაბრუნება',

				redo: 'წინ დაბრუნება',

				clear: 'გასუფთავება',

				clearConfirm: 'დარწმუნებული ხართ, რომ თქვენი სიის გასუფთავება გსურთ?',

				download: 'ჩამოტვირთვა',

				upload: 'ატვირთვა',

				help: 'დახმარება',

				add: 'დამატება',

				close: 'დახურვა',

				yourList: 'თქვენი გასაკეთებლების სია',

				noPopup: 'გასაკეთებლების სიის გვერდზე ყოფნის დროს შეუძლებელია სიის ფანჯრის გახსნა.',

				addedTime: 'დამატების თარიღი: $dateDate $dateMonth, $dateYear; $dateHours:$dateMinutes'

			}

		},

			chain = mw.language.getFallbackLanguageChain(),

			len = chain.length,

			ret = {},

			i = len - 1;

		while ( i >= 0 ) {

			if ( translations.hasOwnProperty( chain i  ) ) {

      	$.extend( ret, translations chain i   );

    	}

    	i = i - 1;

  	}

		return ret;

	}();

	

	mw.util.addCSS(

		'.userjs-todo-list .item:hover .act { visibility: visible !important; }' +

		'[data-drop="above"]::before { display: block; border-top: 2px solid #066; margin-top: -2px; content: ""; }' +

		'[data-drop="below"]::after { display: block; border-top: 2px solid #066; margin-top: -2px; content: ""; }' +

		'.userjs-todo-list .items:empty { border: none !important; margin: 0 !important; padding: 0 !important;}' +

		'.userjs-todo-moreinfo > a { min-width: unset !important; min-height: unset !important; padding: 0.65em !important; }' +

		'.userjs-todo-moreinfo > a > span { min-width: unset !important; min-height: unset !important; width: 1.3em !important; left: 0 !important; }'

	);



	if (mw.config.get('skin') === 'minerva') {

		mw.util.addCSS(

			'.userjs-todo-list .item .act { visibility: visible !important; }' +

			'#userjs-todo-popup { top: 0 !important; bottom: 0 !important; left: 0 !important; right: 0 !important; width: 100%; height: 100%; }' +

			'#userjs-todo-popup .userjs-todo-list { width: 100%; height: 100%; } '

		);

	}



	var api = new mw.Api(),

		link = $(mw.util.addPortletLink(

			'p-personal',

			mw.util.getUrl('Special:BlankPage/todo'),

			messages.todoPortlet,

			'userjs-todo',

			messages.todoHover,

			'd',

			'#pt-preferences')

		),

		changes = mw.user.options.get('userjs-todo-script')],

		undo = 0,

		req = 0,

		parent,

		ispopup = false,

		loader = $('<input type="file" accept=".json" style="display:none;">').on('change', function() {

			if (!this.files || !this.files0]) return;

			var file = this.files0],

				reader = new FileReader();

			reader.onload = function() {

				save(reader.result, true, true);

			};

			reader.readAsText(file);

		}).appendTo(document.body);



	$(window).on('beforeunload', function() {

		if (req > 0) return true;

	});



	function save(what, record, relist) {

		if (typeof what != 'string') {

			what = JSON.stringify(what);

		}



		mw.user.options.set('userjs-todo-script', what);

		req++;

		parent.find('.status').text( messages.saving );



		api.saveOption('userjs-todo-script', what).done(function() {

			req--;

			if (req === 0) {

				parent.find('.status').text('');

			}

		});



		if (record !== false) {

			while (undo > 0) {

				changes.pop();

				undo--;

			}



			changes.push(mw.user.options.get('userjs-todo-script'));



			if (changes.length > 50) changes.shift();

		}



		if (relist) {

			list();



			if (req > 0) {

				parent.find('.status').text( messages.saving );

			}

		}

	}



	Math.clamp = function(max, x, min) {

		return Math.min(max, Math.max(min, x));

	};



	function item(parent, array) {

		var date = new Date(+array2]),

			url = array0 || '',

			txt = array0 || '';



		if (url.match(/^(https:|http:|:)\/\//) && url.match(/ /)) {

			var reg = /(.*?) (.*)/.exec(url);

			url = reg1];

			txt = reg2];

		} else if (!url.match(/^(https:|http:|:)\/\//)) {

			url = mw.util.getUrl(url);

		}



		parent.append($('<div class="item" style="margin:5px 0;white-space:nowrap;"></div>')

			.attr('data-page', array0 || '')

			.attr('data-info', array1 || '')

			.attr('data-date', array2 || '')

			.append((new OO.ui.IconWidget({icon: 'draggable', title: messages.drag })).$element

				.css({cursor: 'move', height: '1.2em', width: '1.2em', minWidth: 'unset', minHeight: 'unset', marginRight: '0.5em'})

				.on('mousedown', function() {

					$(this).parent().attr('draggable', 'true');

				})

				.on('mouseup', function() {

					$(this).parent().attr('draggable', 'false');

				})

			)

			.append($('<a>').addClass('page').attr('href', url).text(txt))

			.append(array0 && array1 ? ' . . ' : '')

			.append($('<span>').addClass('info').text(array1 || ''))

			.append(array0 || array1 ? '<span class="act" style="visibility:hidden;"> . . </span>' : '')

			.append((new OO.ui.IconWidget({icon: 'trash', title: messages.delete, flags: 'destructive']})).$element

				.css({cursor: 'pointer', visibility: 'hidden', height: '1.1em', width: '1.1em', minWidth: 'unset', minHeight: 'unset', marginRight: '0.5em'})

				.addClass('act')

				.click(function() {

					var arr = [];

					$(this).parent().siblings().each(function() {

						arr.push([$(this).attr('data-page'), $(this).attr('data-info'), $(this).attr('data-date')]);

					});

					$(this).parent().remove();

					save(arr);

				})

			)

			.append((new OO.ui.IconWidget({icon: 'edit', title: messages., flags: 'progressive']})).$element

				.css({cursor: 'pointer', visibility: 'hidden', height: '1em', width: '1em', minWidth: 'unset', minHeight: 'unset', marginRight: '0.5em'})

				.addClass('act edit')

				.click(function() {

					$(this).css('display', 'none');

					$('<div style="border:1px solid #a2a9b1;padding:0 4px;margin:0.5em 0;border-radius:4px;"></div>')

						.append((new OO.ui.TextInputWidget({

							placeholder: messages.pageNameUrl,

							classes:  'todo-pageNameUrl' ],

							value: $(this).parent().attr('data-page')

						})).$element.css({maxWidth: 'unset', margin: '4px 0'}))

						.append((new OO.ui.TextInputWidget({

							placeholder: messages.comment,

							classes:  'todo-comment' ],

							value: $(this).parent().attr('data-info')

						})).$element.css({maxWidth: 'unset', margin: '4px 0'}))

						.append($('<table style="width:100%;border-spacing:0;margin-bottom:0.5em;"></table>').append($('<tr></tr>')

							.append($('<td style="width:50%;padding-right:4px;"></td>').append((new OO.ui.ButtonWidget({

								label: messages.save,

								flags: 'progressive'

							}).$element.css('width', '100%').children().css('width', '100%').parent()).click(function() {

								var editbox = $(this).parent().parent().parent().parent(),

									listitem = editbox.parent();

								listitem.find('.page').text(editbox.find('.todo-pageNameUrl input').val());

								listitem.attr('data-page', editbox.find('.todo-pageNameUrl input').val());

								listitem.find('.info').text(editbox.find('.todo-comment input').val());

								if (listitem.find('.info')[0].previousSibling.nodeType != 3 && editbox.find('.todo-comment input').val() !== '') {

									listitem.find('.info').before(' . . ');

								} else if (

									listitem.find('.info')[0].previousSibling.nodeType == 3 &&

									editbox.find('.todo-comment input').val() === ''

								) {

									$(listitem.find('.info')[0].previousSibling).remove();

								}

								listitem.attr('data-info', editbox.find('.todo-comment input').val());

								var arr = [];

								listitem.parent().children().each(function() {

									arr.push([$(this).attr('data-page'), $(this).attr('data-info'), $(this).attr('data-date')]);

								});

								save(arr);

								link.find('.redo').remove();

								listitem.find('.edit').css('display', 'inline-block');

								editbox.remove();

							})

							))

							.append($('<td style="width:50%;padding-left:4px;"></td>').append((new OO.ui.ButtonWidget({

								label: messages.cancel,

								flags: 'destructive'

							}).$element.css('width', '100%').children().css('width', '100%').parent()).click(function() {

								var editbox = $(this).parent().parent().parent().parent(),

									listitem = editbox.parent();

								listitem.find('.edit').css('display', 'inline-block');

								editbox.remove();

							})

							))

						)).appendTo(this.parentNode);

				})

			)

			.append(array2 ? (new OO.ui.PopupButtonWidget({

				icon: 'info',

				framed: false,

				label: messages.moreinfo,

				invisibleLabel: true,

				title: messages.moreinfo,

				popup: {

					$content: $('<p></p>').text( messages.addedTime

					 	.replace( '$dateDate', date.getDate() )

						.replace( '$dateMonth', mw.config.get('wgMonthNames')[date.getMonth() + 1 )

						.replace( '$dateYear', date.getFullYear() )

						.replace( '$dateHours', date.getHours() )

						.replace( '$dateMinutes', ('' + date.getMinutes()).padStart(2, '0') )

					),

					padded: true,

					align: 'forwards'

				}

			})).$element

				.addClass('userjs-todo-moreinfo')

				.css({cursor: 'pointer', visibility: 'hidden', height: '1.3em', width: '1.3em', minWidth: 'unset', minHeight: 'unset', marginRight: '0.5em'})

				.addClass('act') : ''

			)

			.on('dragover', function(e) {

				e.preventDefault();

				e.dataTransfer = e.originalEvent.dataTransfer;

				if (e.offsetY < ($(this).height()/2)) {

					this.setAttribute('data-drop', 'above');

				} else {

					this.setAttribute('data-drop', 'below');

				}

			})

			.on('dragleave', function() {

				this.setAttribute('data-drop', '');

			})

			.on('drop', function(e) {

				e.dataTransfer = e.originalEvent.dataTransfer;

				this.setAttribute('data-drop', '');

				var ele = $('[data-dragid="' + e.dataTransfer.getData('text/plain') + '"]')[0];

				if (e.offsetY < ($(this).height()/2)) {

					this.insertAdjacentElement('beforebegin', ele);

				} else {

					this.insertAdjacentElement('afterend', ele);

				}

				var arr = [];

				$(this).parent().children().each(function() {

					arr.push([$(this).attr('data-page'), $(this).attr('data-info'), $(this).attr('data-date') || '']);

				});

				save(arr);

			})

			.on('dragstart', function(e) {

				e.dataTransfer = e.originalEvent.dataTransfer;

				var uid = ('' + Math.random()).replace('.', '');

				$(this).attr('data-dragid', uid);

				e.dataTransfer.setData('text/plain', uid);

			})

		);

	}



	function list() {

		$('.userjs-todo-list').remove();

		var todo = parent.append($('<div class="userjs-todo-list" style="overflow:auto;"></div>')

			.append($('<div style="padding:0.5em;" class="todo-menu"></div>')

				.append(new OO.ui.ButtonWidget({

					framed: false,

					icon: 'undo',

					invisibleLabel: true,

					title: messages.undo

				}).$element.click(function() {

					if (changeschanges.length-undo-2 !== undefined) {

						save(changeschanges.length-undo-2], false, true);

						undo++;

					}

				}))

				.append(new OO.ui.ButtonWidget({

					framed: false,

					icon: 'redo',

					invisibleLabel: true,

					title: messages.redo

				}).$element.click(function() {

					if (changeschanges.length-undo !== undefined) {

						save(changeschanges.length-undo], false, true);

						undo--;

					}

				}))

				.append(new OO.ui.ButtonWidget({

					framed: false,

					icon: 'trash',

					invisibleLabel: true,

					title: messages.clear

				}).$element.click(function() {

					OO.ui.confirm( messages.clearConfirm ).done(function(confirmed) {

						if (confirmed) {

							parent.find('.items').empty();

							save('', true, true);

						}

					});

				}))

				.append(new OO.ui.ButtonWidget({

					framed: false,

					icon: 'download',

					invisibleLabel: true,

					title: messages.download

				}).$element.click(function() {

					$($('<a download="todo.json" style="display:none;"></a>')

						.attr('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(mw.user.options.get('userjs-todo-script')))

						.appendTo(document.body)[0].click()

					).remove();

				}))

				.append(new OO.ui.ButtonWidget({

					framed: false,

					icon: 'upload',

					invisibleLabel: true,

					title: messages.upload

				}).$element.click(function() {

					loader.click();

				}))

				.append(new OO.ui.ButtonWidget({

					framed: false,

					icon: 'info',

					invisibleLabel: true,

					title: messages.help

				}).$element.click(function() {

					window.open('/info/en/?search=User:BrandonXLF/TodoList/Help');

				}))

			)

			.append($('<div style="padding:0 0.5em 0.5em;"></div>')

				.append((new OO.ui.TextInputWidget({

					placeholder: messages.pageNameUrl,

					classes:  'todo-pageNameUrl' ],

					value: mw.config.get('wgPageName').replace(/_/g, ' ') != 'Special:BlankPage/todo' ? mw.config.get('wgPageName').replace(/_/g, ' ') : ''

				})).$element.css({maxWidth: 'unset', margin: '4px 0'}))

				.append((new OO.ui.TextInputWidget({

					placeholder: messages.comment,

					classes:  'todo-comment' 

				})).$element.css({maxWidth: 'unset', margin: '4px 0'}))

				.append((new OO.ui.ButtonWidget({

					label: messages.add

				}).$element.css('width', '100%').children().css('width', '100%').parent()).click(function() {

					var opts = JSON.parse(mw.user.options.get('userjs-todo-script') || '[]'),

						arr = [];



					arr.push($(this).parent().parent().find('.todo-pageNameUrl input').val());

					arr.push($(this).parent().parent().find('.todo-comment input').val());



					if (!arr.join('')) return;



					arr.push((new Date()).getTime());

					item($('.userjs-todo-list .items'), arr);

					opts.push(arr);

					save(opts);



					$('#userjs-todo-popup').css({top: Math.max(parseInt($('#userjs-todo-popup').css('top')), 0)});

				}))

			)

			.append($('<div class="items" style="margin:0.5em;padding-top:0.5em;border-top:1px solid #a2a9b1;"></div>'))

			.append('<div class="status" style="padding:0 0.5em 0.5em;"></div>')

		);

		if (ispopup) {

			todo.find('.todo-menu')

				.css('cursor', 'grab')

				.append((new OO.ui.ButtonWidget({

					framed: false,

					icon: 'close',

					invisibleLabel: true,

					title: messages.close

				}).$element.css({float: 'right', marginRight: '0'}).click(function() {

					parent.remove();

				})))

				.append(($('<a></a>').attr('href', mw.util.getUrl('Special:BlankPage/todo')).append((new OO.ui.ButtonWidget({

					framed: false,

					icon: 'newWindow',

					invisibleLabel: true,

					title: messages.yourList

				}).$element.css('float', 'right').click(function() {

					location.url = mw.util.getUrl('Special:BlankPage/todo');

				})))))

				.on('mousedown', function(e) {

					if (e.target !== this) return;

					this.style.cursor = 'grabbing';

					var x = parent.position().left - e.pageX,

						y = parent.position().top - e.pageY,

						b = $(document.body);

					function move(e) {

						parent.css({

							left: Math.clamp($(window).width() - parent.width(), e.pageX + x, 0) + 'px',

							top: Math.clamp($(window).height() - parent.height(), e.pageY +	y, 0) + 'px',

							right: '',

							bottom: ''

						});

					}

					function up() {

						e.target.style.cursor = 'grab';

						b.off('mousemove', move);

						b.off('mouseup', up);

					}

					b.on('mousemove', move);

					b.on('mouseup', up);

				});

		}



		$.each(JSON.parse(mw.user.options.get('userjs-todo-script') || '[]'), function(a, b) {

			item(todo.find('.items'), b);

		});



		return todo;

	}



	function repos(pos, css, pvar, cond, pcss, ccss) {

		return $('<div style="pointer-events:all;position:absolute;"></div>').attr('id', pos + 'gfdgfdgfd').css('cursor', pos + '-resize').css(css).on('mousedown', function(e) {

			if (e.target !== this) return;



			var p = parent,

				c = p.find('.userjs-todo-list'),

				q = eval(pvar),

				b = $(document.body);



			b.css('user-select', 'none');



			function move(e) {

				if (eval(cond)) return;

				(new Function('e', 'p', 'q', 'p.css(' + pcss + ')'))(e, p, q);

				(new Function('e', 'c', 'q', 'c.css(' + ccss + ')'))(e, c, q);

			}



			function up() {

				b.css('user-select', '');

				b.off('mousemove', move);

				b.off('mouseup', up);

			}



			b.on('mousemove', move);

			b.on('mouseup', up);

		});

	}



	if ( ( mw.config.get( 'wgCanonicalSpecialPageName' ) === 'Blankpage' ) && ( mw.config.get('wgPageName').split('/').pop() === 'todo' ) ) {

		document.title = messages.yourList + ' – ' + mw.config.get('wgSiteName');

		$('#firstHeading').text( messages.yourList );

		parent = mw.util.$content.empty();

		list();



		link.children().first().click(function(e) {

			e.preventDefault();

			mw.notify( messages.noPopup, {tag: 'rtbyilounmt7udfnod'});

		});

	} else {

		link.children().first().click(function(e) {

			e.preventDefault();

			if ($('#userjs-todo-popup')[0]) {

				$('#userjs-todo-popup').remove();

				return;

			}

			ispopup = true;

			parent = $('<div style="overflow:auto;min-height:3em;z-index:' + (mw.config.get('skin') === 'minerva' ? '3' : '4') + ';box-shadow:0 2px 2px 0 rgba(0,0,0,0.25);color:#222;min-width:20em;position:fixed;right:1em;background-color:white;border-radius:4px;border: 1px solid #a2a9b1;font-size:0.75rem;max-width:100vw;max-height:100vh;" id="userjs-todo-popup"></div>')

				.appendTo(document.body)

				.css('top', link.position().top + link.height() + 8 + 'px')

				.append($('<div style="pointer-events:none;position:absolute;top:0;left:0;bottom:0;right:0;"></div>')

					.append(repos('e', {top: 0, right: 0, width: '7px', height: '100%'}, 'p.position().left', 'e.clientX - q < 40', '{right:"",minWidth:"",left:q	+ "px"}', '{width:e.clientX - q + "px"}'))

					.append(repos('n', {top: 0, height: '7px', width: '100%'}, 'p.position().top + p.height()', 'q <= e.clientY + 40', '{top:Math.max(e.clientY, 0) + "px"}', '{height:q - e.clientY + "px"}'))

					.append(repos('s', {bottom: 0, height: '7px', width: '100%'}, 'p.position().top', 'e.clientY - q < 40', '{top:Math.max(q,0) + "px"}', '{height:e.clientY - q + "px"}'))

					.append(repos('w', {left: 0, width: '7px', height: '100%'}, 'p.position().left + parent.width()', 'q <= e.clientX + 40', '{right:"",minWidth:"",left:e.clientX + "px"}', '{width:q - e.clientX + "px"}'))

					.append($('<div style="pointer-events:all;position:absolute;height:100%;top:0;right:0;width:7px;height:7px;cursor:ne-resize;"></div>').on('mousedown', function(e) {

						e.originalEvent.stopImmediatePropagation();

						$('#egfdgfdgfd').trigger('mousedown');

						$('#ngfdgfdgfd').trigger('mousedown');

					}))

					.append($('<div style="pointer-events:all;position:absolute;height:100%;top:0;left:0;width:7px;height:7px;cursor:nw-resize;"></div>').on('mousedown', function(e) {

						e.originalEvent.stopImmediatePropagation();

						$('#wgfdgfdgfd').trigger('mousedown');

						$('#ngfdgfdgfd').trigger('mousedown');

					}))

					.append($('<div style="pointer-events:all;position:absolute;height:100%;bottom:0;right:0;width:7px;height:7px;cursor:se-resize;"></div>').on('mousedown', function(e) {

						e.originalEvent.stopImmediatePropagation();

						$('#egfdgfdgfd').trigger('mousedown');

						$('#sgfdgfdgfd').trigger('mousedown');

					}))

					.append($('<div style="pointer-events:all;position:absolute;height:100%;bottom:0;left:0;width:7px;height:7px;cursor:sw-resize;"></div>').on('mousedown', function(e) {

						e.originalEvent.stopImmediatePropagation();

						$('#wgfdgfdgfd').trigger('mousedown');

						$('#sgfdgfdgfd').trigger('mousedown');

					}))

				);



			parent.css('top', Math.max(parseInt(parent.css('top')), 0));

			list();

		});

	}

});

Videos

Youtube | Vimeo | Bing

Websites

Google | Yahoo | Bing

Encyclopedia

Google | Yahoo | Bing

Facebook