| 8 | 1 <!doctype html> | 
| 21 | 2 <html lang="en"> | 
| 8 | 3 	<head> | 
|  | 4 		<meta name="viewport" content="width=device-width, initial-scale=1"> | 
|  | 5 		<style> | 
|  | 6 			@import "/site.css"; | 
|  | 7 			@import "/dad.css"; | 
|  | 8 | 
| 20 | 9 			[drop] { | 
|  | 10 				margin-top: 8px; | 
|  | 11 				margin-bottom: 8px; | 
|  | 12 			} | 
|  | 13 			[drag] { | 
| 8 | 14 				background-color: LightGreen; | 
|  | 15 				padding: 8px; | 
| 20 | 16 				display: inline-block; | 
| 8 | 17 			} | 
|  | 18 		</style> | 
|  | 19 		<script src="/dad.js"></script> | 
|  | 20 		<script> | 
|  | 21 			function indexOf(a,el) { | 
|  | 22 				for( let i=0; i<a.length; i++ ) { | 
|  | 23 					if( a[i] === el ) | 
|  | 24 						return i; | 
|  | 25 				} | 
|  | 26 				return -1; | 
|  | 27 			} | 
|  | 28 | 
| 20 | 29 			dad.whatToDrag = function(draggable) { | 
|  | 30 				return draggable.parentNode; | 
|  | 31 			}; | 
|  | 32 | 
| 8 | 33 			dad.onEnter = function(event) { | 
| 20 | 34 				let dropzone = event.dropzone; | 
|  | 35 				let original = event.original; | 
|  | 36 				let filter = original.getAttribute('drop'); | 
|  | 37 				if( dropzone.getAttribute('drop') !== filter ) { | 
|  | 38 					return false; | 
|  | 39 				} | 
|  | 40 				let items = document.querySelectorAll(`[drop="${filter}"]`); | 
| 8 | 41 				let iDropzone = indexOf(items,dropzone); | 
|  | 42 				let iOriginal = indexOf(items,original); | 
|  | 43 				let where = iDropzone < iOriginal ? 'beforebegin' : 'afterend'; | 
|  | 44 				dropzone.insertAdjacentElement(where,original); | 
|  | 45 			}; | 
|  | 46 | 
|  | 47 			function init() { | 
| 20 | 48 				let items = document.querySelectorAll('[drop]'); | 
|  | 49 				for( let item of items ) { | 
| 8 | 50 					dad.setDropzone(item); | 
| 20 | 51 					let filter = item.getAttribute('drop'); | 
|  | 52 					let drag = item.querySelector(`[drag="${filter}"]`); | 
|  | 53 					dad.setDraggable(drag); | 
| 8 | 54 				} | 
|  | 55 			} | 
|  | 56 		</script> | 
|  | 57 	</head> | 
|  | 58 	<body> | 
| 20 | 59 		<h1>Nested Dynamic Lists</h1> | 
|  | 60 		<ul> | 
| 8 | 61 		<script> | 
| 20 | 62 			for( let i=1; i<=5; i++ ) { | 
| 8 | 63 				document.write(` | 
| 20 | 64 					<li drop="top">${i} - <span drag=top>drag me</span> | 
|  | 65 						<ul> | 
|  | 66 `				); | 
|  | 67 				for( let j=1; j<=i; j++ ) { | 
|  | 68 					document.write(` | 
|  | 69 						<li drop="n${i}">${j} - <span drag="n${i}">drag me</span> | 
|  | 70 `					); | 
|  | 71 				} | 
|  | 72 				document.write(` | 
|  | 73 						</ul> | 
|  | 74 					</li> | 
| 8 | 75 `				); | 
|  | 76 			} | 
|  | 77 		</script> | 
| 20 | 78 		</ul> | 
| 8 | 79 		<p>bottom</p> | 
|  | 80 	</body> | 
|  | 81 	<script> init(); </script> | 
|  | 82 </html> |