From: Subject: Avian Flu Diary: Statins Revisited Date: Sat, 8 Dec 2007 15:55:14 -0500 MIME-Version: 1.0 Content-Type: multipart/related; type="multipart/alternative"; boundary="----=_NextPart_000_0087_01C839B2.B904A370" X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.3198 This is a multi-part message in MIME format. ------=_NextPart_000_0087_01C839B2.B904A370 Content-Type: image/jpeg Content-Transfer-Encoding: base64 Content-Location: http://i45.photobucket.com/albums/f83/mcoston/MikeNew.jpg /9j/4AAQSkZJRgABAQEAZABkAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQICAQEBAQMCAgICAwMEBAMD AwMEBAYFBAQFBAMDBQcFBQYGBgYGBAUHBwcGBwYGBgb/2wBDAQEBAQEBAQMCAgMGBAMEBgYGBgYG BgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgb/wAARCAByAGwDAREA AhEBAxEB/8QAHwAAAgEEAwEBAAAAAAAAAAAACAkHAwQGCgIFCwEA/8QAPhAAAQMDAwIDBQQIBQUB AAAAAQIDBAUGEQAHEgghEyIxCRRBUXEyNGGxFRYjM0JSgcEKFxgkkUNTYpKh4f/EAB0BAAEEAwEB AAAAAAAAAAAAAAcAAgYIAwQFAQn/xABGEQAABAMEBAkKBQIGAwEAAAAAAQIDBAURBhIhMQdBUWET FzI1cXORstIiNlJTgaGxwdHwFBUjQ5Lh8RYzNEJEolRiY3L/2gAMAwEAAhEDEQA/AHpFdYvyqz7m uKbUJtcqspwhbj3ItIVg4GQcevp6AcQBgaK1prTRllYxEJCITwd0jxI9plqMtgFFkbIwNsoF2MjH V8JfMsDLYR6yPaMsgbQKmMMpLswNoXzUjsfEV815T3799RrjMnnoN9h+MSrims7613tR4B2R2WeJ kL96qCXZCcF5PHklI/hT5ew0uMyeeg32H4wuKazvrXe1HgH0bKqQqOQ7KCIqcMtcRwB/mxx9dLjM nnoN9h+MLims7613tR4BwOyay242ZNQPju8pDmE8nP8AxJ4+mO2BpcZk89BvsPxhcU1nfWu9qPAK n+S7viqeMiaFhngyOKcNjHfiOPYnS4zJ56DfYfjC4prO+td7UeAUxskoNtNePOKG3Oa0KwfEXnOV 9u/fvpcZk89BvsPxhcU1nfWu9qPAOR2WeJkL96qCXZCcF5PHklI/hT5ew0uMyeeg32H4wuKazvrX e1HgH0bKqQqOQ7KCIqcMtcRwB/mxx9dLjMnnoN9h+MLims7613tR4BwOyay242ZNQPju8pDmE8nP /Enj6Y7YGlxmTz0G+w/GFxTWd9a72o8Aqf5Lu+Kp4yJoWGeDI4pw2Md+I49idLjMnnoN9h+MLims 7613tR4BROyhQyhsvzC205zWhWP2i/mvy9+/fS4zJ56DfYfjC4prO+td7UeAYtVNvzTFSVvOzuUj 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 ------=_NextPart_000_0087_01C839B2.B904A370 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: http://buttons.blogger.com/bloggerbutton1.gif R0lGODlhWAAfAOYAAPjx6P9mAABDev///+jcy8i1n+/m2e3j1ezi1O7k1vTr4fPr4PTs4vXt4vLp 3vPq3/Hp3fHo2/Dn2kJxl7bDy/+zgOfl4SFaiRFPgYSgtf/Zv/8AAP+MQFN9nw5NgNfa2XSUrf+W UB1XhjJmkDxsk8bO0jxskv9wEGOJpjtrkUFwlrW/xJWrvLS+wrW/w/ngy//Gn/yaV9LSzrW/xdXW 0ztskv/iz0p2mPmWUsTKy/5uDvDUu0t3mZeruLbAxkt2mdXV0sTJybO/xv/s3/HWvlqAnvmVUYae r4efsP9vD1F7naW0vcTKyniVqmmLpdTU0ZWptf+DMJirueTg2ixhjNTW1Et2mC1ijYegsniWq7O+ xv/172iKo6e2v5aruKSzu7TAxsPJzP+fYJaptsPIyHmWrGqMpkp1l2mLpLO9wQAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5 BAEAABsALAAAAABYAB8AAAf/gBsbBISFhoeIiYqLjI2OiIKDCJOUlZaXmJmam5ydlwSDB6KjpKWm p6ipqqusqAUECbE7RgG1tre4tkY7sb2+v8DBwsPEwa8GBkQ6uczMOkTI0SkpUNFcKWdf0dvc3d7f 4NHHBjjN5rg43Gkp2ylHRyLh8vPzrxIS5/m29/wtNfwSarSQIUDGGA8iyCC5IcEDEn8Sbghg2IJK QYAYM2q89ypCBGYhKogUKeaEOY8oXZhAGcFEERErPSxBYyKIBxcCrDQpskREBBEuXIgIwrKo0aMo X0GAgOuEhgFQow7YEqLZ0qsrTFyFYALLCghMBEBYIVaAkx8efnjJIqDtiqxb/+PKnbv1lQMHuJ5K 3RuF2d2/M0j8dUBixl8BT3oIJuGhhwgROXKIACx4sOXLmP++evDgVoi9oGEw40z6igcppEn4IG3G g4AuD8oIAMLDA+faHoD4IEG6t+/fwB+8WrDgVoWoMDgo/wx1CDPi0KNLh05jyvToNGhc385d+isF CoxHrVrrxJCoJnGBX8++vZYw7ePLn0+f/isGDMRHtaFBr1QNHNyC34BKqGCgEkLgJ4QAKgzo4IMQ RijhhPi90kAD+oEGWgW3XOhhWyAKUEUDYDDo4Ykopqjiiixe+AoAAGSooVQc2gLjjW0BYEEHAmQA AAUCTHDjkEQWaeSRSML4Yv+Mthy3X3/92UDjLUTmCAAIPf4YJIwWoNAWChbAWMIFAoCQQQdcThAk CxN8AGMGGAQZJgAdZOAlC0QumSF5nkVVYy1V9ggCBheECaSQAKh5AZmIknlBnALA6CWhbVEAAAsC XDDClgC09ailQ+rZJHLKlcoBDH5SOWSIZcJ4qI4CYGCBBXFa8EGsWkYKAJkl0CqApZu6SWaYbX0w Z6gEwNjnjHsFaOOqv1KwKQhaCvlqotFyaqWValraVgYZkOmtrkWKaot/zGqAS6Cu5vjqtd1eu62u 3XYa5AT4umlluckyaYtTzA6gQXrP4qhrBu5uaUGss9Z6Kwa5wsirr8AKUALHu0aa69lIHFfg7LrQ 4tsWmkBi4KOijEoswAiQSpopmb8CgDAGE7AM47559quPPkRCOvKcm6K5489ikomlrhaoWXPMMsPc gZsYQJxxvzHsbE4MSWaNJM4w1qs1vzC+kITVuSTxwtdfs2AmjxeIiUIGR7uJNrI3vlA12bXEcPbc WfPYFgZ4yhwitXzfuGThiPNdAgUUHAvAB4zLnXgBGxSQ+OWYZ65kJAV07vnnoIcu+uikl2766aFH ovrqrLfu+uuwxy777IIEAgA7 ------=_NextPart_000_0087_01C839B2.B904A370 Content-Type: image/png Content-Transfer-Encoding: base64 Content-Location: http://i.creativecommons.org/l/by-nc/3.0/us/88x31.png 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 YmyHAAAAAElFTkSuQmCC ------=_NextPart_000_0087_01C839B2.B904A370 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Location: http://www2.clustrmaps.com/counter/index2.php?url=http://afludiary.blogspot.com/ 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 ------=_NextPart_000_0087_01C839B2.B904A370 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Location: http://s28.sitemeter.com/meter.asp?site=s28afludiary R0lGODlhyAAoAMQAAP//M///M8wAAAAAzN7v7///nJzOnM6czpxjzv/OnAAAAG1tbZqamr6+vtbW 1u3t7f/////AgP///////////////////////////////////////////////////////yH/C05F VFNDQVBFMi4wAwEBAAAh+QQBFAAAACwAAAAAyAAoAAAFcCAgjmRpnmiqrmzrvnAsz3Rt33iu73zv /8CgcEgsGo/IpHLJbDqf0Kh0Sq1ar9isdsvter/gsHhMLpvP6LR6zW673/C4fE6v2+/4vH7P7/v/ gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnSEAIfkEBQIAAAAsAAAOAMgAGAAABVQgII5k aZ5oqq5s675wLM90bd94ru987//AoHBILBqPyKRyyWw6n9CodEqtWq/YrHbL7Xq/4LB4TC6bz+i0 es1uu9/wuHxOr9vv+Lx+z+/7/4CBTyEAIfkEBQIAAAAsAAAOACcAGAAABSQgII5kaZ5oqq5s675w LM90bd94ru987//AoHBILBqPyKQyGAIAIfkEBQIAAAAsAAAOAE8AGAAABTQgII5kaZ5oqq5s675w LM90bd94ru987//AoHBILBqPyKRyyWw6n9CodEqtWq/YrHbL7ZZCACH5BAUCAAAALAAADgB3ABgA AAVBICCOZGmeaKqubOu+cCzPdG3feK7vfO//wKBwSCwaj8ikcslsOp/QqHRKrVqv2Kx2y+16v+Cw eEwum8/otHptCgEAIfkEBQIAAAAsAAAOAJ8AGAAABUogII5kaZ5oqq5s675wLM90bd94ru987//A oHBILBqPyKRyyWw6n9CodEqtWq/YrHbL7Xq/4LB4TC6bz+i0es1uu9/wuHxOr9vXIQAh+QQFAgAA ACwAAA4AxwAYAAAFVCAgjmRpnmiqrmzrvnAsz3Rt33iu73zv/8CgcEgsGo/IpHLJbDqf0Kh0Sq1a r9isdsvter/gsHhMLpvP6LR6zW673/C4fE6v2+/4vH7P7/v/gIE3IQAh+QQFAQAAACwgAAEAiQAa AAAFSCAgjmRpnmiqrmzrvnAsz3Rt33iu73zv/8CgcEgsGo/IpHLJbDqf0Kh0Sq1ar9isdsvter/g sHhMLpvP6LR6zW673/C4fM4OAQAh+QQFAgAAACwgAAAAiQAaAAAF/yAgjmRpnmiqrmzrvnAsz3Rt 33iu73zv/8CgcEgsGo/IEWTJbJKcrSbkKYUCpCxmSZuMVrnfbFX5XYrCKu5Zq0a1g+XptZymz9F3 q9tMlr9NbXJFfGp/VIKGa2t+iYuIhHwphZFCkZSNd317mosrk4IzmDqJeoB2W5apoCdgl4eFfZef mbGUZHu2rGO6h5ySkI9Tdmy7xWGnvrVeu721pby0mcPAqk50yJ2vLtZ/b3h1esSP2dGtwuLlq925 v8Goq47spuHU777mtObw5Pxi7s2bttEDZWVWNnS41Hn7puufo4QvShHjZDCfmXXJ1jF8xyyaNhgS L6KpODIXMo0dbS8xNCQqYK9pDvMAm4clh8lnQNgFU7mF5pOE+2jI60K0y9CiSJMqXcq0qdOnUHmE AAAh+QQFAgAAACwgAAAAiQAaAAAF/yAgjmRpnmiqrmzrvnAsz3Rt33iu73zv/8CgcEgsGo/I0WPJ bJKcrebjKYUCpCxmSZuMVrnfbFX5XYrCKu5Zq0a1g+XptZymz9F3q9tMlr9NbXJFfGp/VIKGa2t+ iYuIhHwphZFCkZSNd317mosrk4IzmDqJeoB2W5apoCdgl4eFfZefmbGUZHu2rGO6h5ySkI9Tdmy7 xWGnvrVeu721pby0mcPAqk50yJ2vLtZ/b3h1esSP2dGtwuLlq925v8Goq47spuHU777mtObw5Pxi 7s2bttEDZWVWNnS41Hn7puufo4QvShHjZDCfmXXJ1jF8xyyaNhgSL6KpODIXMo0dbS8xNCQqYK9p DvMAm4clh8lnQNgFU7mF5pOE+2jI60K0y9CiSJMqXcq0qdOnUHmEAAAh+QQFAgAAACwgAAAAiQAa AAAF/yAgjmRpnmiqrmzrvnAsz3Rt33iu73zv/8CgcEgsGo/IkWPJbJKcrabjKYUCpCxmSZuMVrnf bFX5XYrCKu5Zq0a1g+XptZymz9F3q9tMlr9NbXJFfGp/VIKGa2t+iYuIhHwphZFCkZSNd317mosr k4IzmDqJeoB2W5apoCdgl4eFfZefmbGUZHu2rGO6h5ySkI9Tdmy7xWGnvrVeu721pby0mcPAqk50 yJ2vLtZ/b3h1esSP2dGtwuLlq925v8Goq47spuHU777mtObw5Pxi7s2bttEDZWVWNnS41Hn7puuf o4QvShHjZDCfmXXJ1jF8xyyaNhgSL6KpODIXMo0dbS8xNCQqYK9pDvMAm4clh8lnQNgFU7mF5pOE +2jI60K0y9CiSJMqXcq0qdOnUHmEAAAh+QQFAgAAACwgAAAAiQAaAAAF/yAgjmRpnmiqrmzrvnAs z3Rt33iu73zv/8CgcEgsGo/IUWPJbJKcrWbjKYUCpCxmSZuMVrnfbFX5XYrCKu5Zq0a1g+XptZym z9F3q9tMlr9NbXJFfGp/VIKGa2t+iYuIhHwphZFCkZSNd317mosrk4IzmDqJeoB2W5apoCdgl4eF fZefmbGUZHu2rGO6h5ySkI9Tdmy7xWGnvrVeu721pby0mcPAqk50yJ2vLtZ/b3h1esSP2dGtwuLl q925v8Goq47spuHU777mtObw5Pxi7s2bttEDZWVWNnS41Hn7puufo4QvShHjZDCfmXXJ1jF8xyya NhgSL6KpODIXMo0dbS8xNCQqYK9pDvMAm4clh8lnQNgFU7mF5pOE+2jI60K0y9CiSJMqXcq0qdOn UHmEAAAh+QQFAgAAACwgAAAAiQAaAAAF/yAgjmRpnmiqrmzrvnAsz3Rt33iu73zv/8CgcEgsGo/I EWPJbJKcrSbjKYUCpCxmSZuMVrnfbFX5XYrCKu5Zq0a1g+XptZymz9F3q9tMlr9NbXJFfGp/VIKG a2t+iYuIhHwphZFCkZSNd317mosrk4IzmDqJeoB2W5apoCdgl4eFfZefmbGUZHu2rGO6h5ySkI9T dmy7xWGnvrVeu721pby0mcPAqk50yJ2vLtZ/b3h1esSP2dGtwuLlq925v8Goq47spuHU777mtObw 5Pxi7s2bttEDZWVWNnS41Hn7puufo4QvShHjZDCfmXXJ1jF8xyyaNhgSL6KpODIXMo0dbS8xNCQq YK9pDvMAm4clh8lnQNgFU7mF5pOE+2jI60K0y9CiSJMqXcq0qdOnUHmEAAAh+QQFAgAAACwgAAAA iQAaAAAF/yAgjmRpnmiqrmzrvnAsz3Rt33iu73zv/8CgcEgsGo/I0WLJbJKcrebiKYUCpCxmSZuM VrnfbFX5XYrCKu5Zq0a1g+XptZymz9F3q9tMlr9NbXJFfGp/VIKGa2t+iYuIhHwphZFCkZSNd317 mosrk4IzmDqJeoB2W5apoCdgl4eFfZefmbGUZHu2rGO6h5ySkI9Tdmy7xWGnvrVeu721pby0mcPA qk50yJ2vLtZ/b3h1esSP2dGtwuLlq925v8Goq47spuHU777mtObw5Pxi7s2bttEDZWVWNnS41Hn7 puufo4QvShHjZDCfmXXJ1jF8xyyaNhgSL6KpODIXMo0dbS8xNCQqYK9pDvMAm4clh8lnQNgFU7mF 5pOE+2jI60K0y9CiSJMqXcq0qdOnUHmEAAAh+QQFAgAAACwgAAAAiQAaAAAF/yAgjmRpnmiqrmzr vnAsz3Rt33iu73zv/8CgcEgsGo/IkWLJbJKcrabiKYUCpCxmSZuMVrnfbFX5XYrCKu5Zq0a1g+Xp tZymz9F3q9tMlr9NbXJFfGp/VIKGa2t+iYuIhHwphZFCkZSNd317mosrk4IzmDqJeoB2W5apoCdg l4eFfZefmbGUZHu2rGO6h5ySkI9Tdmy7xWGnvrVeu721pby0mcPAqk50yJ2vLtZ/b3h1esSP2dGt wuLlq925v8Goq47spuHU777mtObw5Pxi7s2bttEDZWVWNnS41Hn7puufo4QvShHjZDCfmXXJ1jF8 xyyaNhgSL6KpODIXMo0dbS8xNCQqYK9pDvMAm4clh8lnQNgFU7mF5pOE+2jI60K0y9CiSJMqXcq0 qdOnUHmEAAAh+QQFAQAAACwgAAAAiQAaAAAF/yAgjmRpnmiqrmzrvnAsz3Rt33iu73zv/8CgcEgs Go/IkWLJbJKcrabiKYUCpCxmSZuMVrnfbFX5XYrCKu5Zq0a1g+XptZymz9F3q9tMlr9NbXJFfGp/ VIKGa2t+iYuIhHwphZFCkZSNd317mosrk4IzmDqJeoB2W5apoCdgl4eFfZefmbGUZHu2rGO6h5yS kI9Tdmy7xWGnvrVeu721pby0mcPAqk50yJ2vLtZ/b3h1esSP2dGtwuLlq925v8Goq47spuHU777m tObw5Pxi7s2bttEDZWVWNnS41Hn7puufo4QvShHjZDCfmXXJ1jF8xyyaNhgSL6KpODIXMo0dbS8x NCQqYK9pDvMAm4clh8lnQNgFU7mF5pOE+2jI60K0y9CiSJMqXcq0qdOnUHmEAAAh+QQFAQAAACwo ABkAeQAOAAAFMSAgjmRpnmiqrmzrvnAsz3Rt33iu73zv/8CgcEgsGo/IpHLJbDqf0Kh0Sq1ar9hs MgQAIfkEBQIAAAAsKAAYAHkADgAABbQgII5kaZ5oqq5s675wLM90bd94rrtQr0MkIE5oI556Rt9I uWyWjDImlDaNMU1KoVa05RKrxW8OzAOQg9y0Wb0OSs1Ir/ba7GbrWWRcv8zT22deanZyR2k+QG9w WIuJh4l5jYd1gohPTihXhIBsTo5rSX+DlpyQYqV4p1h6YHSbhEmToLJtaJWjn7OotLkpZFOvg3Ji dl+isYuYcZygy3BdKqrDxm7VO9fYhtnb3N3e3+DhIyEAIfkEBQIAAAAsKAAYAHkADgAABbQgII5k aZ5oqq5s675wLM90bd94rrtPrz8kIE5oI556Rt9IuWyWjDImlDaNMU1KoVa05RKrxW8OzAOQg9y0 Wb0OSs1Ir/ba7GbrWWRcv8zT22deanZyR2k+QG9wWIuJh4l5jYd1gohPTihXhIBsTo5rSX+DlpyQ YqV4p1h6YHSbhEmToLJtaJWjn7OotLkpZFOvg3Jidl+isYuYcZygy3BdKqrDxm7VO9fYhtnb3N3e 3+DhIyEAIfkEBQIAAAAsKAAYAHkADgAABbQgII5kaZ5oqq5s675wLM90bd94rrtOrzskIE5oI556 Rt9IuWyWjDImlDaNMU1KoVa05RKrxW8OzAOQg9y0Wb0OSs1Ir/ba7GbrWWRcv8zT22deanZyR2k+ QG9wWIuJh4l5jYd1gohPTihXhIBsTo5rSX+DlpyQYqV4p1h6YHSbhEmToLJtaJWjn7OotLkpZFOv g3Jidl+isYuYcZygy3BdKqrDxm7VO9fYhtnb3N3e3+DhIyEAIfkEBQIAAAAsKAAYAHkADgAABbQg II5kaZ5oqq5s675wLM90bd94rrtNrzckIE5oI556Rt9IuWyWjDImlDaNMU1KoVa05RKrxW8OzAOQ g9y0Wb0OSs1Ir/ba7GbrWWRcv8zT22deanZyR2k+QG9wWIuJh4l5jYd1gohPTihXhIBsTo5rSX+D lpyQYqV4p1h6YHSbhEmToLJtaJWjn7OotLkpZFOvg3Jidl+isYuYcZygy3BdKqrDxm7VO9fYhtnb 3N3e3+DhIyEAIfkEBQIAAAAsKAAYAHkADgAABbQgII5kaZ5oqq5s675wLM90bd94rrtMrzMkIE5o I556Rt9IuWyWjDImlDaNMU1KoVa05RKrxW8OzAOQg9y0Wb0OSs1Ir/ba7GbrWWRcv8zT22deanZy R2k+QG9wWIuJh4l5jYd1gohPTihXhIBsTo5rSX+DlpyQYqV4p1h6YHSbhEmToLJtaJWjn7OotLkp ZFOvg3Jidl+isYuYcZygy3BdKqrDxm7VO9fYhtnb3N3e3+DhIyEAIfkEBQIAAAAsKAAYAHkADgAA BbQgII5kaZ5oqq5s675wLM90bd94rrtLry8kIE5oI556Rt9IuWyWjDImlDaNMU1KoVa05RKrxW8O zAOQg9y0Wb0OSs1Ir/ba7GbrWWRcv8zT22deanZyR2k+QG9wWIuJh4l5jYd1gohPTihXhIBsTo5r SX+DlpyQYqV4p1h6YHSbhEmToLJtaJWjn7OotLkpZFOvg3Jidl+isYuYcZygy3BdKqrDxm7VO9fY htnb3N3e3+DhIyEAIfkEBQIAAAAsKAAYAHkADgAABbQgII5kaZ5oqq5s675wLM90bd94rrtKrysk IE5oI556Rt9IuWyWjDImlDaNMU1KoVa05RKrxW8OzAOQg9y0Wb0OSs1Ir/ba7GbrWWRcv8zT22de anZyR2k+QG9wWIuJh4l5jYd1gohPTihXhIBsTo5rSX+DlpyQYqV4p1h6YHSbhEmToLJtaJWjn7Oo tLkpZFOvg3Jidl+isYuYcZygy3BdKqrDxm7VO9fYhtnb3N3e3+DhIyEAIfkEBQEAAAAsKAAYAHkA DgAABbQgII5kaZ5oqq5s675wLM90bd94rrtKryskIE5oI556Rt9IuWyWjDImlDaNMU1KoVa05RKr xW8OzAOQg9y0Wb0OSs1Ir/ba7GbrWWRcv8zT22deanZyR2k+QG9wWIuJh4l5jYd1gohPTihXhIBs To5rSX+DlpyQYqV4p1h6YHSbhEmToLJtaJWjn7OotLkpZFOvg3Jidl+isYuYcZygy3BdKqrDxm7V O9fYhtnb3N3e3+DhIyEAIfkEBQBAAAAsAAAAAAQABAAABQYgII5kCYQAOw== ------=_NextPart_000_0087_01C839B2.B904A370 Content-Type: text/css; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Content-Location: http://www.blogger.com/css/blog_controls.css .item-control { DISPLAY: none } .item-control A { TEXT-DECORATION: none! important } .item-action A { TEXT-DECORATION: none! important } .widget-item-control { FLOAT: right } .quick-edit-icon { PADDING-RIGHT: 9px; PADDING-LEFT: 9px; BACKGROUND: = url(/img/icon18_edit_allbkg.gif) no-repeat left 50%; PADDING-BOTTOM: = 9px; MARGIN: 0px 0px 0px 0.5em; PADDING-TOP: 9px } .widget-item-control .quick-edit-icon { BACKGROUND: url(/img/icon18_wrench_allbkg.gif) no-repeat left 50% } .delete-comment-icon { PADDING-RIGHT: 7px; PADDING-LEFT: 7px; BACKGROUND: = url(/img/icon_delete13.gif) no-repeat left 50%; PADDING-BOTTOM: 7px; = PADDING-TOP: 7px } .email-post-icon { PADDING-RIGHT: 9px; PADDING-LEFT: 9px; BACKGROUND: = url(/img/icon18_email.gif) no-repeat left 50%; PADDING-BOTTOM: 9px; = MARGIN: 0px 0px 0px 0.5em; PADDING-TOP: 9px } @media All =20 { .BLOG_mobile_video_class { DISPLAY: none } } @media Handheld =20 { .BLOG_mobile_video_class { DISPLAY: inline } .BLOG_video_class { DISPLAY: none } } ------=_NextPart_000_0087_01C839B2.B904A370 Content-Type: text/css; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Content-Location: http://www.blogger.com/css/navbar/classic.css HTML BODY { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; MARGIN: 0px; PADDING-TOP: 0px } BODY #wrapper { MARGIN-TOP: 30px } BODY #header { MARGIN-TOP: 50px } #leftcontent { _margin-top: 30px } #rightcontent { MARGIN-TOP: 30px! important } #Main #Title { MARGIN-TOP: 30px! important } BODY #wrap #wrap2 #header { MARGIN-TOP: 0px } BODY #wrap { MARGIN-TOP: 34px } #blog-header { MARGIN-TOP: -4px } BODY #wrap4 { PADDING-RIGHT: 15px; MARGIN-TOP: -4px; PADDING-LEFT: 15px; = PADDING-BOTTOM: 0px; PADDING-TOP: 15px } #space-for-ie { DISPLAY: none; _border: 0; _display: block } #navbar-iframe { Z-INDEX: 500; LEFT: 0px; POSITION: absolute; TOP: 0px } ------=_NextPart_000_0087_01C839B2.B904A370 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: http://www.blogger.com/img/navbar/1/btn_search_this.gif R0lGODlhYAAPANUAAB9YjAlCeEN6rneq3VKIuxBKf0uBtWic0C5mmjVsoTxzpwhCeBhRhm+j1ghC d0J3q1mOwkJ4qxJLgD9ypDBikhJKgEN4rD5xozBiky9ikiVckRJKfSZdkSVdkRJJfSZdkj9xo2GV ySZfk36x5BFEd0J4rAlDeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAABgAA8AAAb/QA8G 9CgZj8ikcslsOp/Q54VCynQqpqx2y+16v+CweDyWcCgTyYLMbrvfbsmk5FjD7/i8eLF4RBwBWQkD IwkmIiOJIlkGIwZZiCMDhiYADY6HI1kji1kCiSMhmZuLiiaDhVuRIwJZIa2ChI+xIwRZDiZFJoEm AwgFBaNbByEHkJoKmiYNCiYMwpxc0dCLAqK9v8FaiCYIyq9avgwjAM7klVmBEQ+AWQMHnYginQWF I8HyBMYA99uc8tLi/YtmzR08LvmMmQAnDJwChVoCLChhIQAvSyMQZApxzZuJjJkODFjEzR/HaVqm ITpZ7RpGjSYb2FoIqyQ4a5HSmSjxwOIWxgiiSjIaEGLAI24GRPF7doxUwKYfW/681rReOYb8gh1o lqCBsEAlIkjMokAEBFvyRAQLQUAEgaCaxj070JakMpROqZnQF6zsWVWckl1t+6yBAG/PGAxQkExL n4p2khIIBoBjiKvlKle6ZsBQgbfNNC8st+VyFtGmOZaTrO20ZZhJQxgCABRmJaCzAjgI206P7995 Jl6QwAu48eNhHMihoKHCAoskokufTr269evTA2Dfzr379AofMGxAEyGK+fPo05ufkIFEEAA7 ------=_NextPart_000_0087_01C839B2.B904A370 Content-Type: text/css; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Content-Location: http://www.blogger.com/v-css/navbar/2173601441-navbar.css #b-navbar { DISPLAY: block! important; Z-INDEX: 1; MIN-HEIGHT: 24px; LEFT: 0px; = MARGIN-BOTTOM: 10px; PADDING-BOTTOM: 7px; FONT: small "Trebuchet = MS",Verdana,Arial,Sans-serif; WIDTH: 100%; COLOR: #47a; BORDER-BOTTOM: = #024 1px solid; POSITION: absolute! important; TOP: 0px } .bt1 { FONT-SIZE: 1px; MARGIN: 0px 1px; LINE-HEIGHT: 1px; POSITION: relative; = HEIGHT: 1px } .bt2 { PADDING-RIGHT: 2px; PADDING-LEFT: 2px; FONT-SIZE: 83%; PADDING-BOTTOM: = 2px; PADDING-TOP: 2px; POSITION: relative } #b-next { PADDING-LEFT: 5px } #b-search-this { MARGIN: 0px; TEXT-TRANSFORM: uppercase; CURSOR: pointer; WHITE-SPACE: = nowrap; POSITION: relative; TEXT-DECORATION: none } #b-flag-this { PADDING-LEFT: 5px; MARGIN: 0px; TEXT-TRANSFORM: uppercase; CURSOR: = pointer; WHITE-SPACE: nowrap; POSITION: relative; TEXT-DECORATION: none } #b-navbar #b-logo { BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; LEFT: 5px; = BORDER-BOTTOM-WIDTH: 0px; POSITION: absolute! important; TOP: 0.15em; = BORDER-RIGHT-WIDTH: 0px } @media All =20 { #b-search { MARGIN: 0px 0px 0px 34px; HEIGHT: 1em; BACKGROUND-COLOR: #147 } #b-search TABLE { PADDING-RIGHT: 5px } #b-search TD { FONT-SIZE: 100%; LINE-HEIGHT: 0.8em } #b-more { FLOAT: right } #b-searchbtn { MARGIN-RIGHT: 5px } #b-more { FLOAT: right } #b-search TABLE { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FLOAT: left; PADDING-BOTTOM: = 2px; PADDING-TOP: 2px; _padding: 1px 2px 1px } #b-search A { LINE-HEIGHT: 1em; TEXT-DECORATION: none } #b-search A:hover { LINE-HEIGHT: 1em; TEXT-DECORATION: none } #b-search TD { LINE-HEIGHT: 0.8; PADDING-TOP: 2px } #b-search TD TD { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; = PADDING-TOP: 0px } #b-searchbtn { DISPLAY: block } } @media Handheld =20 { #b-search { DISPLAY: none! important } #b-more { DISPLAY: none! important } } .navbar-right { PADDING-RIGHT: 10px } TD.navbutton { PADDING-RIGHT: 5px; _padding-top: .3em } TD.navsearch { PADDING-LEFT: 5px } #b-query { VERTICAL-ALIGN: top; WIDTH: 12em; MARGIN-RIGHT: 0.25em } #b-query { FONT-SIZE: x-small! important } @media All =20 { BODY DIV.b-mobile { DISPLAY: none } #b-sms { DISPLAY: none! important } } @media Handheld =20 { BODY DIV.b-mobile { DISPLAY: block } #b-sms { PADDING-RIGHT: 7px; DISPLAY: block! important; PADDING-LEFT: 7px; = FONT-SIZE: 100%; PADDING-BOTTOM: 4px; MARGIN: 0px 0px 0px 100px; = LINE-HEIGHT: 1em; PADDING-TOP: 4px; TEXT-ALIGN: left } #b-sms A { LINE-HEIGHT: 1em; MARGIN-RIGHT: 0.5em; WHITE-SPACE: nowrap; = TEXT-DECORATION: none } #b-sms A:hover { COLOR: #fff; TEXT-DECORATION: underline } } @media All =20 { #flagi { PADDING-RIGHT: 1px; DISPLAY: none; PADDING-LEFT: 1px; Z-INDEX: 300; = PADDING-BOTTOM: 1px; PADDING-TOP: 1px; TOP: 7px; BACKGROUND-COLOR: #333 } #unflagi { PADDING-RIGHT: 1px; DISPLAY: none; PADDING-LEFT: 1px; Z-INDEX: 300; = PADDING-BOTTOM: 1px; PADDING-TOP: 1px; TOP: 7px; BACKGROUND-COLOR: #333 } } @media Handheld =20 { #flagi { DISPLAY: none! important } #unflagi { DISPLAY: none! important } } #flagi-body { PADDING-RIGHT: 3px; PADDING-LEFT: 3px; FONT-WEIGHT: bold; FONT-SIZE: = 10px; PADDING-BOTTOM: 3px; LINE-HEIGHT: 14px; PADDING-TOP: 3px; = FONT-FAMILY: "Trebuchet MS", Vedana, Arial, Sans-serif; = BACKGROUND-COLOR: #ffff99; TEXT-ALIGN: center } #flagi-body A { FONT-SIZE: 10px; COLOR: #3366cc; TEXT-DECORATION: none } #flagi-body A:hover { TEXT-DECORATION: underline } #unflagi-body { PADDING-RIGHT: 3px; PADDING-LEFT: 3px; FONT-WEIGHT: bold; FONT-SIZE: = 10px; PADDING-BOTTOM: 3px; LINE-HEIGHT: 14px; PADDING-TOP: 3px; = FONT-FAMILY: "Trebuchet MS", Vedana, Arial, Sans-serif; = BACKGROUND-COLOR: #ffff99; TEXT-ALIGN: center } #unflagi-body A { FONT-SIZE: 10px; COLOR: #3366cc; TEXT-DECORATION: none } #unflagi-body A:hover { TEXT-DECORATION: underline } ------=_NextPart_000_0087_01C839B2.B904A370 Content-Type: text/css; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Content-Location: http://www.blogger.com/v-css/navbar/2433223533-1.css #b-navbar { COLOR: #47a; BORDER-BOTTOM: #024 1px solid; BACKGROUND-COLOR: #036 } #b-search TABLE { BACKGROUND: url(../../img/navbar/1/corner.gif) #147 no-repeat left = bottom } #b-query { BORDER-RIGHT: #47a 1px solid; BORDER-TOP: #47a 1px solid; BORDER-LEFT: = #47a 1px solid; BORDER-BOTTOM: #47a 1px solid } #b-search A { COLOR: #9cf } #b-search TD { COLOR: #fff } #b-search A:hover { COLOR: #fff } #b-sms A { COLOR: #9cf } #b-sms A:hover { COLOR: #fff } #navbar-logo { BACKGROUND-IMAGE: url(../../img/navbar/1/logobar.gif); WIDTH: 24px; = HEIGHT: 24px } #b-search-this { BACKGROUND: #114477 } .bt1 { BACKGROUND-COLOR: #4477aa } .bt2 { BORDER-RIGHT: #4477aa 1px solid; BORDER-LEFT: #4477aa 1px solid; COLOR: = #99ccff; BACKGROUND-COLOR: #114477 } DIV.bt2:hover { BACKGROUND-COLOR: #4477aa } #bt-flag { PADDING-LEFT: 8px; BACKGROUND: url(../../img/navbar/1/flag.gif) = no-repeat left 50% } ------=_NextPart_000_0087_01C839B2.B904A370 Content-Type: application/octet-stream Content-Transfer-Encoding: quoted-printable Content-Location: http://www.blogger.com/v-js/3625575137-cookies.common.js // Copyright 2005, Google Inc.=0A= // =0A= // Operations on cookies that are common across our pages.=0A= //=0A= // Original Author: Pal Takacsi-Nagy (pal@google.com)=0A= =0A= =0A= /**=0A= * Sets a Cookie with the given name and value.=0A= *=0A= * name Name of the cookie=0A= * value Value of the cookie=0A= * [expires] Expiration date of the cookie (default: end of current = session)=0A= * [path] Path where the cookie is valid (default: path of calling = document)=0A= * [domain] Domain where the cookie is valid=0A= * (default: domain of calling document)=0A= * [secure] Boolean value indicating if the cookie transmission = requires a=0A= * secure transmission=0A= */=0A= function setCookie(name, value, domain, expires, path, secure) {=0A= document.cookie =3D name + "=3D" + escape(value) +=0A= ((expires) ? "; expires=3D" + expires.toGMTString() : "") +=0A= ((path) ? "; path=3D" + path : "") +=0A= ((domain) ? "; domain=3D" + domain : "") +=0A= ((secure) ? "; secure" : "");=0A= }=0A= =0A= /**=0A= * Gets the value of the specified cookie.=0A= *=0A= * name Name of the desired cookie.=0A= *=0A= * Returns a string containing value of specified cookie,=0A= * or null if cookie does not exist.=0A= */=0A= function getCookie(name) {=0A= var dc =3D document.cookie;=0A= var prefix =3D name + "=3D";=0A= var begin =3D dc.indexOf("; " + prefix);=0A= =0A= if (begin =3D=3D -1) {=0A= begin =3D dc.indexOf(prefix);=0A= if (begin !=3D 0) return null;=0A= } else {=0A= begin +=3D 2;=0A= }=0A= =0A= var end =3D document.cookie.indexOf(";", begin);=0A= =0A= if (end =3D=3D -1) {=0A= end =3D dc.length;=0A= }=0A= =0A= return unescape(dc.substring(begin + prefix.length, end));=0A= }=0A= ------=_NextPart_000_0087_01C839B2.B904A370 Content-Type: application/octet-stream Content-Transfer-Encoding: quoted-printable Content-Location: http://www.blogger.com/v-app/scripts/1019856700-common.js // Copied from .../google3/javascript/common.js=0A= =0A= //-----------------------------------------------------------------------= -=0A= // This file contains common utilities and basic javascript = infrastructure.=0A= //=0A= // Notes:=0A= // * Press 'D' to toggle debug mode.=0A= //=0A= // Functions:=0A= //=0A= // - Assertions=0A= // DEPRECATED: Use assert.js=0A= // AssertTrue(): assert an expression. Throws an exception if false.=0A= // Fail(): Throws an exception. (Mark block of code that should be = unreachable)=0A= // AssertEquals(): assert that two values are equal.=0A= // AssertNumArgs(): assert number of arguments for the function=0A= // AssertType(): assert that a value has a particular type=0A= //=0A= // - Cookies=0A= // SetCookie(): Sets a cookie.=0A= // ExpireCookie(): Expires a cookie.=0A= // GetCookie(): Gets a cookie value.=0A= //=0A= // - Dynamic HTML/DOM utilities=0A= // MaybeGetElement(): get an element by its id=0A= // GetElement(): get an element by its id=0A= // GetParentNode(): Get the parent of an element=0A= // GetAttribute(): Get attribute value of a DOM node=0A= // SetInnerHTML(): set the inner HTML of a node=0A= // GetInnerHTML(): get the inner HTML of a node=0A= // ClearInnerHTML(): clear the inner HTML of a node=0A= // SetCssStyle(): Sets a CSS property of a node.=0A= // GetStyleProperty(): Get CSS property from a style attribute string=0A= // ShowElement(): Show/hide element by setting the "display" css = property.=0A= // ShowBlockElement(): Show/hide block element=0A= // SetButtonText(): Set the text of a button element.=0A= // AppendNewElement(): Create and append a html element to a parent node.=0A= // CreateDIV(): Create a DIV element and append to the document.=0A= // CreateIFRAME(): Create an IFRAME and append to the document.=0A= // HasClass(): check if element has a given class=0A= // AddClass(): add a class to an element=0A= // RemoveClass(): remove a class from an element=0A= //=0A= // - Window/Screen utiltiies=0A= // GetPageOffsetLeft(): get the X page offset of an element=0A= // GetPageOffsetTop(): get the Y page offset of an element=0A= // GetPageOffset(): get the X and Y page offsets of an element=0A= // GetPageOffsetRight() : get X page offset of the right side of an = element=0A= // GetPageOffsetRight() : get Y page offset of the bottom of an element=0A= // GetScrollTop(): get the vertical scrolling pos of a window.=0A= // GetScrollLeft(): get the horizontal scrolling pos of a window=0A= // IsScrollAtEnd(): check if window scrollbar has reached its maximum = offset=0A= // ScrollTo(): scroll window to a position=0A= // ScrollIntoView(): scroll window so that an element is in view.=0A= // GetWindowWidth(): get width of a window.=0A= // GetWindowHeight(): get height of a window=0A= // GetAvailScreenWidth(): get available screen width=0A= // GetAvailScreenHeight(): get available screen height=0A= // GetNiceWindowHeight(): get a nice height for a new browser window.=0A= // Open{External/Internal}Window(): open a separate window=0A= // CloseWindow(): close a window=0A= //=0A= // - DOM walking utilities=0A= // AnnotateTerms(): find terms in a node and decorate them with some tag=0A= // AnnotateText(): find terms in a text node and decorate them with some = tag=0A= //=0A= // - String utilties=0A= // HtmlEscape(): html escapes a string=0A= // HtmlUnescape(): remove html-escaping.=0A= // QuoteEscape(): escape " quotes.=0A= // CollapseWhitespace(): collapse multiple whitespace into one = whitespace.=0A= // Trim(): trim whitespace on ends of string=0A= // IsEmpty(): check if CollapseWhiteSpace(String) =3D=3D ""=0A= // IsLetterOrDigit(): check if a character is a letter or a digit=0A= // ConvertEOLToLF(): normalize the new-lines of a string.=0A= // HtmlEscapeInsertWbrs(): HtmlEscapes and inserts s (word break = tags)=0A= // after every n non-space chars and/or after or before certain = special chars=0A= //=0A= // - TextArea utilities=0A= // GetCursorPos(): finds the cursor position of a textfield=0A= // SetCursorPos(): sets the cursor position in a textfield=0A= //=0A= // - Array utilities=0A= // FindInArray(): do a linear search to find an element value.=0A= // DeleteArrayElement(): return a new array with a specific value = removed.=0A= // CloneObject(): clone an object, copying its values recursively.=0A= // CloneEvent(): clone an event; cannot use CloneObject because it=0A= // suffers from infinite recursion=0A= //=0A= // - Formatting utilities=0A= // PrintArray(): used to print/generate HTML by combining static text=0A= // and dynamic strings.=0A= // ImageHtml(): create html for an img tag=0A= // FormatJSLink(): formats a link that invokes js code when clicked.=0A= // MakeId3(): formats an id that has two id numbers, eg, foo_3_7=0A= //=0A= // - Miscellaneous=0A= // IsDefined(): returns true if argument is not undefined=0A= //-----------------------------------------------------------------------= -=0A= =0A= // browser detection=0A= var agent =3D navigator.userAgent.toLowerCase();=0A= var is_ie =3D (agent.indexOf('msie') !=3D -1);=0A= //var is_ie5 =3D (agent.indexOf('msie 5') !=3D -1 && document.all);=0A= var is_konqueror =3D (agent.indexOf('konqueror') !=3D -1);=0A= var is_safari =3D (agent.indexOf('safari') !=3D -1) || is_konqueror;=0A= var is_nav =3D !is_ie && !is_safari && (agent.indexOf('mozilla') !=3D = -1);=0A= var is_win =3D (agent.indexOf('win') !=3D -1);=0A= delete agent;=0A= =0A= =0A= var BACKSPACE_KEYCODE =3D 8;=0A= var COMMA_KEYCODE =3D 188; // ',' key=0A= var DEBUG_KEYCODE =3D 68; // 'D' key=0A= var DELETE_KEYCODE =3D 46;=0A= var DOWN_KEYCODE =3D 40; // DOWN arrow key=0A= var ENTER_KEYCODE =3D 13; // ENTER key=0A= var ESC_KEYCODE =3D 27; // ESC key=0A= var LEFT_KEYCODE =3D 37; // LEFT arrow key=0A= var RIGHT_KEYCODE =3D 39; // RIGHT arrow key=0A= var SPACE_KEYCODE =3D 32; // space bar=0A= var TAB_KEYCODE =3D 9; // TAB key=0A= var UP_KEYCODE =3D 38; // UP arrow key=0A= var SHIFT_KEYCODE =3D 16;=0A= =0A= // This is a "constant" but has different values depending on the browser=0A= var semicolon_keycode =3D (is_ie ? 186 : 59);=0A= =0A= var MAX_EMAIL_ADDRESS_LENGTH =3D 320; // 64 + '@' + 255=0A= var MAX_SIGNATURE_LENGTH =3D 1000; // 1000 chars of maximum = signature=0A= =0A= //-----------------------------------------------------------------------= -=0A= // Assertions=0A= // DEPRECATED: Use assert.js=0A= //-----------------------------------------------------------------------= -=0A= /**=0A= * DEPRECATED: Use assert.js=0A= */=0A= function raise(msg) {=0A= if (typeof Error !=3D 'undefined') {=0A= throw new Error(msg || 'Assertion Failed');=0A= } else {=0A= throw (msg);=0A= }=0A= }=0A= =0A= /**=0A= * DEPRECATED: Use assert.js=0A= *=0A= * Fail() is useful for marking logic paths that should=0A= * not be reached. For example, if you have a class that uses=0A= * ints for enums:=0A= *=0A= * MyClass.ENUM_FOO =3D 1;=0A= * MyClass.ENUM_BAR =3D 2;=0A= * MyClass.ENUM_BAZ =3D 3;=0A= *=0A= * And a switch statement elsewhere in your code that=0A= * has cases for each of these enums, then you can=0A= * "protect" your code as follows:=0A= *=0A= * switch(type) {=0A= * case MyClass.ENUM_FOO: doFooThing(); break;=0A= * case MyClass.ENUM_BAR: doBarThing(); break;=0A= * case MyClass.ENUM_BAZ: doBazThing(); break;=0A= * default:=0A= * Fail("No enum in MyClass with value: " + type);=0A= * }=0A= *=0A= * This way, if someone introduces a new value for this enum=0A= * without noticing this switch statement, then the code will=0A= * fail if the logic allows it to reach the switch with the=0A= * new value, alerting the developer that he should add a=0A= * case to the switch to handle the new value he has introduced.=0A= *=0A= * @param {string} opt_msg to display for failure=0A= * DEFAULT: "Assertion failed"=0A= */=0A= function Fail(opt_msg) {=0A= if (opt_msg =3D=3D=3D undefined) opt_msg =3D 'Assertion failed';=0A= if (IsDefined(DumpError)) DumpError(opt_msg + '\n');=0A= raise(opt_msg);=0A= }=0A= =0A= /**=0A= * DEPRECATED: Use assert.js=0A= *=0A= * Asserts that an expression is true (non-zero and non-null).=0A= *=0A= * Note that it is critical not to pass logic=0A= * with side-effects as the expression for AssertTrue=0A= * because if the assertions are removed by the=0A= * JSCompiler, then the expression will be removed=0A= * as well, in which case the side-effects will=0A= * be lost. So instead of this:=0A= *=0A= * AssertTrue( criticalComputation() );=0A= *=0A= * Do this:=0A= *=0A= * var result =3D criticalComputation();=0A= * AssertTrue(result);=0A= *=0A= * @param {anything} expression to evaluate=0A= * @param {string} opt_msg to display if the assertion fails=0A= *=0A= */=0A= function AssertTrue(expression, opt_msg) {=0A= if (!expression) {=0A= if (opt_msg =3D=3D=3D undefined) opt_msg =3D 'Assertion failed';=0A= Fail(opt_msg);=0A= }=0A= }=0A= =0A= /**=0A= * DEPRECATED: Use assert.js=0A= *=0A= * Asserts that two values are the same.=0A= *=0A= * @param {anything} val1=0A= * @param {anything} val2=0A= * @param {string} opt_msg to display if the assertion fails=0A= */=0A= function AssertEquals(val1, val2, opt_msg) {=0A= if (val1 !=3D val2) {=0A= if (opt_msg =3D=3D=3D undefined) {=0A= opt_msg =3D "AssertEquals failed: <" + val1 + "> !=3D <" + val2 + = ">";=0A= }=0A= Fail(opt_msg);=0A= }=0A= }=0A= =0A= /**=0A= * DEPRECATED: Use assert.js=0A= *=0A= * Asserts that a value is of the provided type.=0A= *=0A= * AssertType(6, Number);=0A= * AssertType("ijk", String);=0A= * AssertType([], Array);=0A= * AssertType({}, Object);=0A= * AssertType(ICAL_Date.now(), ICAL_Date);=0A= *=0A= * @param {anything} value=0A= * @param {constructor function} type=0A= * @param {string} opt_msg to display if the assertion fails=0A= */=0A= function AssertType(value, type, opt_msg) {=0A= // for backwards compatability only=0A= if (typeof value =3D=3D type) return;=0A= =0A= if (value || value =3D=3D "") {=0A= try {=0A= if (type =3D=3D AssertTypeMap[typeof value] || value instanceof = type) return;=0A= } catch (e) { /* failure, type was an illegal argument to instanceof = */ }=0A= }=0A= if (opt_msg =3D=3D=3D undefined) {=0A= if (typeof type =3D=3D 'function') {=0A= var match =3D type.toString().match(/^\s*function\s+([^\s\{]+)/);=0A= if (match) type =3D match[1];=0A= }=0A= opt_msg =3D "AssertType failed: <" + value + "> not typeof "+ type;=0A= }=0A= Fail(opt_msg);=0A= }=0A= =0A= var AssertTypeMap =3D {=0A= 'string' : String,=0A= 'number' : Number,=0A= 'boolean' : Boolean=0A= };=0A= =0A= /**=0A= * DEPRECATED: Use assert.js=0A= *=0A= * Asserts that the number of arguments to a=0A= * function is num. For example:=0A= *=0A= * function myFunc(one, two, three) [=0A= * AssertNumArgs(3);=0A= * ...=0A= * }=0A= *=0A= * myFunc(1, 2); // assertion fails!=0A= *=0A= * Note that AssertNumArgs does not take the function=0A= * as an argument; it is simply used in the context=0A= * of the function.=0A= *=0A= * @param {int} number of arguments expected=0A= * @param {string} opt_msg to display if the assertion fails=0A= */=0A= function AssertNumArgs(num, opt_msg) {=0A= var caller =3D AssertNumArgs.caller; // This is not supported in = safari 1.0=0A= if (caller && caller.arguments.length !=3D num) {=0A= if (opt_msg =3D=3D=3D undefined) {=0A= opt_msg =3D caller.name + ' expected ' + num + ' arguments '=0A= + ' but received ' + caller.arguments.length;=0A= }=0A= Fail(opt_msg);=0A= }=0A= }=0A= =0A= //-----------------------------------------------------------------------= -=0A= // Cookies=0A= //-----------------------------------------------------------------------= -=0A= var ILLEGAL_COOKIE_CHARS_RE =3D /[\s;]/=0A= /**=0A= * Sets a cookie.=0A= * The max_age can be -1 to set a session cookie. To expire cookies, use=0A= * ExpireCookie() instead.=0A= *=0A= * @param name The cookie name.=0A= * @param value The cookie value.=0A= * @param opt_max_age The max age in seconds (from now). Use -1 to set a=0A= * session cookie. If not provided, the default is -1 (i.e. set a = session=0A= * cookie).=0A= * @param opt_path The path of the cookie, or null to not specify a path=0A= * attribute (browser will use the full request path). If not = provided, the=0A= * default is '/' (i.e. path=3D/).=0A= * @param opt_domain The domain of the cookie, or null to not specify a = domain=0A= * attribute (brower will use the full request host name). If not = provided,=0A= * the default is null (i.e. let browser use full request host name).=0A= * @return Void.=0A= */=0A= function SetCookie(name, value, opt_max_age, opt_path, opt_domain) {=0A= =0A= value =3D '' + value;=0A= AssertTrue((typeof name =3D=3D 'string' &&=0A= typeof value =3D=3D 'string' &&=0A= !name.match(ILLEGAL_COOKIE_CHARS_RE) &&=0A= !value.match(ILLEGAL_COOKIE_CHARS_RE)),=0A= 'trying to set an invalid cookie');=0A= =0A= if (!IsDefined(opt_max_age)) opt_max_age =3D -1;=0A= if (!IsDefined(opt_path)) opt_path =3D '/';=0A= if (!IsDefined(opt_domain)) opt_domain =3D null;=0A= =0A= var domain_str =3D (opt_domain =3D=3D null) ? '' : ';domain=3D' + = opt_domain;=0A= var path_str =3D (opt_path =3D=3D null) ? '' : ';path=3D' + opt_path;=0A= =0A= var expires_str;=0A= =0A= // Case 1: Set a session cookie.=0A= if (opt_max_age < 0) {=0A= expires_str =3D '';=0A= =0A= // Case 2: Expire the cookie.=0A= // Note: We don't tell people about this option in the function doc = because=0A= // we prefer people to use ExpireCookie() to expire cookies.=0A= } else if (opt_max_age =3D=3D 0) {=0A= // Note: Don't use Jan 1, 1970 for date because NS 4.76 will try to = convert=0A= // it to local time, and if the local time is before Jan 1, 1970, = then the=0A= // browser will ignore the Expires attribute altogether.=0A= var pastDate =3D new Date(1970, 1 /*Feb*/, 1); // Feb 1, 1970=0A= expires_str =3D ';expires=3D' + pastDate.toUTCString();=0A= =0A= // Case 3: Set a persistent cookie.=0A= } else {=0A= var futureDate =3D new Date(Now() + opt_max_age * 1000);=0A= expires_str =3D ';expires=3D' + futureDate.toUTCString();=0A= }=0A= =0A= document.cookie =3D name + '=3D' + value + domain_str + path_str + = expires_str;=0A= }=0A= =0A= var EXPIRED_COOKIE_VALUE =3D 'EXPIRED';=0A= =0A= /**=0A= * Expires a cookie.=0A= *=0A= * @param name The cookie name.=0A= * @param opt_path The path of the cookie, or null to expire a cookie = set at=0A= * the full request path. If not provided, the default is '/' (i.e. = path=3D/).=0A= * @param opt_domain The domain of the cookie, or null to expire a = cookie set=0A= * at the full request host name. If not provided, the default is null = (i.e.=0A= * cookie at full request host name).=0A= * @return Void.=0A= */=0A= function ExpireCookie(name, opt_path, opt_domain) {=0A= SetCookie(name, EXPIRED_COOKIE_VALUE, 0, opt_path, opt_domain);=0A= }=0A= =0A= /** Returns the value for the first cookie with the given name=0A= * @param name : string=0A= * @return a string or the empty string if no cookie found.=0A= */=0A= function GetCookie(name) {=0A= var nameeq =3D name + "=3D";=0A= var cookie =3D String(document.cookie);=0A= for (var pos =3D -1; (pos =3D cookie.indexOf(nameeq, pos + 1)) >=3D = 0;) {=0A= var i =3D pos;=0A= // walk back along string skipping whitespace and looking for a ; = before=0A= // the name to make sure that we don't match cookies whose name = contains=0A= // the given name as a suffix.=0A= while (--i >=3D 0) {=0A= var ch =3D cookie.charAt(i);=0A= if (ch =3D=3D ';') {=0A= i =3D -1; // indicate success=0A= break;=0A= } else if (' \t'.indexOf(ch) < 0) {=0A= break;=0A= }=0A= }=0A= if (-1 =3D=3D=3D i) { // first cookie in the string or we found a ;=0A= var end =3D cookie.indexOf(';', pos);=0A= if (end < 0) { end =3D cookie.length; }=0A= return cookie.substring(pos + nameeq.length, end);=0A= }=0A= }=0A= return "";=0A= }=0A= =0A= =0A= //-----------------------------------------------------------------------= -=0A= // Time=0A= //-----------------------------------------------------------------------= -=0A= function Now() {=0A= return (new Date()).getTime();=0A= }=0A= =0A= //-----------------------------------------------------------------------= -=0A= // Dynamic HTML/DOM utilities=0A= //-----------------------------------------------------------------------= -=0A= // Gets a element by its id, may return null=0A= function MaybeGetElement(win, id) {=0A= return win.document.getElementById(id);=0A= }=0A= =0A= // Same as MaybeGetElement except that it throws an exception if it's = null=0A= function GetElement(win, id) {=0A= var el =3D win.document.getElementById(id);=0A= if (!el) {=0A= DumpError("Element " + id + " not found.");=0A= }=0A= return el;=0A= }=0A= =0A= // Gets elements by its id/name=0A= // IE treats getElementsByName as searching over ids, while Moz use = names.=0A= // so tags must have both id and name as the same string=0A= function GetElements(win, id) {=0A= return win.document.getElementsByName(id);=0A= }=0A= =0A= // Gets the parent of a html element.=0A= function GetParentNode(n) {=0A= try {=0A= return n.parentNode;=0A= } catch (e) {=0A= // n.parentNode may throw a permission-denied exception on mozilla=0A= // (e.g. on text element), ignore this exception.=0A= return n;=0A= }=0A= }=0A= =0A= function IsDescendant(parent, child) {=0A= do {=0A= if (parent =3D=3D=3D child) return true;=0A= child =3D GetParentNode(child);=0A= } while (child && child !=3D=3D document.body);=0A= return false;=0A= }=0A= =0A= // Get attribute value of a DOM node=0A= function GetAttribute(node, attribute) {=0A= if (!node.getAttribute) {=0A= return null;=0A= }=0A= var attr =3D node.getAttribute(attribute);=0A= if (is_ie && attribute =3D=3D "style") {=0A= return attr.value;=0A= } else {=0A= return attr;=0A= }=0A= }=0A= =0A= // Sets inner html of a html element=0A= function SetInnerHTML(win, id, html) {=0A= try {=0A= GetElement(win, id).innerHTML =3D html;=0A= } catch (ex) {=0A= DumpException(ex);=0A= }=0A= }=0A= =0A= // Gets inner-html of a html element=0A= function GetInnerHTML(win, id) {=0A= try {=0A= return GetElement(win, id).innerHTML;=0A= } catch (ex) {=0A= DumpException(ex);=0A= return "";=0A= }=0A= }=0A= =0A= // Clears inner html of a html element=0A= function ClearInnerHTML(win, id) {=0A= try {=0A= GetElement(win, id).innerHTML =3D "";=0A= } catch (ex) {=0A= DumpException(ex);=0A= }=0A= }=0A= =0A= // Sets a CSS style of an element=0A= function SetCssStyle(win, id, name, value) {=0A= try {=0A= var elem =3D GetElement(win, id);=0A= elem.style[name] =3D value;=0A= } catch (ex) {=0A= DumpException(ex);=0A= }=0A= }=0A= =0A= // Get CSS property from a style attribute string=0A= function GetStyleProperty(style, name) {=0A= var i =3D style.indexOf(name);=0A= if (i !=3D -1) {=0A= var j =3D style.indexOf(";", i);=0A= if (j =3D=3D -1) {=0A= j =3D style.length;=0A= }=0A= // the +1 below is for the colon following the attribute name=0A= return CollapseWhitespace(style.substring(i + name.length + 1, j));=0A= }=0A= return null;=0A= }=0A= =0A= // Show/hide an element.=0A= function ShowElement(el, show) {=0A= el.style.display =3D show ? "" : "none";=0A= }=0A= =0A= // Show/hide a block element.=0A= // ShowElement() doesn't work if object has an initial class with = display:none=0A= function ShowBlockElement(el, show) {=0A= el.style.display =3D show ? "block" : "none";=0A= }=0A= =0A= // Show/hide an inline element.=0A= // ShowElement() doesn't work when an element starts off display:none.=0A= function ShowInlineElement(el, show) {=0A= el.style.display =3D show ? "inline" : "none";=0A= }=0A= =0A= // Set the text of a button. This is to get around a bug in mozilla,=0A= // where we can't set the text of a button by setting innerHTML.=0A= function SetButtonText(button, text) {=0A= button.childNodes[0].nodeValue =3D text;=0A= }=0A= =0A= // Append a new HTML element to a HTML node.=0A= function AppendNewElement(win, parent, tag) {=0A= var e =3D win.document.createElement(tag);=0A= parent.appendChild(e);=0A= return e;=0A= }=0A= =0A= // Finds the child with the given ID, or null if there is node.=0A= // This does not search the children's children.=0A= function FindChildWithID(parent, id) {=0A= var el;=0A= for (el =3D parent.firstChild; el && el.id !=3D id; el =3D = el.nextSibling) {=0A= // skip=0A= }=0A= return el;=0A= }=0A= =0A= // Adds a disabled option to the given menu=0A= function AddMenuDisabledOption(win, menu, html) {=0A= var op =3D AppendNewElement(win, menu, 'OPTION');=0A= op.disabled =3D true;=0A= op.innerHTML =3D html;=0A= =0A= return op;=0A= }=0A= =0A= // Adds a option to the given menu=0A= function AddMenuOption(win, menu, value, html) {=0A= var op =3D AppendNewElement(win, menu, 'OPTION');=0A= op.value =3D value;=0A= op.innerHTML =3D html;=0A= =0A= return op;=0A= }=0A= =0A= // Create a new DIV (append it to the end of the document)=0A= function CreateDIV(win, id) {=0A= var div =3D MaybeGetElement(win, id);=0A= if (!div) {=0A= div =3D AppendNewElement(win, win.document.body, "div");=0A= div.id =3D id;=0A= }=0A= return div;=0A= }=0A= =0A= // Create a new IFRAME (append it to the end of the document)=0A= function CreateIFRAME(win, id, url) {=0A= var iframe =3D MaybeGetElement(win, id);=0A= if (!iframe) {=0A= // We cannot create an IFRAME directly (IE doesn't allow it), so we=0A= // create a DIV and then insert an IFRAME.=0A= // We also give the IFRAME a name (same as id)=0A= var div =3D AppendNewElement(win, win.document.body, "div");=0A= div.innerHTML =3D "";=0A= iframe =3D GetElement(win, id);=0A= }=0A= return iframe;=0A= }=0A= =0A= // Create a new TR containing the given td's=0A= function Tr(win, tds) {=0A= var tr =3D win.document.createElement("TR");=0A= for (var i =3D 0; i < tds.length; i++) {=0A= tr.appendChild(tds[i]);=0A= }=0A= return tr;=0A= }=0A= =0A= // Create a new TD, with an optional colspan=0A= function Td(win, opt_colspan) {=0A= var td =3D win.document.createElement("TD");=0A= if (opt_colspan) {=0A= td.colSpan =3D opt_colspan;=0A= }=0A= return td;=0A= }=0A= =0A= =0A= // Check if an element has a given class=0A= function HasClass(el, cl) {=0A= if (el =3D=3D null || el.className =3D=3D null) return false;=0A= var classes =3D el.className.split(" ");=0A= for (var i =3D 0; i < classes.length; i++) {=0A= if (classes[i] =3D=3D cl) {=0A= return true;=0A= }=0A= }=0A= return false;=0A= }=0A= =0A= // Add a class to element=0A= function AddClass(el, cl) {=0A= if (HasClass(el, cl)) return;=0A= el.className +=3D " " + cl;=0A= }=0A= =0A= // Remove a class from an element=0A= function RemoveClass(el, cl) {=0A= if (el.className =3D=3D null) return;=0A= var classes =3D el.className.split(" ");=0A= var result =3D [];=0A= var changed =3D false;=0A= for (var i =3D 0; i < classes.length; i++) {=0A= if (classes[i] !=3D cl) {=0A= if (classes[i]) { result.push(classes[i]); }=0A= } else {=0A= changed =3D true;=0A= }=0A= }=0A= if (changed) { el.className =3D result.join(" "); }=0A= }=0A= =0A= // Performs an in-order traversal of the tree rooted at the given node=0A= // (excluding the root node) and returns an array of nodes that match the=0A= // given selector. The selector must implement the method:=0A= //=0A= // boolean select(node);=0A= //=0A= // This method is a generalization of the DOM method = "getElementsByTagName"=0A= //=0A= function GetElementsBySelector(root, selector) {=0A= var nodes =3D [];=0A= for (var child =3D root.firstChild; child; child =3D = child.nextSibling) {=0A= AddElementBySelector_(child, selector, nodes);=0A= }=0A= return nodes;=0A= }=0A= =0A= // Recursive helper for GetElemnetsBySelector()=0A= function AddElementBySelector_(root, selector, nodes) {=0A= // First test the parent=0A= if (selector.select(root)) {=0A= nodes.push(root);=0A= }=0A= =0A= // Then recurse through the children=0A= for (var child =3D root.firstChild; child; child =3D = child.nextSibling) {=0A= AddElementBySelector_(child, selector, nodes);=0A= }=0A= }=0A= =0A= //-----------------------------------------------------------------------= -=0A= // Window/screen utilities=0A= // TODO: these should be renamed (e.g. GetWindowWidth to = GetWindowInnerWidth=0A= // and moved to geom.js)=0A= //-----------------------------------------------------------------------= -=0A= // Get page offset of an element=0A= function GetPageOffsetLeft(el) {=0A= var x =3D el.offsetLeft;=0A= if (el.offsetParent !=3D null)=0A= x +=3D GetPageOffsetLeft(el.offsetParent);=0A= return x;=0A= }=0A= =0A= // Get page offset of an element=0A= function GetPageOffsetTop(el) {=0A= var y =3D el.offsetTop;=0A= if (el.offsetParent !=3D null)=0A= y +=3D GetPageOffsetTop(el.offsetParent);=0A= return y;=0A= }=0A= =0A= // Get page offset of an element=0A= function GetPageOffset(el) {=0A= var x =3D el.offsetLeft;=0A= var y =3D el.offsetTop;=0A= if (el.offsetParent !=3D null) {=0A= var pos =3D GetPageOffset(el.offsetParent);=0A= x +=3D pos.x;=0A= y +=3D pos.y;=0A= }=0A= return {x: x, y: y};=0A= }=0A= =0A= function GetPageOffsetRight(el) {=0A= return GetPageOffsetLeft(el) + el.offsetWidth;=0A= }=0A= =0A= function GetPageOffsetBottom(el) {=0A= return GetPageOffsetTop(el) + el.offsetHeight;=0A= }=0A= =0A= // Get the y position scroll offset.=0A= function GetScrollTop(win) {=0A= // all except Explorer=0A= if ("pageYOffset" in win) {=0A= return win.pageYOffset;=0A= }=0A= // Explorer 6 Strict Mode=0A= else if ("documentElement" in win.document &&=0A= "scrollTop" in win.document.documentElement) {=0A= return win.document.documentElement.scrollTop;=0A= }=0A= // other Explorers=0A= else if ("scrollTop" in win.document.body) {=0A= return win.document.body.scrollTop;=0A= }=0A= =0A= return 0;=0A= }=0A= =0A= // Get the x position scroll offset.=0A= function GetScrollLeft(win) {=0A= // all except Explorer=0A= if ("pageXOffset" in win) {=0A= return win.pageXOffset;=0A= }=0A= // Explorer 6 Strict Mode=0A= else if ("documentElement" in win.document &&=0A= "scrollLeft" in win.document.documentElement) {=0A= return win.document.documentElement.scrollLeft;=0A= }=0A= // other Explorers=0A= else if ("scrollLeft" in win.document.body) {=0A= return win.document.body.scrollLeft;=0A= }=0A= =0A= return 0;=0A= }=0A= =0A= /**=0A= * Checks if window scrollbar has reached its maximum offset=0A= *=0A= * @param win a window object=0A= * @param opt_isHoriz true if horizontal bar, false if vertical=0A= */=0A= function IsScrollAtEnd(win, opt_isHoriz) {=0A= var total =3D=0A= (opt_isHoriz) ? document.body.offsetWidth : = document.body.offsetHeight;=0A= var inner =3D=0A= (opt_isHoriz) ? GetWindowWidth(win) : GetWindowHeight(win);=0A= var offset =3D=0A= (opt_isHoriz) ? GetScrollLeft(win) : GetScrollTop(win);=0A= =0A= return (inner + offset >=3D total || total < inner);=0A= }=0A= =0A= // Scroll window to pos=0A= // position: 0 =3D top, 0.5 =3D middle, 1 =3D bottom=0A= function ScrollTo(win, el, position) {=0A= var y =3D GetPageOffsetTop(el);=0A= y -=3D GetWindowHeight(win) * position;=0A= win.scrollTo(0, y);=0A= }=0A= =0A= // Scroll so that as far as possible the entire element is in view.=0A= var ALIGN_BOTTOM =3D 'b';=0A= var ALIGN_MIDDLE =3D 'm';=0A= var ALIGN_TOP =3D 't';=0A= function ScrollIntoView(win, el, alignment) {=0A= var el_top =3D GetPageOffsetTop(el);=0A= var el_bottom =3D el_top + el.offsetHeight;=0A= var win_top =3D GetScrollTop(win);=0A= var win_height =3D GetWindowHeight(win);=0A= var win_bottom =3D win_top + win_height;=0A= =0A= // Out of view?=0A= if (el_top < win_top ||=0A= el_bottom > win_bottom) {=0A= =0A= var scrollto_y;=0A= if (alignment =3D=3D ALIGN_BOTTOM) {=0A= scrollto_y =3D el_bottom - win_height + 5;=0A= } else if (alignment =3D=3D ALIGN_MIDDLE) {=0A= scrollto_y =3D (el_top + el_bottom) / 2 - win_height/2;=0A= } else {=0A= scrollto_y =3D el_top - 5; // ALIGN_TOP=0A= }=0A= =0A= Debug("Scrolling to " + scrollto_y);=0A= win.scrollTo(0, scrollto_y);=0A= }=0A= }=0A= =0A= function IsElementVisible(win, id) {=0A= var el =3D MaybeGetElement(win, id);=0A= if (el =3D=3D null) {=0A= return false;=0A= }=0A= var el_top =3D GetPageOffsetTop(el);=0A= var el_bottom =3D el_top + el.offsetHeight;=0A= var win_top =3D GetScrollTop(win);=0A= var win_bottom =3D win_top + GetWindowHeight(win);=0A= if (el_top >=3D win_top && el_bottom <=3D win_bottom) {=0A= return true;=0A= }=0A= return false;=0A= }=0A= =0A= function GetWindowWidth(win) {=0A= // all except Explorer=0A= if ("innerWidth" in win) {=0A= return win.innerWidth;=0A= }=0A= // Explorer 6 Strict Mode=0A= else if ("documentElement" in win.document &&=0A= "clientWidth" in win.document.documentElement) {=0A= return win.document.documentElement.clientWidth;=0A= }=0A= // other Explorers=0A= else if ("clientWidth" in win.document.body) {=0A= return win.document.body.clientWidth;=0A= }=0A= =0A= return 0;=0A= }=0A= =0A= function GetWindowHeight(win) {=0A= // all except Explorer=0A= if ("innerHeight" in win) {=0A= return win.innerHeight;=0A= }=0A= // Explorer 6 Strict Mode=0A= else if ("documentElement" in win.document &&=0A= "clientHeight" in win.document.documentElement) {=0A= return win.document.documentElement.clientHeight;=0A= }=0A= // other Explorers=0A= else if ("clientHeight" in win.document.body) {=0A= return win.document.body.clientHeight;=0A= }=0A= =0A= return 0;=0A= }=0A= =0A= function GetAvailScreenWidth(win) {=0A= return win.screen.availWidth;=0A= }=0A= =0A= function GetAvailScreenHeight(win) {=0A= return win.screen.availHeight;=0A= }=0A= =0A= // Returns a "nice" window height.=0A= // Use the screen height. (Or should we use the height of the current = window?)=0A= function GetNiceWindowHeight(win) {=0A= return Math.floor(0.8 * GetAvailScreenHeight(win));=0A= }=0A= =0A= // Used for horizontally centering a new window of the given width in the=0A= // available screen. Set the new window's distance from the left of the = screen=0A= // equal to this function's return value.=0A= // Params: width: the width of the new window=0A= // Returns: the distance from the left edge of the screen for the new = window to=0A= // be horizontally centered=0A= function GetCenteringLeft(win, width) {=0A= return (win.screen.availWidth - width) >> 1;=0A= }=0A= =0A= // Used for vertically centering a new window of the given height in the=0A= // available screen. Set the new window's distance from the top of the = screen=0A= // equal to this function's return value.=0A= // Params: height: the height of the new window=0A= // Returns: the distance from the top edge of the screen for the new = window to=0A= // be vertically aligned.=0A= function GetCenteringTop(win, height) {=0A= return (win.screen.availHeight - height) >> 1;=0A= }=0A= =0A= /*=0A= * Opens a child popup window that has no browser toolbar/decorations.=0A= * (Copied from caribou's common.js library with small modifications.)=0A= *=0A= * @param url the URL for the new window (Note: this will be = unique-ified)=0A= * @param opt_name the name of the new window=0A= * @param opt_width the width of the new window=0A= * @param opt_height the height of the new window=0A= * @param opt_center if true, the new window is centered in the = available screen=0A= * @param opt_hide_scrollbars if true, the window hides the scrollbars=0A= * @param opt_noresize if true, makes window unresizable=0A= * @param opt_blocked_msg message warning that the popup has been blocked=0A= * @return a reference to the new child window=0A= */=0A= function Popup(url, opt_name, opt_width, opt_height, opt_center,=0A= opt_hide_scrollbars, opt_noresize, opt_blocked_msg) {=0A= if (!opt_height) {=0A= opt_height =3D Math.floor(GetWindowHeight(window.top) * 0.8);=0A= }=0A= if (!opt_width) {=0A= opt_width =3D Math.min(GetAvailScreenWidth(window), opt_height);=0A= }=0A= =0A= var features =3D "resizable=3D" + (opt_noresize ? "no" : "yes") + "," +=0A= "scrollbars=3D" + (opt_hide_scrollbars ? "no" : "yes") = + "," +=0A= "width=3D" + opt_width + ",height=3D" + opt_height;=0A= if (opt_center) {=0A= features +=3D ",left=3D" + GetCenteringLeft(window, opt_width) + "," = +=0A= "top=3D" + GetCenteringTop(window, opt_height);=0A= }=0A= return OpenWindow(window, url, opt_name, features, opt_blocked_msg);=0A= }=0A= =0A= /*=0A= * Opens a new window. Returns the new window handle. Tries to open the = new=0A= * window using top.open() first. If that doesn't work, then tries = win.open().=0A= * If that still doesn't work, prints an alert.=0A= * (Copied from caribou's common.js library with small modifications.)=0A= *=0A= * @param win the parent window from which to open the new child window=0A= * @param url the URL for the new window (Note: this will be = unique-ified)=0A= * @param opt_name the name of the new window=0A= * @param opt_features the properties of the new window=0A= * @param opt_blocked_msg message warning that the popup has been blocked=0A= * @return a reference to the new child window=0A= */=0A= function OpenWindow(win, url, opt_name, opt_features, opt_blocked_msg) {=0A= var newwin =3D OpenWindowHelper(top, url, opt_name, opt_features);=0A= if (!newwin || newwin.closed || !newwin.focus) {=0A= newwin =3D OpenWindowHelper(win, url, opt_name, opt_features);=0A= }=0A= if (!newwin || newwin.closed || !newwin.focus) {=0A= if (opt_blocked_msg) alert(opt_blocked_msg);=0A= } else {=0A= // Make sure that the window has the focus=0A= newwin.focus();=0A= }=0A= return newwin;=0A= }=0A= =0A= /*=0A= * Helper for OpenWindow().=0A= * (Copied from caribou's common.js library with small modifications.)=0A= */=0A= function OpenWindowHelper(win, url, name, features) {=0A= var newwin;=0A= if (features) {=0A= newwin =3D win.open(url, name, features);=0A= } else if (name) {=0A= newwin =3D win.open(url, name);=0A= } else {=0A= newwin =3D win.open(url);=0A= }=0A= return newwin;=0A= }=0A= =0A= //-----------------------------------------------------------------------= -=0A= // DOM walking utilities=0A= //-----------------------------------------------------------------------= -=0A= =0A= function MaybeEscape(str, escape) {=0A= return escape ? HtmlEscape(str) : str;=0A= }=0A= =0A= =0A= //-----------------------------------------------------------------------= -=0A= // Window data=0A= //-----------------------------------------------------------------------= -=0A= // Gets an array, which can store data for the window. This data=0A= // is deleted when the window is unloaded.=0A= var windata =3D [];=0A= function GetWindowData(win) {=0A= var data =3D windata[win.name];=0A= if (!data) {=0A= windata[win.name] =3D data =3D [];=0A= }=0A= return data;=0A= }=0A= =0A= // Clear js data for a window.=0A= function ClearWindowData(win_name) {=0A= if (windata[win_name]) {=0A= windata[win_name] =3D null;=0A= }=0A= }=0A= =0A= //-----------------------------------------------------------------------= -=0A= // String utilities=0A= //-----------------------------------------------------------------------= -=0A= // Do html escaping=0A= var amp_re_ =3D /&/g;=0A= var lt_re_ =3D //g;=0A= =0A= // Convert text to HTML format. For efficiency, we just convert '&', = '<', '>'=0A= // characters.=0A= // Note: Javascript >=3D 1.3 supports lambda expression in the = replacement=0A= // argument. But it's slower on IE.=0A= // Note: we can also implement HtmlEscape by setting the value=0A= // of a textnode and then reading the 'innerHTML' value, but that=0A= // that turns out to be slower.=0A= // Params: str: String to be escaped.=0A= // Returns: The escaped string.=0A= function HtmlEscape(str) {=0A= if (!str) return "";=0A= return str.replace(amp_re_, "&").replace(lt_re_, "<").=0A= replace(gt_re_, ">").replace(quote_re_, """);=0A= }=0A= =0A= /** converts html entities to plain text. It covers the most common = named=0A= * entities and numeric entities.=0A= * It does not cover all named entities -- it covers = &{lt,gt,amp,quot,nbsp}; but=0A= * does not handle some of the more obscure ones like &{ndash,eacute};.=0A= */=0A= function HtmlUnescape(str) {=0A= if (!str) return "";=0A= return str.=0A= replace(/&#(\d+);/g,=0A= function (_, n) { return String.fromCharCode(parseInt(n, 10)); }).=0A= replace(/&#x([a-f0-9]+);/gi,=0A= function (_, n) { return String.fromCharCode(parseInt(n, 16)); }).=0A= replace(/&(\w+);/g, function (_, entity) {=0A= entity =3D entity.toLowerCase();=0A= return entity in HtmlUnescape.unesc ? HtmlUnescape.unesc[entity] : = '?';=0A= });=0A= }=0A= HtmlUnescape.unesc =3D { lt: '<', gt: '>', quot: '"', nbsp: ' ', amp: = '&' };=0A= =0A= // Replace multiple spaces with   to retain whitespace formatting=0A= // in addition to escaping '&', '<', and '>'.=0A= var dbsp_re_ =3D / /g;=0A= var ret_re_ =3D /\r/g;=0A= var nl_re_ =3D /\n/g;=0A= function HtmlWhitespaceEscape(str) {=0A= str =3D HtmlEscape(str);=0A= str =3D str.replace(dbsp_re_, "  ");=0A= str =3D str.replace(ret_re_, "");=0A= str =3D str.replace(nl_re_, "
");=0A= return str;=0A= }=0A= =0A= // Escape double quote '"' characters in addition to '&', '<', '>' so = that a=0A= // string can be included in an HTML tag attribute value within double = quotes.=0A= // Params: str: String to be escaped.=0A= // Returns: The escaped string.=0A= var quote_re_ =3D /\"/g;=0A= function QuoteEscape(str) {=0A= return HtmlEscape(str).replace(quote_re_, """);=0A= }=0A= =0A= var JS_SPECIAL_RE_ =3D /[\'\\\r\n\b\"<>&]/g;=0A= =0A= function JSEscOne_(s) {=0A= if (!JSEscOne_.js_escs_) {=0A= var escapes =3D {};=0A= escapes['\\'] =3D '\\\\';=0A= escapes['\''] =3D '\\047';=0A= escapes['\n'] =3D '\\n';=0A= escapes['\r'] =3D '\\r';=0A= escapes['\b'] =3D '\\b';=0A= escapes['\"'] =3D '\\042';=0A= escapes['<'] =3D '\\074';=0A= escapes['>'] =3D '\\076';=0A= escapes['&'] =3D '\\046';=0A= =0A= JSEscOne_.js_escs_ =3D escapes;=0A= }=0A= =0A= return JSEscOne_.js_escs_[s];=0A= }=0A= =0A= /** convert a string to a javascript string literal. This function has = the=0A= * property that the return value is also already html escaped, so the = output=0A= * can be embedded in an html handler attribute.=0A= */=0A= function ToJSString(s) {=0A= return "'" + s.toString().replace(JS_SPECIAL_RE_, JSEscOne_) + "'";=0A= }=0A= =0A= // converts multiple ws chars to a single space, and strips=0A= // leading and trailing ws=0A= var spc_re_ =3D /\s+/g;=0A= var beg_spc_re_ =3D /^ /;=0A= var end_spc_re_ =3D / $/;=0A= function CollapseWhitespace(str) {=0A= if (!str) return "";=0A= return str.replace(spc_re_, " ").replace(beg_spc_re_, "").=0A= replace(end_spc_re_, "");=0A= }=0A= =0A= var newline_re_ =3D /\r?\n/g;=0A= var spctab_re_ =3D /[ \t]+/g;=0A= var nbsp_re_ =3D /\xa0/g;=0A= function StripNewlines(str) {=0A= if (!str) return "";=0A= return str.replace(newline_re_, " ");=0A= }=0A= =0A= function CanonicalizeNewlines(str) {=0A= if (!str) return "";=0A= return str.replace(newline_re_, '\n');=0A= }=0A= =0A= function HtmlifyNewlines(str) {=0A= if (!str) return "";=0A= return str.replace(newline_re_, "
");=0A= }=0A= =0A= function NormalizeSpaces(str) {=0A= if (!str) return "";=0A= return str.replace(spctab_re_, " ").replace(nbsp_re_, " ");=0A= }=0A= =0A= // URL encodes the string.=0A= function UrlEncode(str) {=0A= return encodeURIComponent(str);=0A= }=0A= =0A= function Trim(str) {=0A= if (!str) return "";=0A= return str.replace(/^\s+/, "").replace(/\s+$/, "");=0A= }=0A= =0A= function EndsWith(str, suffix) {=0A= if (!str) return !suffix;=0A= return (str.lastIndexOf(suffix) =3D=3D (str.length - suffix.length));=0A= }=0A= =0A= // Check if a string is empty=0A= function IsEmpty(str) {=0A= return CollapseWhitespace(str) =3D=3D "";=0A= }=0A= =0A= // Check if a character is a letter=0A= function IsLetterOrDigit(ch) {=0A= return ((ch >=3D "a" && ch <=3D "z") ||=0A= (ch >=3D "A" && ch <=3D "Z") ||=0A= (ch >=3D '0' && ch <=3D '9'));=0A= }=0A= =0A= // Check if a character is a space character=0A= function IsSpace(ch) {=0A= return (" \t\r\n".indexOf(ch) >=3D 0);=0A= }=0A= =0A= // Converts any instances of "\r" or "\r\n" style EOLs into "\n" (Line = Feed),=0A= // and also trim the extra newlines and whitespaces at the end.=0A= var eol_re_ =3D /\r\n?/g;=0A= var trailingspc_re_ =3D /[\n\t ]+$/;=0A= function NormalizeText(str) {=0A= return str.replace(eol_re_, "\n").replace(trailingspc_re_, "");=0A= }=0A= =0A= // Inserts s (word break tag) after every n non-space chars and/or=0A= // after or before certain special chars. The input string should be = plain=0A= // text that has not yet been HTML-escaped.=0A= // Params:=0A= // str: The string to insert s into.=0A= // n: The maximum number of consecutive non-space characters to allow = before=0A= // adding a . To turn off this rule (i.e. if you only want to = add=0A= // breaks based on special characters), pass in the value -1.=0A= // chars_to_break_after: The list of special characters (concatenated = into a=0A= // string) after which a should be added, if there is no = natural=0A= // break at that point. To turn off this rule, pass in the empty = string.=0A= // chars_to_break_before: The list of special characters (concatenated = into a=0A= // string) before which a should be added, if there is no = natural=0A= // break at that point. To turn off this rule, pass in the empty = string.=0A= // Returns: The string str htmlescaped, and with s inserted = according to=0A= // the rules specified by the other arguments.=0A= function HtmlEscapeInsertWbrs(str, n, chars_to_break_after,=0A= chars_to_break_before) {=0A= AssertNumArgs(4);=0A= =0A= var out =3D '';=0A= var strpos =3D 0;=0A= var spc =3D 0;=0A= =0A= for (var i =3D 1; i < str.length; ++i) {=0A= var prev_char =3D str.charAt(i - 1);=0A= var next_char =3D str.charAt(i);=0A= if (IsSpace(next_char)) {=0A= spc =3D i;=0A= } else if (i - spc =3D=3D n ||=0A= chars_to_break_after.indexOf(prev_char) !=3D -1 ||=0A= chars_to_break_before.indexOf(next_char) !=3D -1) {=0A= out +=3D HtmlEscape(str.substring(strpos, i)) + '';=0A= strpos =3D i;=0A= spc =3D i;=0A= }=0A= }=0A= out +=3D HtmlEscape(str.substr(strpos));=0A= return out;=0A= }=0A= =0A= // Converts a string to its canonicalized label form.=0A= var illegal_chars_re_ =3D /[ \/(){}&|\\\"\000]/g;=0A= function CanonicalizeLabel(str, lowercase) {=0A= var uppercase =3D str.replace(illegal_chars_re_, '-');=0A= return lowercase ? uppercase.toLowerCase() : uppercase;=0A= }=0A= =0A= // Case-insensitive string comparator=0A= function CompareStringsIgnoreCase(s1, s2) {=0A= s1 =3D s1.toLowerCase();=0A= s2 =3D s2.toLowerCase();=0A= =0A= if (s1 < s2) {=0A= return -1;=0A= } else if (s1 =3D=3D s2) {=0A= return 0;=0A= } else {=0A= return 1;=0A= }=0A= }=0A= =0A= //-----------------------------------------------------------------------= -=0A= // TextArea utilities=0A= //-----------------------------------------------------------------------= -=0A= =0A= // Gets the cursor pos in a text area. Returns -1 if the cursor pos = cannot=0A= // be determined or if the cursor out of the textfield.=0A= function GetCursorPos(win, textfield) {=0A= try {=0A= if (IsDefined(textfield.selectionEnd)) {=0A= // Mozilla directly supports this=0A= return textfield.selectionEnd;=0A= =0A= } else if (win.document.selection && = win.document.selection.createRange) {=0A= // IE doesn't export an accessor for the endpoints of a selection.=0A= // Instead, it uses the TextRange object, which has an extremely = obtuse=0A= // API. Here's what seems to work:=0A= =0A= // (1) Obtain a textfield from the current selection (cursor)=0A= var tr =3D win.document.selection.createRange();=0A= =0A= // Check if the current selection is in the textfield=0A= if (tr.parentElement() !=3D textfield) {=0A= return -1;=0A= }=0A= =0A= // (2) Make a text range encompassing the textfield=0A= var tr2 =3D tr.duplicate();=0A= tr2.moveToElementText(textfield);=0A= =0A= // (3) Move the end of the copy to the beginning of the selection=0A= tr2.setEndPoint("EndToStart", tr);=0A= =0A= // (4) The span of the textrange copy is equivalent to the cursor = pos=0A= var cursor =3D tr2.text.length;=0A= =0A= // Finally, perform a sanity check to make sure the cursor is in = the=0A= // textfield. IE sometimes screws this up when the window is = activated=0A= if (cursor > textfield.value.length) {=0A= return -1;=0A= }=0A= return cursor;=0A= } else {=0A= Debug("Unable to get cursor position for: " + navigator.userAgent);=0A= =0A= // Just return the size of the textfield=0A= // TODO: Investigate how to get cursor pos in Safari!=0A= return textfield.value.length;=0A= }=0A= } catch (e) {=0A= DumpException(e, "Cannot get cursor pos");=0A= }=0A= =0A= return -1;=0A= }=0A= =0A= function SetCursorPos(win, textfield, pos) {=0A= if (IsDefined(textfield.selectionEnd) &&=0A= IsDefined(textfield.selectionStart)) {=0A= // Mozilla directly supports this=0A= textfield.selectionStart =3D pos;=0A= textfield.selectionEnd =3D pos;=0A= =0A= } else if (win.document.selection && textfield.createTextRange) {=0A= // IE has textranges. A textfield's textrange encompasses the=0A= // entire textfield's text by default=0A= var sel =3D textfield.createTextRange();=0A= =0A= sel.collapse(true);=0A= sel.move("character", pos);=0A= sel.select();=0A= }=0A= }=0A= =0A= //-----------------------------------------------------------------------= -=0A= // Array utilities=0A= //-----------------------------------------------------------------------= -=0A= // Find an item in an array, returns the key, or -1 if not found=0A= function FindInArray(array, x) {=0A= for (var i =3D 0; i < array.length; i++) {=0A= if (array[i] =3D=3D x) {=0A= return i;=0A= }=0A= }=0A= return -1;=0A= }=0A= =0A= // Inserts an item into an array, if it's not already in the array=0A= function InsertArray(array, x) {=0A= if (FindInArray(array, x) =3D=3D -1) {=0A= array[array.length] =3D x;=0A= }=0A= }=0A= =0A= // Delete an element from an array=0A= function DeleteArrayElement(array, x) {=0A= var i =3D 0;=0A= while (i < array.length && array[i] !=3D x)=0A= i++;=0A= array.splice(i, 1);=0A= }=0A= =0A= // Copies a flat array=0A= function CopyArray(array) {=0A= var copy =3D [];=0A= for (var i =3D 0; i < array.length; i++) {=0A= copy[i] =3D array[i];=0A= }=0A= return copy;=0A= }=0A= =0A= // Clone an object (recursively)=0A= function CloneObject(x) {=0A= if ((typeof x) =3D=3D "object") {=0A= var y =3D [];=0A= for (var i in x) {=0A= y[i] =3D CloneObject(x[i]);=0A= }=0A= return y;=0A= }=0A= return x;=0A= }=0A= =0A= /**=0A= * Clone an event; cannot use CloneObject(event)=0A= * because it suffers from infinite recursion.=0A= * Thus, only a subset of the event properties are=0A= * cloned -- if you need others, just add them=0A= * to this function (just don't remove any!)=0A= */=0A= function CloneEvent(ev) {=0A= var clone =3D {};=0A= clone.clientX =3D ev.clientX;=0A= clone.clientY =3D ev.clientY;=0A= clone.pageX =3D ev.pageX;=0A= clone.pageY =3D ev.pageY;=0A= clone.type =3D ev.type;=0A= clone.srcElement =3D ev.srcElement;=0A= clone.target =3D ev.target;=0A= clone.cancelBubble =3D ev.cancelBubble;=0A= clone.explicitOriginalTarget =3D ev.explicitOriginalTarget;=0A= // add more properties here=0A= =0A= return clone;=0A= }=0A= =0A= function GetEventTarget(/*Event*/ ev) {=0A= // Event is not a type in IE; IE uses Object for events=0A= // AssertType(ev, Event, 'arg passed to GetEventTarget not an Event');=0A= return ev.srcElement || ev.target;=0A= }=0A= =0A= /** cancels the event */=0A= // from http://www.quirksmode.org/js/events_order.html=0A= function CancelEvent(/*Event*/ ev) {=0A= if (is_ie) {=0A= ev.cancelBubble =3D true;=0A= } else if (ev.stopPropagation) {=0A= ev.stopPropagation();=0A= }=0A= }=0A= =0A= //-----------------------------------------------------------------------= -=0A= // Formatting utilities=0A= //-----------------------------------------------------------------------= -=0A= // A simple printf type function that takes in a template array, and a = data=0A= // array. e.g. PrintArray(["a",,"b",,"c"], ["x", "y"]) =3D> axbyc=0A= function PrintArray(array, data) {=0A= // Check that the argument count is correct.=0A= AssertEquals(array.length, data.length * 2 + 1);=0A= =0A= for (var i =3D 0, idx =3D 1; i < data.length; i++, idx +=3D 2) {=0A= array[idx] =3D data[i];=0A= }=0A= return array.join("");=0A= }=0A= =0A= function ImageHtml(url, attributes) {=0A= return "";=0A= }=0A= =0A= // Formats an object id that has two id numbers, eg, foo_3_7=0A= function MakeId3(idprefix, m, n) {=0A= return idprefix + m + "_" + n;=0A= }=0A= =0A= //-----------------------------------------------------------------------= -=0A= // Email address parsing=0A= //-----------------------------------------------------------------------= -=0A= // Parse an email address of the form "name"
into [name, = address]=0A= function ParseAddress(addr) {=0A= var name =3D "";=0A= var address =3D "";=0A= for (var i =3D 0; i < addr.length;) {=0A= var token =3D GetEmailToken(addr, i);=0A= if (token.charAt(0) =3D=3D '<') {=0A= var end =3D token.indexOf(">");=0A= address =3D token.substring(1, (end !=3D -1) ? end : token.length);=0A= } else if (address =3D=3D "") {=0A= name +=3D token;=0A= }=0A= i +=3D token.length;=0A= }=0A= =0A= // Check if it's a simple email address of the form "jlim@google.com"=0A= if (address =3D=3D "" && name.indexOf("@") !=3D -1) {=0A= address =3D name;=0A= name =3D "";=0A= }=0A= =0A= name =3D CollapseWhitespace(name);=0A= name =3D StripQuotes(name, "'");=0A= name =3D StripQuotes(name, "\"");=0A= address =3D CollapseWhitespace(address);=0A= return [name, address];=0A= }=0A= =0A= // Given an email address, get the address part=0A= function GetAddress(address) {=0A= return ParseAddress(address)[1];=0A= }=0A= =0A= // Get the username part of an email address=0A= function GetAddressUsername(address) {=0A= address =3D GetAddress(address);=0A= var at =3D address.indexOf("@");=0A= return (at =3D=3D -1) ? address : address.substr(0, at);=0A= }=0A= =0A= // Given an email address, get the personal part=0A= function GetPersonal(address) {=0A= return ParseAddress(address)[0];=0A= }=0A= =0A= // Given an address, get a short name=0A= function GetPersonalElseUsername(address) {=0A= var personal =3D GetPersonal(address);=0A= if (personal !=3D "") {=0A= return personal;=0A= } else {=0A= return GetAddressUsername(address);=0A= }=0A= }=0A= =0A= // Strip ' or " chars around a string=0A= function StripQuotes(str, quotechar) {=0A= var len =3D str.length;=0A= if (str.charAt(0) =3D=3D quotechar &&=0A= str.charAt(len - 1) =3D=3D quotechar) {=0A= return str.substring(1, len - 1);=0A= }=0A= return str;=0A= }=0A= =0A= // Convert a string containing list of email addresses into an array=0A= // of strings=0A= function EmailsToArray(str) {=0A= var result =3D [];=0A= var email =3D "";=0A= var token;=0A= =0A= for (var i =3D 0; i < str.length; ) {=0A= token =3D GetEmailToken(str, i);=0A= if (token =3D=3D ",") {=0A= AddEmailAddress(result, email);=0A= email =3D "";=0A= i++;=0A= continue;=0A= }=0A= email +=3D token;=0A= i +=3D token.length;=0A= }=0A= =0A= // Add last=0A= if (email !=3D"" || token =3D=3D ",") {=0A= AddEmailAddress(result, email);=0A= }=0A= return result;=0A= }=0A= =0A= // Get the next token from a position in an address string=0A= var openers_ =3D "\"<([";=0A= var closers_ =3D "\">)]";=0A= function GetEmailToken(str, pos) {=0A= var ch =3D str.charAt(pos);=0A= var p =3D openers_.indexOf(ch);=0A= if (p =3D=3D -1)=0A= return ch;=0A= var end_pos =3D str.indexOf(closers_.charAt(p), pos + 1);=0A= var token =3D (end_pos >=3D 0) ? str.substring(pos, end_pos + 1) :=0A= str.substr(pos);=0A= return token;=0A= }=0A= =0A= // Add an email address to the result array.=0A= function AddEmailAddress(result, email) {=0A= email =3D CleanEmailAddress(email);=0A= result[result.length] =3D email;=0A= }=0A= =0A= // Clean up email address:=0A= // - remove extra spaces=0A= // - Surround name with quotes if it contains special characters=0A= // to check if we need " quotes=0A= // Note: do not use /g in the regular expression, otherwise the=0A= // regular expression cannot be reusable.=0A= var specialchars_re_ =3D /[()<>@,;:\\\".\[\]]/;=0A= =0A= function CleanEmailAddress(str) {=0A= var name_address =3D ParseAddress(str);=0A= var name =3D name_address[0];=0A= var address =3D name_address[1];=0A= =0A= if (name.indexOf("\"") =3D=3D -1) { // If there's no "=0A= var quote_needed =3D specialchars_re_.test(name);=0A= if (quote_needed) {=0A= name =3D "\"" + name + "\"";=0A= }=0A= }=0A= =0A= if (name =3D=3D "")=0A= return address;=0A= else if (address =3D=3D "")=0A= return name;=0A= else=0A= return name + " <" + address + ">";=0A= }=0A= =0A= //-----------------------------------------------------------------------= -=0A= // Misc=0A= //-----------------------------------------------------------------------= -=0A= // Compare long hex strings=0A= function CompareID(a, b) {=0A= if (a.length !=3D b.length) {=0A= return (a.length - b.length);=0A= } else {=0A= return (a < b) ? -1 : (a > b) ? 1 : 0;=0A= }=0A= }=0A= =0A= // Check if a value is defined=0A= function IsDefined(value) {=0A= return (typeof value) !=3D 'undefined';=0A= }=0A= =0A= function GetKeyCode(event) {=0A= var code;=0A= if (event.keyCode) {=0A= code =3D event.keyCode;=0A= } else if (event.which) {=0A= code =3D event.which;=0A= }=0A= return code;=0A= }=0A= =0A= // define a forid function to fetch a DOM node by id.=0A= function forid_1(id) {=0A= return document.getElementById(id);=0A= }=0A= function forid_2(id) {=0A= return document.all[id];=0A= }=0A= =0A= /**=0A= * Fetch an HtmlElement by id.=0A= * DEPRECATED: use $ in dom.js=0A= */=0A= var forid =3D document.getElementById ? forid_1 : forid_2;=0A= =0A= =0A= =0A= function log(msg) {=0A= /* a top level window is its own parent. Use !=3D or else fails on IE = with=0A= * infinite loop.=0A= */=0A= try {=0A= if (window.parent !=3D window && window.parent.log) {=0A= window.parent.log(window.name + '::' + msg);=0A= return;=0A= }=0A= } catch (e) {=0A= // Error: uncaught exception: Permission denied to get property = Window.log=0A= }=0A= var logPane =3D forid('log');=0A= if (logPane) {=0A= var logText =3D '

' + new = Date() +=0A= '' + msg + '

';=0A= logPane.innerHTML =3D logText + logPane.innerHTML;=0A= } else {=0A= window.status =3D msg;=0A= }=0A= }=0A= ------=_NextPart_000_0087_01C839B2.B904A370 Content-Type: application/octet-stream Content-Transfer-Encoding: quoted-printable Content-Location: http://www.blogger.com/v-app/scripts/1118085881-dom.common.js =0A= // Commonly-used functions, reduced.=0A= =0A= function d(s) {return document.getElementById(s);}=0A= function dE(o,s) {return o.getElementsByTagName(s);}=0A= =0A= /**=0A= * toggleDisplay()=0A= *=0A= * Will toggle the display property of the style object for any=0A= * DOM element or object that supports style as a property.=0A= *=0A= * Warning: This'll wreak havoc if applied to elements. Those=0A= * babies got different types "table-row" | "block" dependant on =0A= * what browser's being used.=0A= *=0A= * Warning: Written in Texas. Yeehaw.=0A= *=0A= * Typical usage:=0A= * toggleDisplay(document.getElementById("foo"));=0A= */=0A= function toggleDisplay(o)=0A= { =0A= var display =3D getStyle(o, "display"); =0A= =0A= if (o.style)=0A= o.style.display =3D=0A= (display !=3D "none") ? "none" : getDisplayStyleByTagName(o);=0A= }=0A= =0A= =0A= function getDisplayStyleByTagName(o)=0A= {=0A= n =3D o.nodeName.toLowerCase(); =0A= return (=0A= n =3D=3D "span"=0A= || n =3D=3D "img"=0A= || n =3D=3D "a"=0A= ) ? "inline" : "block";=0A= }=0A= =0A= =0A= /**=0A= * hideElement()=0A= *=0A= * Hides an element from view.=0A= *=0A= * Typical usage:=0A= * hideElement(getElement("the-id-of-the-element"));=0A= */=0A= function hideElement(o)=0A= {=0A= if (o && o.style) o.style.display =3D "none";=0A= }=0A= =0A= =0A= =0A= /**=0A= * showElement()=0A= *=0A= * Shows an element that was hidden from view.=0A= *=0A= * Typical usage:=0A= * showElement(getElement("the-id-of-the-element"));=0A= */=0A= function showElement(o)=0A= {=0A= =0A= if (o && o.style) o.style.display =3D getDisplayStyleByTagName(o);=0A= }=0A= =0A= =0A= /**=0A= * getElement()=0A= *=0A= * Returns an element by its ID or shows an alert if it can't be found.=0A= *=0A= * Typical usage:=0A= * getElement("the-id-of-the-element");=0A= */=0A= function getElement(id) {=0A= var e =3D d(id);=0A= if (!e) {=0A= alert("Cannot get element: " + id);=0A= }=0A= return e;=0A= }=0A= =0A= /**=0A= * setInnerHTML()=0A= *=0A= * Sets the innerHTML of an element or shows an alert if can't be set.=0A= *=0A= * Typical usage:=0A= * setInnerHTML("the-id-of-the-element");=0A= */=0A= function setInnerHTML(id, html) {=0A= try {=0A= getElement(id).innerHTML =3D html;=0A= } catch (ex) {=0A= alert("Cannot set inner HTML: " + id);=0A= }=0A= }=0A= =0A= =0A= /**=0A= * setCssStyle()=0A= *=0A= * Sets the style of an element by its id or shows an alert if can't be = set.=0A= *=0A= * Typical usage:=0A= * setCssStyle("the-id-of-the-element", "display", "block");=0A= */=0A= function setCssStyle(id, name, value) {=0A= try {=0A= getElement(id).style[name] =3D value;=0A= } catch (ex) {=0A= alert("Cannot set style: " + id);=0A= }=0A= }=0A= =0A= =0A= /**=0A= * getStyle()=0A= *=0A= * Gets the computed style of any object.=0A= *=0A= * WARNING: Produces unexpected results in Safari. To achieve best =0A= * results, explicitly set the style property for that browser when the =0A= * element is rendered.=0A= *=0A= * Typical usage:=0A= * getStyle(object, "display");=0A= */=0A= function getStyle(el, style) {=0A= if (!document.getElementById || !el) return;=0A= =0A= if (document.defaultView=0A= && document.defaultView.getComputedStyle) {=0A= return document.defaultView.=0A= getComputedStyle(el, "").getPropertyValue(style);=0A= } =0A= else if (el.currentStyle) {=0A= return el.currentStyle[style];=0A= } =0A= else { =0A= return el.style.display;=0A= }=0A= }=0A= =0A= /**=0A= * getStyleAttribute()=0A= *=0A= * Returns the style attribute of the specified node.=0A= */=0A= function getStyleAttribute(node) {=0A= if (Detect.IE()) {=0A= return node.getAttribute('style').value;=0A= }else {=0A= return node.getAttribute('style');=0A= }=0A= }=0A= =0A= =0A= /*=0A= * showProps()=0A= *=0A= * Displays all the properties for a given element=0A= */=0A= function showProps(o) {=0A= s=3D""; for (p in o) {=0A= s+=3Dp+": "+o[p]+"\n
";=0A= }=0A= document.write(s);=0A= }=0A= =0A= =0A= =0A= function setIFrameEvent(iframe, eventName, func)=0A= {=0A= if (document.all) {=0A= eval('getIFrameDocument(iframe).on' + eventName + ' =3D func;');=0A= } else {=0A= iframe.contentWindow.addEventListener(eventName, func, true);=0A= }=0A= }=0A= =0A= function setIFrameBody(iframe, strStyle, innerHtml) =0A= {=0A= if (!innerHtml) innerHtml =3D '';=0A= if (innerHtml =3D=3D '' && Detect.IE()) {=0A= innerHtml =3D '
';=0A= }=0A= var doc =3D getIFrameDocument(iframe);=0A= doc.open();=0A= doc.write(''=0A= + innerHtml + '');=0A= doc.close();=0A= }=0A= =0A= =0A= function getIFrameDocument(iframe)=0A= {=0A= if (Detect.IE()) {=0A= return iframe.document;=0A= } else {=0A= return iframe.contentDocument;=0A= }=0A= }=0A= =0A= function getIFrame(strId)=0A= {=0A= if (Detect.IE()) {=0A= return document.frames[strId];=0A= } else {=0A= return document.getElementById(strId);=0A= }=0A= }=0A= =0A= =0A= function createElementandAppend(nodeName, strId, appendTo) {=0A= var el =3D document.createElement(nodeName);=0A= el.setAttribute("id", strId);=0A= if (appendTo) {=0A= appendTo.appendChild(el); =0A= } else {=0A= document.body.appendChild(el); =0A= }=0A= return el; =0A= }=0A= =0A= function createElementandInsertBefore(nodeName, strId, appendTo, = sibling) {=0A= var el =3D document.createElement(nodeName);=0A= el.setAttribute("id", strId);=0A= if (appendTo) {=0A= appendTo.insertBefore(el, sibling); =0A= } else {=0A= document.body.insertBefore(el, sibling); =0A= }=0A= return el; =0A= }=0A= =0A= =0A= /**=0A= * getXY()=0A= *=0A= * Returns the position of any element as an object.=0A= *=0A= * Typical usage:=0A= * var pos =3D getXY(object);=0A= * alert(pos.x + " " +pos.y);=0A= */=0A= function getXY(el) {=0A= var x =3D el.offsetLeft;=0A= var y =3D el.offsetTop;=0A= if (el.offsetParent !=3D null) {=0A= var pos =3D getXY(el.offsetParent);=0A= x +=3D pos.x;=0A= y +=3D pos.y;=0A= }=0A= return {x: x, y: y}=0A= }=0A= =0A= // The following 3 functions are taken from common.js=0A= function hasClass(el, cl) {=0A= if (el =3D=3D null || el.className =3D=3D null) return false;=0A= var classes =3D el.className.split(" ");=0A= for (var i =3D 0; i < classes.length; i++) {=0A= if (classes[i] =3D=3D cl) {=0A= return true;=0A= }=0A= }=0A= return false;=0A= }=0A= =0A= // Add a class to element=0A= function addClass(el, cl) {=0A= if (hasClass(el, cl)) return;=0A= el.className +=3D " " + cl;=0A= } =0A= =0A= // Remove a class from an element=0A= function removeClass(el, cl) {=0A= if (el.className =3D=3D null) return;=0A= var classes =3D el.className.split(" ");=0A= var result =3D [];=0A= var changed =3D false;=0A= for (var i =3D 0; i < classes.length; i++) {=0A= if (classes[i] !=3D cl) {=0A= if (classes[i]) { result.push(classes[i]); }=0A= } else {=0A= changed =3D true;=0A= } =0A= } =0A= if (changed) { el.className =3D result.join(" "); }=0A= } =0A= =0A= function toggleClass(el, cl) {=0A= if (hasClass(el, cl)) {=0A= removeClass(el, cl);=0A= } else {=0A= addClass(el, cl);=0A= }=0A= }=0A= =0A= =0A= /* Constants for node types, since IE doesn't support Node.TEXT_NODE */=0A= var TEXT_NODE =3D 3;=0A= var ELEMENT_NODE =3D 1;=0A= =0A= =0A= ------=_NextPart_000_0087_01C839B2.B904A370 Content-Type: multipart/alternative; boundary="----=_NextPart_001_00A2_01C839B2.B90DCB30" ------=_NextPart_001_00A2_01C839B2.B90DCB30 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable Content-Location: http://afludiary.blogspot.com/2007/04/statins-revisited.html =EF=BB=BF Avian Flu Diary: = Statins Revisited