html = '<!doctype html>\n<html>\n <head>\n <script type="text/javascript" src=%(utils)s></script>\n <script type="text/javascript" src=%(pythonbridgelib)s></script>\n <script type="text/javascript">\nfunction onLoad(img) {\n img.load_state = \'loaded\';\n D.notify(\'onLoad\', {src: img.src});\n}\n\nfunction onError(img) {\n img.load_state = \'error\';\n D.notify(\'onError\', {src: img.src});\n}\n\nfunction cmp(a, b) {\n if (a < b) return -1;\n else if (b > a) return 1;\n else return 0;\n}\n\nfunction _byTime(a, b) {\n return cmp(a.lastAccessTime, b.lastAccessTime);\n}\n\nfunction evictOld() {\n // TODO: an insertion sort at access time would be more efficient, but this array is small so...eh\n allImages.sort(_byTime);\n var numToDelete = allImages.length - MAX_IMAGES;\n var deleted = allImages.slice(0, numToDelete);\n allImages = allImages.slice(numToDelete);\n\n for (var i = 0; i < deleted.length; ++i) {\n var img = deleted[i];\n img.parentNode.removeChild(img);\n }\n}\n\nwindow.allImages = [];\nwindow.MAX_IMAGES = 30;\n\n </script>\n </head>\n <body>\n </body>\n</html>' % dict(pythonbridgelib = jslib('pythonbridge.js'), utils = jslib('utils.js'))