From: Subject: Peter Zura's 271 Patent Blog: Hell Hath No Fury - Attack Launched on USPTO Continuation Rule Changes Date: Mon, 2 Jul 2007 03:30:47 -0400 MIME-Version: 1.0 Content-Type: multipart/related; type="multipart/alternative"; boundary="----=_NextPart_000_0000_01C7BC59.61AA2400" X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.3138 This is a multi-part message in MIME format. ------=_NextPart_000_0000_01C7BC59.61AA2400 Content-Type: image/png Content-Transfer-Encoding: base64 Content-Location: http://img2.imagepile.net/images/ycc2106/61822091.png iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAACXBIWXMAAAsTAAALEwEAmpwYAAAC 61BMVEX//////8z//5n//2b//zP//wD/zP//zMz/zJn/zGb/zDP/zAD/mf//mcz/mZn/mWb/mTP/ mQD/Zv//Zsz/Zpn/Zmb/ZjP/ZgD/M///M8z/M5n/M2b/MzP/MwD/AP//AMz/AJn/AGb/ADP/AADM ///M/8zM/5nM/2bM/zPM/wDMzP/MzMzMzJnMzGbMzDPMzADMmf/MmczMmZnMmWbMmTPMmQDMZv/M ZszMZpnMZmbMZjPMZgDMM//MM8zMM5nMM2bMMzPMMwDMAP/MAMzMAJnMAGbMADPMAACZ//+Z/8yZ /5mZ/2aZ/zOZ/wCZzP+ZzMyZzJmZzGaZzDOZzACZmf+ZmcyZmZmZmWaZmTOZmQCZZv+ZZsyZZpmZ ZmaZZjOZZgCZM/+ZM8yZM5mZM2aZMzOZMwCZAP+ZAMyZAJmZAGaZADOZAABm//9m/8xm/5lm/2Zm /zNm/wBmzP9mzMxmzJlmzGZmzDNmzABmmf9mmcxmmZlmmWZmmTNmmQBmZv9mZsxmZplmZmZmZjNm ZgBmM/9mM8xmM5lmM2ZmMzNmMwBmAP9mAMxmAJlmAGZmADNmAAAz//8z/8wz/5kz/2Yz/zMz/wAz zP8zzMwzzJkzzGYzzDMzzAAzmf8zmcwzmZkzmWYzmTMzmQAzZv8zZswzZpkzZmYzZjMzZgAzM/8z M8wzM5kzM2YzMzMzMwAzAP8zAMwzAJkzAGYzADMzAAAA//8A/8wA/5kA/2YA/zMA/wAAzP8AzMwA zJkAzGYAzDMAzAAAmf8AmcwAmZkAmWYAmTMAmQAAZv8AZswAZpkAZmYAZjMAZgAAM/8AM8wAM5kA M2YAMzMAMwAAAP8AAMwAAJkAAGYAADPuAADdAAC7AACqAACIAAB3AABVAABEAAAiAAARAAAA7gAA 3QAAuwAAqgAAiAAAdwAAVQAARAAAIgAAEQAAAO4AAN0AALsAAKoAAIgAAHcAAFUAAEQAACIAABHu 7u7d3d27u7uqqqq21F1bAAAAZ0lEQVR4nISOwQ3AMAgDs0/38f5LgHjWNqRNX7WUYC7IZK1RSbAF VMt2XzCIwIaBKvapIkDHicgEDdRfUBJlwJ4gW1j95AiFPHsMPHCAHOCPaUk16FNMfUF8gTTf6CU/ ugEAAP//AwCl1lw0VD6OgQAAAABJRU5ErkJggg== ------=_NextPart_000_0000_01C7BC59.61AA2400 Content-Type: image/png Content-Transfer-Encoding: base64 Content-Location: http://img2.imagepile.net/images/ycc2106/65682475.png iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAz0lEQVQYle2RwWrDMBBEnzaysE0c kQ/o//9YLsnJzSEiRNb0oNZQEosWeuzA8kArDTOIUiRJWpbKx6PydquMUYLtMecAYIsSTflSCs7B soD3lbtdJYCZYdYwsM+t9/Wg674zZyilYZBzXhN0Hdzv0PeVIUAIfjV/JSe9bvlVZRwhpUaClNJT gnGE6xWOR5imHnC/T7Be2H5b9zFGScLMyDkTQiClxDQduFzOnE7vb/v9oVECBMjMBMh7L0DDMAjQ PM9RElvT+OGf6d/gDww+AOD5jhc8aGxOAAAAFHRFWHRDb21tZW50AGJ5IFRveVZpZXdlci+OzbYA AAAASUVORK5CYII= ------=_NextPart_000_0000_01C7BC59.61AA2400 Content-Type: image/png Content-Transfer-Encoding: base64 Content-Location: http://img2.imagepile.net/images/ycc2106/35814433.png iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAADAFBMVEUA/f48tUQtt0A8tURHuUo8 tUQ8tUQ8tURNsUE8tURDuFA8tURPrVU8tURWtko8tUTMLiL/9vb/+vj//P/5/f/////y///////k 9v/////r//7////79ff+/+P2+us3W9bOJgD////0//NihKlvrO8OKssENrETMcUkOrEaJY9+nunl 9v3u///2/f/4//8Va9LREAf+/+Pu7v8AE1YcOIzt///o///8//Pp//+Jj9kTM7ooJovB9f/7/+D+ //gZX9vSKA/+/+P3//MVH4DN3PP5+//4/f//9O36/u/3//vq+f8PEp9lhdjn+P/+/+MfVvfNKgD8 /ff1//ElM7b7+v8xN7H3//H+//bw//f5///3//98j8cXO5N6pNb1+/8iYNnLFA79/+n3/+3S5//7 ///E2+Px///0////+v738f///Pr4+/QcOLVCbtv3//8bXtHdGBL/+Nn0/+r//f/+/f///fr//P// 9///9//+//T//fj/+PocWrEmW8vu//0UYeHWIC//+fv9/+n8//b7//7/9fr+//j//P/y/P3/+v// 8Pb9/+kcSbAibrnt//8nU9bHIwD/+vzK0/L+//TK6vn/9PTo//bw///////+//T//f3/9f8AIpZv munz//8hWOjSJBn9/+mGj9D//P8VKqr/9//Czv74/+H/+//4/+bu//bT2fkAJb2Bmd/1/+sdaOfO FBn/+fOjqc3K0tTQ5f///P///P///P3+///+/+O81/8jNZkgLsX4//////8gXMrWHw3/8/+qtsIp MHSv0vrJ1//v//P8///n+f/d6/8LFqRGdMrg5vzt//b+//QVY8/RHx3/+Obk9va/3vAdQrQxYLgW P78aMsYTLKBaaK9Xc7zX8v/2/f/4///v//8VXPbbJRr/8fn/+P//9v/2+v3w8Pj////h3+z////7 ///////+/+P/////////8v8vW9jcGgA8tUQ8tURMtDs8tURQuD08tURNtVI8tURVszk8tURNs0U8 tURItjk8tUQHY+iZWEohAAAAAXRSTlMBN+Ho8AAAARtJREFUeJwBEAHv/gD/Dv0M+wr5CPcG9QTz AvEBAO8e7RzrGukY5xblFOMS4RAA3y7dLNsq2SjXJtUk0yLRIADPPs08yzrJOMc2xTTDMsEwAL9O vUy7SrlIt0a1RLNCsUAAr16tXKtaqVinVqVUo1KhUACfbp1sm2qZaJdmlWSTYpFgAI9+jXyLeol4 h3aFdINygXAAf459jHuKeYh3hnWEc4JxgABvnm2ca5ppmGeWZZRjkmGQAF+uXaxbqlmoV6ZVpFOi UaAAT75NvEu6SbhHtkW0Q7JBsAA/zj3MO8o5yDfGNcQzwjHAAC/eLdwr2inYJ9Yl1CPSIdAAH+4d 7BvqGegX5hXkE+IR4AAP/g38C/oJ+Af2BfQD8gHw1z1/gjPR670AAAAASUVORK5CYII= ------=_NextPart_000_0000_01C7BC59.61AA2400 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: http://img2.imagepile.net/images/ycc2106/16304077.gif R0lGODlhEgASAPcAAP///+jo6MrKyoODg6SkpKWlpYKCgszMzIqKinZ2dn19fXR0dPf394WFhZSU lJycnH9/f4aGhv39/VhYWG9vb8fHx6ampqurq5CQkIuLi4eHh66uru3t7cnJyXx8fIiIiPr6+ldX V8jIyGZmZv7+/v+CU729vfn5+ZGRkbGxsf+NZP+/p83NzS8vL+fn5//l3Ht7e9PT0/Hx8fz8/JOT k35+fsDAwJmZmf+JYmFhYdvb3P+JZM/Pz+/v73Nzc/9nL+Dg4P+JXcXFxWlpaf+piJqampeXl5ub m6Ghoerq6uHh4by8vLu7u+vr6zc3N21tbXh4eP8dAGRkZKCgoP+CWUdHR//m3bOzszg4OFZWVlRU VOnp6aenp56enl9fX1NTU1paWv/Swf/6+f/OvYSEhO7u7piYmEBAQNbW1jMzM46Ojnd3d8bGxnBw cFtbW/++p//+/l1dXU9PT2JiYsPDw93d3Xl5edzc3HV1dZ+fn5aWlmpqav8hAKqqqtLS0uPj4+Tk 5P/Uw//RwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAASABIA AAj5AAEIHDgQUAMLdVKEgCGDoEMACKAcSYCFg4INDweCoBBAYAI9XipkFBhjwcAeSAQ8PGGCxoA4 choU4eGwSQ0KHp4kuOAnQIAOXXy0GbAHxQwyDxaA0THSxpk+Hwh4MLCABIAVOF4IDEQlDIAAcww4 YNICCAAxP/gQEVgiShCBBJwoASBFIJw3KqwIFLRjjEABGQSuOTCSoJE8AoVMKAOAgRkRW1xcKSAQ zYQkAx+EYANAAAQ7eAbcAcDlC2GCLEa4KdDhgIAKN6oo+JMxh5YpHxBowGAhDYKMBLI4cChBwZAl xA0UwOCQQYQLgQmCiLBBjUMOEOhoGBgQADs= ------=_NextPart_000_0000_01C7BC59.61AA2400 Content-Type: image/jpeg Content-Transfer-Encoding: base64 Content-Location: http://photos1.blogger.com/x/blogger2/2788/836/271/z/519735/gse_multipart30385.jpg /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEP ERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAARCADfAQ8DASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwC9RRRX 6mcQUUUUAFFFQ3l5a2UPnXl1BbR5C75pAi59MmhtLVgTUVm/8JBoP/Qc0v8A8DI/8aQ+IdABAOua Xk9P9Mj/AMaj2sO6HZmnRTIJop4UmglSWJxuV0YMrD1BHWn1YgooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAooooAKKKKACg0UGgAooooAKKKKACuQ+LHh2/8AE/hmLTdPWBpVvI5m Er7V2gNnn8a6+is61KNaDpy2Y07M8c+J3hnw9YeMfBVrZaLY28F3fMlxHHFhZV3R8N6jk/nSfE74 f21teXeuabpOnW2kWujzeZGnynz8PtYL3IynPtWx8Xf+R78Af9hFv/Q4q6r4mf8AJPPEH/XhL/Kv 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 ------=_NextPart_000_0000_01C7BC59.61AA2400 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: http://www.toprankblog.com/tools/graphics//feed-icon.gif R0lGODlhEAAQAOYAAPSRNut/MvqcOfudOviZOfz18P/58+6FNOh5MeZ/M/aUN/KNNeZ0L+mFNfCJ NO6FM/748uNuLv7y5tpeKud4L+yKNuF4MeyBMuBqLep9MeN5MuN5MfmdQeiDNN5lLP3x5t5vL99x MNxhK/3ateF0MOuJNeiFNf738uV0LuJ2MeeBM95wMOV8MuiCNPzChOqHNd1uL+R7MuV9MumINvqs XvrOp/ivae6RTPSmZ+6aZPnIm+l+OfS9mPieRO+NQe6rif7s2vmlUu6ylfG3l/u5d+B1RfOkZ++d ZPSsc/zZtfetaf3fwf7x5vKjZuaLYPi/jvabRPKTQvSygPupUvqiRv7mzvfDmfi0deyWY/ehUOiJ VffUvvWpaPzjzfrDj+qJSfXAmPW/mf3lzfmfRfvm2PnXv+JwNvq+g/uvXuR8R/qzavrTs/eXOPma OfWSN/GLNeqwh////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5 BAAAAAAALAAAAAAQABAAAAfpgAVwFhsxMgkqHQ0vJRUzcII7KBQZFw8OCwAKbG0CHIMoXzxgTZia nAIDBCYbFEdxsBA6UKiqbg0xGTdWax+wBkSpBG5vLTKWpjZAsC7DbwcJCQ84EF1ePW0jsFfPASwq DlywcQZoA0lxED4BCBodmVlnEuQ0br5hCAwpDadtVNpMoiCJc4JBBBIvNi2p4mLMPCkBTsTRgiFE CTZqYIlx8yROGQRb4vzwAKJCmykG4tR4YyQOGQZD4ggRAWNGqiBKuuXAEiGNkyITVsDh4OwAO4MY PIiYYAYSHBMNWiRgoSEFiRAgYAgtEAgAOw== ------=_NextPart_000_0000_01C7BC59.61AA2400 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: http://www.google.com/webmasters/add-to-google-plus.gif R0lGODlhaAARAMQfAIaGhtfX2NdIMUdRR16xY+bn6KPP/86yqyVRscqqGk102ZWmzNzEXvb19S4u LunboHGKvxhL3+F+bsPK2enFv05tsvno4NXs1w0mmmNjY5ycnAAAAAAAmQAzzP///////yH5BAEA AB8ALAAAAABoABEAAAX/4KeNZGmeaKqubOuun6h5dG3feK7vfO//upGI1ikaj0egcsls3jSZWUdB VUSuWCyG4+zSGguEWLEIeC8EwoUHlSqOmDgGzrUdHDkAwFbAMwsQFRMBARoIEA1daAQBiUFRHlNw HgZzRls3GQAzN3p8GzYNGT6BhI4LBQVeaao7bZFvHXKUckWYNRMZEwM1ABsOG3sBA7+gNcQbM74O Ga0eBQhlN44SAhISFDQPCQwMDzQTCAoVCAWsDdXXT5AdEbY4lrc0GmYOiXdmmh4DwsY0AcbweWCG K5qjG9cKHBAgwMI2CwESJHgwQUGBBRgGsZJwwEK1CTZetbNlwAClkvHq/9AAtiGZB30e9EwwVsDf M2OePNzBVQERDgsCDpihYK1bIw/cIEAw07NBGqLXDhQ4Oo+dO1lxaMWxpXIXDQCjYMr0U/MTDZgT /NAgB9JDAKUIAlxzZE2iIwYJ2DaIZo4AhYQBnFWVcvVdJTo1YNYsoMHeSwB9+vFxoKpxAVF7Chq8 LEaugGxED2xj4MFCggMVyZVxSqBAtQM5RBbGuvVSnZoHHexBRvBAS2BmagDb3ZLXjQkVMIhBUAFA I4YMKTTCK5FBgIrKIaQiMIAAUIbYQrKTQ758HJVemjQoMGhQ4H+EqE4lVKDn9QoLPFyg3yA+VQ+v eMDBgAQWWGB6CDoRzjp70AjmShScJCjhhOAwR8MCFQTHBhQyvODhhyCGqMcII7aQQQwfZKDiiiy2 6OKLMMYo44w01hhjDCEAADs= ------=_NextPart_000_0000_01C7BC59.61AA2400 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif R0lGODlhWwARANUAAAAAmd/f3/wZIYmJibS0tF5eXkpz7f1aYAAzzFRUVKPP//w8Q/6fov///w0m mqmpqfx2e/7FyA9C23R0dP/w8fwrMv6NkdTU1Clc5v/l5v7X2P6xs/1uc/1KUczMzJmZmfT09P1/ g2ZmZn5+furq6v9mZhgypf/29v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAUUACgALAAAAABbABEAAAb/wI9w SCwaj8ikcslkoj6NqHRKrVqv2Kx2m/2IoIiweEwGcM/oNNcLNrgNmLhkTneY1fh8mt1AGMYOgQ6A d3olhxAQFhRnJ4yMWBQZk1EZAgIbU3x+gA0Kg2J2UwQJE1EXCSOoBSANHgkPUREclx2MDCUHHQcR UhkavxkWFQIhURoRERlRFB2XlxWMl8tSm38Igp6CYaJSDwkJBA0TqQ0fCR8gBaZTGpe9FMQLEAwa Gg0WlxCyAg0UC88EMGhwKVODDMQsdaCyCQO3KqC6RfmWoMC5ciBEJBiQIEAVBtM2CLDg79KBKBAE WrDQYaGAClJEOjNYaaSAfZq+9HGITYEC7E8+IxZq8I0junKuwEGxEuJZrwYaKlTAmZLDgRILOkQQ 8DSKAIALpRzgWoFmlE0SuAXSFojb0G8XRogAgXRcglZX3kmpcFUAo4RRmubDlAzgCZE3ORDLRJKh TgRpQ2kjNAUuCQ8N6o5IkIUYM4CZBHCI0KFCiGQhOGzIwGFXy3tQORwKsQxkCcdgIqttG+ptggtS NHNmSuxlBwYhFm29eQKLI0iRONzrd/axCUHYs0tsQAK4lAskpATwaCWZ+WR68mwCwL69+/fp48vH Pb++/TVfmujfz7+/fhEoiCDggAQWaOCBCCao4IIMMhgEADs= ------=_NextPart_000_0000_01C7BC59.61AA2400 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: http://www.bloglines.com/images/sub_modern9.gif R0lGODlhTAARAPcAAOXl5fONAPGFAP6oAOmya/qaAP2XAPmVAPyWAP78+PKSDuhyAeNhCONiAv3/ /+ViCfiPAPCAC/aQAPaTAPygAOh0C/WUDvWXDfGOHe+hS/KMGPTHgP6nAPnZrPOXC/iiCuh1DOyr Qvv37v/77/ny4vv07N5cDfC5cPqWAP+oAPGoQveqMO+UFuujOvOqRu+HCOhtAOaQGt99Gfrz5+t+ DPXhwPmbFP2jAOt6AO/GfvefEPCYFvaDAPjv2vueGPGeSf79+O2eIuuPA/CNDvqbAP2nAPCFAPvJ Z/aVDPvbqPr7/P2mAPz7+fOUBvexL/369/6kAO+ZDel3A/747O+0S+RxCfCiY/O2ZPqlJuBfDe6G DPqoCvfkx+yoZeqFDO17APyjAOp9Be6uR/3v0eWZO/mmE/vJaPC3bOp1CPidFOugQ+pzAfqmDf/7 9fqIAPSKBvOtRvapLe+OHOd1Gu2CC/6YAPmZAPOTD/mLAPv27PeNAOZtDPudAPWaEOx+B/qOAP7x 2Pn9///99ul1COPj48zMzGZmZv///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAABMABEA AAj/AA8ZGkiwoMGDCBMqXMgw4SEAhg5JnEixosWLGDNq3GjRUCGIEkEskOJHy5A7fXSU4ciypcuO HyNWqNIlgxwBeuxQgJJiy8ufQDF6BDlIhpJDTzqsKHBjyQA2FwtOHEho48CpQWGCpBFGzQkuh4Ac AVOEwwehhAhFPKS2qlW3bLNSHBqRjpczcKJQyXPIjAEEE9AKdGuI8FqBVwcjlkhw7uHFUWMeehEj 0KExToLMaIPFTQChBAlXLax2cFvFikmvjVjaNNy5khU0cbHBgaA4IQ4l4WEEbdrVo4MXTi2aOGKq jDPSPWQBD5ILYpgAElIjgQYcgo0PL7w9OGPv3dPCkn0MGyQEFiRGeMhxSAWBQz9gRC2YFjLV0cgT d7evn3RkkCjs0MMUNrQgwhVklGBFAxiJV59EDz7I1nBsuWUhhBZG+Fp5EfFRRxo+/PEGBhGsMccD Wcg1lX8qCiXZIUQcIEEAAnyBxh4MmNDiRBLuWNFyPgaZFV0NFWnkkUgSVIhEhTTp5JNQRinllFRW aaWUhwQEADs= ------=_NextPart_000_0000_01C7BC59.61AA2400 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: http://www.newsgator.com/images/ngsub1.gif R0lGODlhWwARAOYAAP///5mZmWZmZimLNjiKWYmJiWSWQf+ZAOHh4YuwcTt7jUJ9j7HKoPX486en p9jlz8XXt9PT0/Dw8OLr2+Lo6Pj4+Ozy55CQkDaLQp6+ienp6bvRrJiYmOno6pK6rnejWYGqZbW1 tajElMTExFaWaW6dTZ+fn/+xPfDu6f+dC/+jGvr6+tra2v/nw/39/f/15svLy//68f+nIv/rzv+i F66urv/dqv/v1v+nJP+gEf+fD//htf/QiTuJUv7+/kCFUJW3ff/frv+qKdLS0v/Fb/++W7Ozs/v7 +//bpZKzrP/Zn1qacL29vb6+vv/jue3t7cDAwK2trf+pJv+kG/T17P+cB//oxv/Jd+7w7v/Uk+7u 7v+fEM7ew/+4Tv/26Li4uP/Tkf/z4Kmpqf+/Xv/Gcf/t0gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5 BAAAAAAALAAAAABbABEAAAf/gAGCg4SFhoeIiYqLjIwAAQCRkpOUlZaXmJmam5kBApADoaKjpAqX PlBiQ5ysra6PnwADSR61JCRLGLoYPxgEppZaRis1Lq/HyJOeoB6jBM8EzguXR1FfTcnZAA8Qrcuy zaIEFFTR4sCWK0/GlhoakwgSrhMPkxMTkQwJkg0PDZIW8En6NiAcNAodoIUiMI3SCyVEbgDYcSVI jEkhChQwAUDDBY0hABRAIBIBggISPhZw0CCBAQMfLDQA8TImg5cMILw0AOHBy30DYw0gsbADCgoo jJpjSAlMigMHWgDgAVWFk0gaRqaMwCGEBAcFspIceXLEhXcANpSQCSJDBhAN/2Zm0AeggQEGAHTq 3ECJINEB4xB2oEBhKbpIVQ7gODEDAJITKg6ciHQykoMRBWqsZCFhZMmTFcByiABERL4ECfAC0EfX p6S7BioRxLDw2WCFgBtKonFARhhJVrYc6EK5gGWzDhBUuACjAIsKZI0DkMCkgIgP/0QkyLCvZep9 FgzUm2BgQ+y+QmmLw1JYGqUxUKW8ANBCB9QsxY9H2HjBRIUQF3BQAAccOBCBAw4QaEEJH9CUwAQM fmBAAj6BAEEGExqQgWvogaJebc84cxgANzx1gBA25AAVDhcBUAFJHckjAQwRVBBJBDXiWIEEJilX FwQbcAeABRtAEBAA9FiAJF4DXNRVT4ey9ADNlFQyRYkNJkJ1wBSNaUPJBgyIUEI32hCkwAJnponm mmlaUkYRvMlAhhdeVrIBamSWGUudfPa5yTKNBCrooIQGKgAAAiSq6KKMNuroo5BGKumkkwYCADs= ------=_NextPart_000_0000_01C7BC59.61AA2400 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: http://sc.msn.com/44/G,UCH%7BZBSS3%7BOS%7BSE469LG.gif R0lGODlhRwAOANUAAEyYxTh7pDuKu/BLHkF1lYjmhkCErI+qrmbMZvKJMGeu1G213VmjzVqZu9mM VDpjgmKyW460xNCpkkiKsHi01OjATHO74WGhoGiYtyuPRk6IqcjOt3mpwlCPs6rDxGSnzESTwvnE HP///1+ewEJ+olaTtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAABHAA4AQAb/QIRw SERAjsWkcslsOoWAKKDjyWQejlCi0gGQRCSAweAVgctn6Tc8RrNJD3M8TDCHJ49C4UEGCBUcEQYB ARgSCQOJAxIMHWYiGiMaj3UiBJUNCgqOZpGTZpUEHR0Nn5CTHZoNepmaQgKwsbAGsxgTsri5uru8 vblCCxQeERwfCh8eiIkHmiMjCgvRCs4fzs3P0tbRC9PP0yXgI9XYx9Db5wtCDAwAEYIP8AnKGAyT cY/3GpxmHev1IvfkgHpk50tASB30KCzQTwiIhw8NHDiyQUKFDQZABBARAKJGMx03cvS4sSNEkZUo lXy4EoQAQgIgCrFwzoJNBREkDHDAwabPxp9AgwodSrSohT8ROgTQ4IGDBweKFn1o0Amagk9fRDSg qjUaVw1WP5Uw1akq1QbStppLh+ADA2IdBmGRt2zEBIIHNWS1w+DYXXx4QWko8Q+wBgYlCOghQPiD unUdIly48oCuA8IGwGQlkZVMKAD+MnMuSDrwaDMGJizUM4EBFCkgShQ4UiFEiAoTAJSUohtkb468 d0tBOSjAvTgBAICok1yMnj5+EOSSeICERAIYZuWCCYu7LFq4CBUnwB28dl5P0qtfz15IEAA7 ------=_NextPart_000_0000_01C7BC59.61AA2400 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: http://myfeeds.aolcdn.com/vis/myaol_cta1.gif R0lGODlhPwAOAMQAAGabzkqFwnyp1tLn+Dd0uJO84a3R77/b8ihts6LH6R5hrARPoYOx293w/pCg qsfm/dju/uz2/NPr/c3p/b/j/eDx/rjg/bHd/PxnA4Cmx+Ly/v///wAAAAAAAAAAAAAAACwAAAAA PwAOAAAF/2AmjmRpnmiqplrrvnAsz3Qdi7Cj73xk/0Aa7uXAGI9HX3C5FFWez6Jxs0FGoJWFYlCZ KBaVwOJwUASgh/NT8EUUKmys/Clq2O1SDNV6b2gBBwBaDQYKAAULBneCCQ0Cf18Jgn2UdiIQmJhF VJxVGBGZEAsICAGkC5gEpASZAwsLrAgKmK4BgqG4mCISvLybnZ4RvRILAAijgryICwW9j8QGCwG9 BATJw9gSIhPc3Hl7Sd0TxeMTgt2k4l9fAQoKBxMJ0ufi9RMiD/n5355GEfoPiukTpC9AAH2PDh57 9OqVpIYADADUJ4KCRYt5kPi7SKHYRUEXDV40EMBiggAXCjhUI5CAggBSCAAw4HhRhIWbNzNqjICz p8+fQIMKxSniglGjEZIqXRrhqNOnUKNKnXp0hdWrWLGGAAA7 ------=_NextPart_000_0000_01C7BC59.61AA2400 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: http://www.pluck.com/images/rss-pluck.gif R0lGODlhWwARAOYAAABCmefo6OLl5v///8nKywUFBhYWFg+a26P2/wgICA0NDZqdnUq57dzg4VVV VcPFxh0eHqirq4KEhJGSkr3AwaWmps3P0RsbHCIjI9LX2AMEBImLjCmt5s/Z3HFyck5RUtPd4C4w MGlrbCEiIgsLCzQ2Nri5uiMkJTs8PLS6vEpLSx8gICUmJjIzM6qusCcnJ6u0txgaGlBUVW5yc6Oq rbS3uOLi4pWZmg8PD2xsbIeIiZuho8THyMTN0MPJyxEREVBRUaCjpEJERNDT1NXa23J0dYWGiHp+ gKSnqUdISUVHSH2BgrG0tFVZWnV3d2hpaVJTU29vcNjc3ZKXmXp8fWBjZDY2Nz9BQRAQEGJlZxMT FImPkc7S0wEBAfT09CkqKlpbWyssLGttbuTn6MjR1AICAtbg47vExszW2Obm5hhupb7Hye/y87nB xHZ5eV5fYA0ODunp6eTp6+vu8PDz9A1imvX19dfh5N/k5QCLzPDw8Ovr67W9wJGhpfn5+QAAACH5 BAAAAAAALAAAAABbABEAAAf/gHyCg4SFhoeIiYqLjI18en6RkpOUlZaXmJmam5mCfnmgoaKjAJym p6imnnkMrQwcsAeys3WllBNCKkBPEw9pXpIPUBWpmTZOHjbFkXwWnwyiddJ10baTDn8GLxc/BSE5 EQF+C39Ry5cEKzgE5xYWdqzRAwjUobV2+PkOBTp7BBUeUED44yBOhT8e8ilcyLAhPgIsDBBg6MXh QgsP6MTLM23eNFC16IgcuW/DSDpseFxIQMEFwpFEKhA4KdKEBC4nBQyhUGHChiBjCJyQOJKJkQUC aCoV+QDGnDwcQA6YSrVerTlYs0IpYCRr1hIkakQol3VKghxesT75swCrCxFK/74o6PIn2wMCGAw8 mLNHR4I/VASkHYwVRh85UEEiQDBvsVUAciJLBlJAguTIPi4UqIHkjxjJETQAuRxZRIIgUopg+RPj SpYNN8Io4OMjLw85RwpAuEG69+U+ffDkOQBSmkdpIAHgWc78Q2U8PJBQEYLhT5IMN/6IYD7EQIsG zJfPIBGhxh8UEShkYL7DSQYKIyAEqZJghYQFOhYQCc+fOfA7w8lDTzV3FGjgB11cEMIIWrAmwxY9 3LHFH1UYCEIJMbRh4B1kqJAADS6JsKGBZtyRwgkJnFCXAiMooMEPTUQ44oj/BWjPR/YAMOMHf6yg xAcz7LBGBwbu8EcIMHTQAfEIMmgwQw9n0LBECAUUQAMfWsDRxBQw+IDGkiCYyEJdGmCAggxFZKHA H0cQOaOBwAmnxjR01llLf0n84YYU4PWXwT4JGIBBChusSAIJChjwQxkLNMCEEApggQMOF7ywQgkp UDCQAy5wQQR4DSyhwR8Q9BcecALkAcCqrLbqagCwxlpECwvEamusQ0iAwggvmJABGCyc0MIbExAg QQnhBGCDCRPkoIIVLEBghQkWqHAFAbcG0MAGLbwgwLfghgvcHuSWa+656Kar7rrstutuu8DpIe+8 9NZr77345qvvvvzuC9y/AAcs8MAEF2zwwQgnDFwgADs= ------=_NextPart_000_0000_01C7BC59.61AA2400 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: http://www.toprankblog.com/tools/graphics//addkinja.gif R0lGODlhWwARANUAAERERBgYGAICAve+CzU1NVNTU93d3fX19ZqamiMjI4iIiO3t7aqqqHR0dPn5 +f39/by8vIODg9jY2PzEDuTk5P/JD319ff7ief/REbKTNrGxsbSyrJKKcZeBOtqrEZGRkf7QOv7S J8apSv7VTa6LHpSJaJ+aj8OhMdPS0ffZaY6EZ6KdjP7rlIx2NWBgYKJ+CpqHS5eQefnGJti8Y8XF xX1kGOW1I7WeU2ZmZszMzP///wAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAABbABEAAAb/wJxw SCwaj8ikcslk6nK6qHRKrVqv2Kx2m8UJueCweMz1QsloKoXDNjEMabI5PjbkDIuNKBQaTDAkZxQf ElIOCB8OVgsRGmFzYQhTklJwWBIdJxkdLRcgIAN+AzGKEAKUOgcFBQdWBgQRj19VCgA4CzoMAAq1 TwU4BFIIAQC5trhRJjOgAxUeGSwsIxMVHRRRphoSAQ0PLqwfCQUBAZKvEQ8M5OQKV5BTDJIICgsA CwgIxQB2AVPFCwTuNZCi4sKIUBMGvMiQQYQHEhukmEJQIIEBBwAIHFAgAFYAAg+2NXBgYZWuflbe SVEgiZeBAjoMGNCHK4G/mDBz4JDyoOCFxT4vbGDAUMEZAyk0BCiNdSDjRgGOKh4wkKDBAQvkMtpM OWtKDgIACgxUQGBVMQZgt0ZpUKwBAQJnoqDgUAJGjRMHEVaAgcyUAhwBLjrlGDXB1AQWJAhYtaAB yioq6Wx54MABhBsXQoUChAKbAAYUBOB48PZAhM86AAQ4nFhAggQuBDymElkyGD0pUsiY0OLalQdY FlgQMDBVqy5dbYc5sGHFihgl4o7J4Vq6ltrKs2ufgn27d9vdv4tH4yVKk/Po06t3oiMIADs= ------=_NextPart_000_0000_01C7BC59.61AA2400 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: http://static.technorati.com/pix/fave/tech-fav-5.gif R0lGODlhWwARALMAALe3t87OzlKvI/D17aLRiYjHaOHw2I2NjWJiYjuwAGZmZgAAAJmZmf///wAA AAAAACH5BAAAAAAALAAAAABbABEAAAT/kMlJq7046815Y00ojmRpnmiqrimjgA0hJHRtCwSr77zu ggSbUJjrmQIBYw9p+jVmw6igtKhaWVUlaxDKlpzRUJgEAFTL2IVWtTiEmN9XYzymqkOHs8jcblQR bVwICAeDXA2FCAAhg4QGgAuLAZAIfnckYDYlQideeYORDWaEblZVbpB/iAuQi4CKBgd5kQOfpZcj mTWbmiZerF2VgCO/asV+lciWVG5+zV6YcnRDnXemwNDLy8d9yl6TVs/PuCK6vXUkv4rEuNzWxs+V XoBc3fbkIU5QUUJTvneADpRJkkdgEndd1AACUFDbwobIDuL7ICcIPyEFqoUYkKoZJW1ZNI5xPJXw zZ9un7RFg1Fgn5SMa2LKXDmzpk0WPzro3Mmzp04FDRQIHUq0qNGjSJMqXcqUaQQAOw== ------=_NextPart_000_0000_01C7BC59.61AA2400 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: http://plusmo.com/res/graphics/fbplusmo.gif R0lGODlhYQATAPf/AI9wcZe7y4vBj/H6/uHi4pGSkZmor7W8wWyClYiJiUeo0WdnaBNO0v3+/ksv MXNPUNzc3G2Wrdrz/dKzty5MWzCj0lh6iI2RcHO5/bXb7C81Mtbk6lhVVefs+IPG4qjY7K6Yl+Ly /T2ZwPn5+bXj9Zas56Giob69v+n1/IjW+jRUyMvMy0+Xt3uPZ9DQ0EJDRFRncombqXN0dK+vr0tj LJO/3Zukm8PExPHy8WqL0kxvz1iz2bKyslKF08XN0pbb+Ojo6LrAxe/+/7bd/vb29qqzts3Q1Jyb nH+Af9/g33K83LnI01KW63XD5ZDM5Ky3l9vu9qG57hCB+8Dm9mZtcpjU7fj+/zOE811DRGe216fg 9yY/SO3t7abN3cza46jW/9be4+Ll0szX9Ey45tPOzZbN/lSu1GqpxMnq+uTp68Pi7MHr/L2pqH7N 79Tt/RyZ0BoqKjdQXvD2/Y+NjYPD/WqX5lM8P9LY2YyUgsHJyw4TE97u/t/P0UxWaH+Wze3w8/X4 8PHv7tTd9cu9wrO/59Tq9dPS0VqjyHJod4aSmnmm08vl8ESl/sLh/yyc/2rE6nqOm6ipqV6y/lrC 8IKzymtvci8aHafAznietr/I7OPm6M7SytjV1/f6/mBhX+H5/6SrrdHR1J2swaWsosvm/2Wn+NPV 1N3i9rO8q6qsqpmelK64uJuAjMTIwtbl/Gxua5WVnOjs7hw0GExXP6rK++ff34ad4HR9cPPz88Xl 8paboc3V2aWmpuXl5dLV0La3t8zo9Ovr6rm5ubTR4Ojp55aYk/L4+O/u7nB3fgya2RKSyE2v2Baj 4YfQ7mHI9QuNxCKi2VS447uIoOji4VFRU5+1ok9MSjNsg7XZv/j4+Pv7+9CBlq2rrOSLgrby//Dr 7MjIyHt6e/r7/uelrEQdIkVsgPXx8fT18rWenodoZ/v3+Jp+d+RxcqirrdHCv2xbWvDw8D1MNrjQ 9fz8/Xuuw2FuY9ba1MXO79nZ2d3n+vT09JaWltTU1FhYWf///////yH/C05FVFNDQVBFMi4wAwEA AAAh+QQFZAD/ACwAAAAAYQATAAAI/wD5CRxIsKDBgwgTKlzIsGHBfvz8SZxIsaLFixgzatzIsePE GRAv3snTJc+dBh5TqlzJ0h/IiBQ3NHGWolkKZ002tKSIJx6EnUA7vqToZcyPT0KSfvoxxsvGBkQk 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 ------=_NextPart_000_0000_01C7BC59.61AA2400 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Location: http://tkfiles.storage.msn.com/x1pHd9OYNP16fmmfqJHji7qY0yYomKrFzGROBps3O6qHF0JRlVV8xH6X4cfsptw0fftk5oJYFpTKP6I-i91-se8TaoO7R9oiPVoxDEG_LEZW_XhegHxASvHJYsSxNjf526t R0lGODlhXAARAOYAAJnoedHS1JLsAIKCgk23R4nkZm6Q/ZZWJ+zt7f/XBS9G70lwCA2bBc3c8+bm 5mhoaLCVAP2YUG60ANeqAIqs/7GzwP+NNvdQAP+kUHfeUtXk+8HBwceuRa6iCE1q+6X+Abu8vLij OGzaR5SpdFzVNf3l2MXGyee6Cu/w8HzFAP92E1mF/ebDNPr7+/90DeHi49/g4f///9jn/1hxmPPz 809PT6enp5ubm0NDQ7S0tM3NzY6Ojtra2hOmCDY2NlxcXHV1daGhoX+e0/Hx8lFRUfLy89fX2K+v r/7+/snLzrmcKHyyJv/aH2OZAO7X0Nvc3eVwQdqRcIZ9QMLE1ETLHj5jAICi/11fjbnH9q+MpKqC kJDmbufn6Ojp6YbUAPX67M9HDO7x6by3kr0tCdDeuNf6mv3QtkFd/NA0AFdj1Wd/+FiFAKO7//7H AK2roP3NGcDCxI+NWpWfe1Nh5v/TIPLy8qmkgKu7jJey/8auMNrb3N3e30dy//9jAJ6h31DQLCH5 BAAAAAAALAAAAABcABEAAAf/gEIzg4SFhoeIiYqLjIqCjTOCMpOUlZaXmJmam5yaM52TgzIxpKWm p6ipqqusrakyn66wsaQlFhguUE4tSK6+v8CqsKOts8RIERYRfWhSI2FfZWS8wdXWqMOlSAQMDASm xqUqGBYXYwtrKR8Cdwgt1/DW2aUMfyIM4KK14y4XB1VNvHxIkcQBDBCkQBghdcRIkFVBHloD4YCU w2K0SDEQUQBfqXAxzETJogXMgQUSBHxYYqILCBx1YhB5EOPlRVUDBlwjcsSixFXZuHUrAKCbtxjG aNBYYYXCCgVyUAoQMMKEAwc4cmzAgcPBgAc6btC4sWOAWBplfwygsSHnhrA0/2zkQOugrA2lNGrc pRH2xt0NYsuezcaARIYtAABsKSCiB1JRSvngseJBQQclIfK0cRMAAY0HO248wLGhht8aeX/c8LEB iOoaA3TguHFjdtcaP2TX9otXr1Ibpn983uG69gYaw2gwOJy4QAYSVHogF1UEiwE2Bs5cgTDhTYIT IJ6gGItbNBAfOoDnvavXd071eWvvqIFjx4McPgbw6L0XuA7WOOhQw4A43DXMEEL14FwPDBIw3Sc0 GKDGHJXFwR0dCXAAxwtF8OVDgLWhpp5v7d0FxADw6QVEDTv8MBtbDzzA32+oPVCDjCzacMN+yXVI Qw/PSYdXUn5MsUEFaXQAwbIJTCRgRxJc9IbafzvEhRqJNgyAAxA46HejjQ7Y4EMOO6CXQ4xASHmj eqvdpaWWPEKIVw8i/CGkUkkh8MIeMOghRggssMCBQp4ppYMOv+3Hw1w57NdoXHIhyoMNNuwXFw2L YkopXjTkQGmjc12qlKehJocXAQ1ymtQQKAxRBApcGJGECSYE4MAQnOaq66689uqrr6YCKwomGjRg bAOgJKvsspV8AkokkEQr7bTUPtKIEIEAADs= ------=_NextPart_000_0000_01C7BC59.61AA2400 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Location: http://c22.statcounter.com/counter.php?sc_project=2302085&java=0&security=f85220dd&invisible=0 R0lGODlhWAAfAOYAAHubwtrk76Kzxejz/LXI21Z9rmSKtqrH5LLK48va6dzl8GGHsCJcl1qBsJey 0Mjd8oOauuHp8rvO4o2ku7zT7Dhad0FsoRZSi9Dd69/o8tXh7TVupfv+/5q00HqUqr7R5JWpvRIc X5Srw/X9/yxhlWiFnomkwsHN2ZGsy8XV5mGf2U6P1cHS5c/h9VB5q3GUvb3c+M/l/kN5rKG817LN 6FNyjL/W7muQu42ry6K51JSwz6W818zX40x1qKbA2kRwpKK50dvq+nGMpObt9F15kydLaX+cvKm+ 001riYqft7nCy3ev5KnC3MLU5anB2+Ts8ypNd9bm+ImnynqWtuLs93aTtK3D2oShwhI+fuju9I2n xbbQ65yuxIajx0VtmZK23EBfhOPr89/s9sXU47DD1WJ/mJu836vE3lBviZ+61qHC5KnA2eDu/El/ sa66xkd1poafvaW+2aC715u31bbL4KrC2+rw9u/0+K7F3YCkyuTs9Pr7/fT3+zNonCFWiv///yH5 BAAAAAAALAAAAABYAB8AAAf/gCh9g4SFhockfoqLjI2Oj5CRkpFGfX+XmJmamwKbnp+goaKjf36W pJ6dqKusqJaWpq2ZqrK1tpqxtrS3vKywp7W7vcOkucF7yMnKy8zNzs/Qz8aYHNXW19WYAnzc3d7f 4OHi4+TjxhwoEOrrEHANIuoodnwcAnf3+Pn6+/z9/v/+TFUbke7TkhuXIHhRcEdAFjsQI0qcSLGi xYsYLZoaMYIPBFAqljAY8McLjwhcwuhZybKly5cwY8qcGXMjnwEfMRm5seBPDBUrvCApeUIDFwUZ kipdyrRpBJVDhuiJ0LSq0zARqFpVamrAACo5/7ygAaPnFxUMRlzyooQHFw0B/wTUqOEhQFy7ePMK sIs0DIAePRokyKCgsOHDhpUijUBnR1LEhR8H6DogQ04qfxZs6bmCQSa2PERoEFCEiBAiGjwU0cC6 NWvVrANkKGChgIECkR9Dzq01wxMLN8IwzU04AIk+bNgE+DgAy4AoCxbEOPBnToG1bsaISKB6DAYM ZMAUQTMBCBo0HsaQqTB+QoA4wCMo4PsCsJQIO3rsUPA3woIbLvRwRRgLWPBDDxFI0EBgGPjXwIIs HBdEEBp89IMMF/yhRk9/GNAHFtidIEIKBFRQwQQJEIBGER4IcIQHQlQghIosCqCBARZgEEBsBRrQ gAUozGFBBxncYMEQLlhwm/8FOXRhgQs3YPCDCy/88AOStb2AwXFRRIEBHH8wIIMMC4gxAgN9bNCG cyW5cQIITaRARhmlpaBaCnKWgUQFaNhZBJ4YGJmBBt8F8IMBYTzRgws5WDBHBEZm4YILT4RhwQtZ XDoEAMC9UGAOAQ6agCkttJAAmGLKQEKZYcqwphglCUCAFh/U+oFqQAhRRK0mxojEB7rWmoAUQxLK WnxhTNpoDmG8cOSkSV1q6QvNXvrCtR9MqkECLJD6QApg+tHGmDIwgEeYJISwlqxa0HGEECKUUMS7 RUwgQhE1TFABEhLoam8TUv6AgwMuOFDADyhwCoAVFiygQw8WRKCtBsApYEH/AzkQa8AMANARwKTc SmDKAw988NEYWIw7JgPUqbsWF2SYQIAI7FUAAR1AsFeDrlAQUYQVOeMrQRM50FYbHizQduh3OB5o gQYgJwBcoBZYsEYXPxioQwKTNiEBHabYYIMEOcGBxQ9ttPEGFlN8BsIRJuAh99x01203AXRIgGcK TXzAwt59fxBnAgng2bcEEvjNQpx7G27r1wjgYQoFFCAQ1gBeXBBCCEZo4sXbJqxRx+ikl2766ain rvrqqZuyxRaWhwWKF58DYcIOceSu++689+7778DrDgUUuQ9f/PDE524KDTQcsAPt0EcvfRIi7HBF GnJkr/323Hfv/ffgZw+F//bjyzH++eZnb8oB7MfRgQgTJCH//PTb20EcXcyh//789+///wAM4P6g MED9EfCAcyDgHNZ3ABog4AxxmAEQJkjBCs4gDmdAAA5mMIcOeNCDDgihA3RAQh2g4IQnxIEWVqgF E7jQBFe4AhyMQMMaTuGGVcjhDGYAhh2CoYc8BGIPhzgDB5hCDWp43RaYh4AmOvGJzHudA3xARSY4 gQlYZMIZtFg3BBDAiXQIY94Qhzhb2YoFaERjE5pAxTa68Y1v1IEpzGAGsdnxjnjE4xzsxsc++vGP gAwkDuZoBpIZ8pCIROQOxMjIRjrykZCMpCQnKQVTfOGSmMykJjeZh0568h2ToAylKEdJylKW0g8N OIQqV5mISbjylbB85RsCAQA7 ------=_NextPart_000_0000_01C7BC59.61AA2400 Content-Type: text/css; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Content-Location: http://www.blogger.com/widgets/3319451950-blogarchive.css #ArchiveList .toggle { CURSOR: pointer; FONT-FAMILY: Arial, sans-serif } #ArchiveList .toggle-open { LINE-HEIGHT: 0.6em; _font-size: 1.7em } #ArchiveList { TEXT-ALIGN: left } #ArchiveList A.post-count-link { TEXT-DECORATION: none } #ArchiveList A.post-count-link:link { TEXT-DECORATION: none } #ArchiveList A.post-count-link:visited { TEXT-DECORATION: none } #ArchiveList A.toggle { TEXT-DECORATION: none } #ArchiveList A.toggle:link { TEXT-DECORATION: none } #ArchiveList A.toggle:visited { TEXT-DECORATION: none } #ArchiveList A.toggle:hover { TEXT-DECORATION: none } .BlogArchive #ArchiveList UL LI { BORDER-TOP-WIDTH: 0px; LIST-STYLE: none none outside; PADDING-LEFT: = 15px; BORDER-LEFT-WIDTH: 0px; BACKGROUND: none transparent scroll repeat = 0% 0%; BORDER-BOTTOM-WIDTH: 0px; MARGIN-LEFT: 0px; TEXT-INDENT: -15px; = BORDER-RIGHT-WIDTH: 0px } .BlogArchive #ArchiveList UL UL LI { PADDING-LEFT: 1.2em } .BlogArchive #ArchiveList UL { BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; = BORDER-LEFT-WIDTH: 0px; LIST-STYLE-IMAGE: none; BORDER-BOTTOM-WIDTH: = 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px; = LIST-STYLE-TYPE: none; BORDER-RIGHT-WIDTH: 0px } .BlogArchive #ArchiveList UL UL { MARGIN-TOP: 5px } .BlogArchive #ArchiveList UL.posts LI { PADDING-LEFT: 1.3em } #ArchiveList .collapsed UL { DISPLAY: none } ------=_NextPart_000_0000_01C7BC59.61AA2400 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 } ------=_NextPart_000_0000_01C7BC59.61AA2400 Content-Type: text/css; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Content-Location: http://www.blogger.com/widgets/2791266615-blog.css .backlink-toggle-zippy { PADDING-RIGHT: 11px; BACKGROUND: = url(http://www.blogger.com/img/triangle.gif) no-repeat left center; = CURSOR: hand; MARGIN-RIGHT: 0.1em } .expanded-backlink .backlink-toggle-zippy { BACKGROUND-IMAGE: url(http://www.blogger.com/img/triangle_open.gif) } .collapsed-backlink .collapseable { DISPLAY: none } .status-msg-wrap { FONT-SIZE: 110%; MARGIN: 10px auto; WIDTH: 90%; POSITION: relative } .status-msg-border { BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; FILTER: = alpha(opacity=3D40); BORDER-LEFT: #000000 1px solid; WIDTH: 100%; = BORDER-BOTTOM: #000000 1px solid; POSITION: relative; -moz-opacity: .40; = opacity: .40 } .status-msg-bg { Z-INDEX: 1; FILTER: alpha(opacity=3D30); WIDTH: 100%; POSITION: = relative; BACKGROUND-COLOR: #cccccc; -moz-opacity: .80; opacity: .80 } .status-msg-body { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; Z-INDEX: 4; PADDING-BOTTOM: = 0.3em; WIDTH: 100%; PADDING-TOP: 0.3em; POSITION: absolute; TEXT-ALIGN: = center } .status-msg-hidden { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; VISIBILITY: hidden; = PADDING-BOTTOM: 0.3em; PADDING-TOP: 0.3em } .status-msg-wrap A { PADDING-LEFT: 0.4em; TEXT-DECORATION: underline } ------=_NextPart_000_0000_01C7BC59.61AA2400 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: http://www.blogger.com/img/navbar/2/btn_search_this.gif R0lGODlhYAAPANUAAOLVws/BrKSSfLGfioVwWtzOuuHVwaqYg5J9aOLWwpiFbr2smMOznremkdbH s5mFb76umYt3YZ6Ldr2tmKSSfdbItJiFb9rNuNfJtdrNuaWTfdbItdbJtaWSfZiEb8m6pX9pU5mG b+LVwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAABgAA8AAAb/wMyE oggZj8ikcslsOp9Qp4UCEUIwBoNoy+16v+BwVysum8/dCgRCqaDf8Lg8nth0FAmAfs7nAvqAXXsJ Dw9+CwQgCyIfII4fWwcgB1uNIASLIgERk4wgWyCQWwOOIB6eoJCPIoiKXZYgA1seslutlLaJAiJa BiEKInoJBAwFBahdCB4IlZ8NnyIRDSIOyKFe19aQA6cixMavnwzQtFzEDiAB1OmaZAkKeOYIoo0f ogWKIMf1AswB+lzq1cNGL9RAblsIzPPCj5mIcsjKNXAYzMAfBYb+aOLEwJOHbuNEgOjYCAEBSI3C fczGJVujldu6bRqpMsKuh7VS4hTBzdIfyosYuZCRcEpnJAIeCFBKeeDUv2rNUhGMKjJmF6LhROBT B/HfMQTTFkRAlifoFgMNPkjYJfCYBwEfBBT9hK4aArgoobGUqk1Ev2Np14b78Iwr3GoRBoyr5oBA g2cJKiqwsEVPUwHHAnz0wFWdZk3dDiwqIHfa54fqunDecnr1R3WXj3HR/LGjiKYeFgUgalsTUVwW H4T4GTmQnOLGAwEwoEADhz8ak7+JLr0PBgoTJmwIVn16dz4J1EC4AEGDhSjo06tfDwWjgAkXggAA Ow== ------=_NextPart_000_0000_01C7BC59.61AA2400 Content-Type: text/css; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Content-Location: http://www.blogger.com/v-css/navbar/226789146-navbar.css #b-navbar { DISPLAY: block! important; Z-INDEX: 1; MIN-HEIGHT: 24px; LEFT: 0px; = MARGIN-BOTTOM: 10px; PADDING-BOTTOM: 4px; FONT: x-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: 80%; LINE-HEIGHT: 0.8em } #b-more { FLOAT: right } #b-searchbtn { MARGIN-RIGHT: 5px } #b-more { FLOAT: right } #b-search TABLE { PADDING-RIGHT: 2px; PADDING-LEFT: 2px; FLOAT: left; PADDING-BOTTOM: = 1px; PADDING-TOP: 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: 0.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_0000_01C7BC59.61AA2400 Content-Type: text/css; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Content-Location: http://www.blogger.com/v-css/navbar/1620315714-2.css #b-navbar { COLOR: #a4917c; BORDER-BOTTOM: #e1d4c0 1px solid; BACKGROUND-COLOR: = #f5ece2 } #b-search TABLE { BACKGROUND: url(../../img/navbar/2/corner.gif) #e1d4c0 no-repeat left = bottom } #b-query { BORDER-RIGHT: #bcac97 1px solid; BORDER-TOP: #bcac97 1px solid; = BORDER-LEFT: #bcac97 1px solid; BORDER-BOTTOM: #bcac97 1px solid } #b-search A { COLOR: #664e38 } #b-search A:hover { COLOR: #047 } #b-search TD { COLOR: #333333 } #b-sms A { COLOR: #664e38 } #b-sms A:hover { COLOR: #047 } #navbar-logo { BACKGROUND-IMAGE: url(../../img/navbar/2/logobar.gif); WIDTH: 24px; = HEIGHT: 24px } #b-search-this { BACKGROUND: #e1dc40 } .bt1 { BACKGROUND-COLOR: #bcac97 } .bt2 { BORDER-RIGHT: #bcac07 1px solid; BORDER-LEFT: #bcac97 1px solid; COLOR: = #664e38; BACKGROUND-COLOR: #e1d4c0 } DIV.bt2:hover { BACKGROUND-COLOR: #bcac97 } #bt-flag { PADDING-LEFT: 8px; BACKGROUND: url(../../img/navbar/2/flag.gif) = no-repeat left 50% } ------=_NextPart_000_0000_01C7BC59.61AA2400 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_0000_01C7BC59.61AA2400 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_0000_01C7BC59.61AA2400 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_0000_01C7BC59.61AA2400 Content-Type: multipart/alternative; boundary="----=_NextPart_001_0037_01C7BC59.61AEDEF0" ------=_NextPart_001_0037_01C7BC59.61AEDEF0 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable Content-Location: http://271patent.blogspot.com/2007/06/hell-hath-no-fury-attack-launched-on.html =EF=BB=BF Peter Zura's 271 = Patent Blog: Hell Hath No Fury - Attack Launched on USPTO Continuation = Rule Changes