From: <Saved by Windows Internet Explorer 7>
Subject: Spatial thoughts...: Univeral Address System - a panacea for India
Date: Mon, 25 Dec 2006 12:17:46 -0500
MIME-Version: 1.0
Content-Type: multipart/related;
	type="multipart/alternative";
	boundary="----=_NextPart_000_0000_01C7281E.B051A8A0"
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.3028

This is a multi-part message in MIME format.

------=_NextPart_000_0000_01C7281E.B051A8A0
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Location: http://c19.statcounter.com/counter.php?sc_project=2007105&java=0&security=48715e67&invisible=1

R0lGODlhAQABAJH/AP///wAAAMDAwAAAACH5BAEAAAIALAAAAAABAAEAAAICVAEAOw==

------=_NextPart_000_0000_01C7281E.B051A8A0
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Location: http://images.del.icio.us/static/img/delicious.small.gif

R0lGODlhCgAKAPcAAAAAAAAA/93d3f///wAAgIAAgACAgICAgMDAwP8AAAD/AP//AAAA//8A/wD/
/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMwAAZgAAmQAAzAAA/wAzAAAzMwAzZgAzmQAzzAAz/wBm
AABmMwBmZgBmmQBmzABm/wCZAACZMwCZZgCZmQCZzACZ/wDMAADMMwDMZgDMmQDMzADM/wD/AAD/
MwD/ZgD/mQD/zAD//zMAADMAMzMAZjMAmTMAzDMA/zMzADMzMzMzZjMzmTMzzDMz/zNmADNmMzNm
ZjNmmTNmzDNm/zOZADOZMzOZZjOZmTOZzDOZ/zPMADPMMzPMZjPMmTPMzDPM/zP/ADP/MzP/ZjP/
mTP/zDP//2YAAGYAM2YAZmYAmWYAzGYA/2YzAGYzM2YzZmYzmWYzzGYz/2ZmAGZmM2ZmZmZmmWZm
zGZm/2aZAGaZM2aZZmaZmWaZzGaZ/2bMAGbMM2bMZmbMmWbMzGbM/2b/AGb/M2b/Zmb/mWb/zGb/
/5kAAJkAM5kAZpkAmZkAzJkA/5kzAJkzM5kzZpkzmZkzzJkz/5lmAJlmM5lmZplmmZlmzJlm/5mZ
AJmZM5mZZpmZmZmZzJmZ/5nMAJnMM5nMZpnMmZnMzJnM/5n/AJn/M5n/Zpn/mZn/zJn//8wAAMwA
M8wAZswAmcwAzMwA/8wzAMwzM8wzZswzmcwzzMwz/8xmAMxmM8xmZsxmmcxmzMxm/8yZAMyZM8yZ
ZsyZmcyZzMyZ/8zMAMzMM8zMZszMmczMzMzM/8z/AMz/M8z/Zsz/mcz/zMz///8AAP8AM/8AZv8A
mf8AzP8A//8zAP8zM/8zZv8zmf8zzP8z//9mAP9mM/9mZv9mmf9mzP9m//+ZAP+ZM/+ZZv+Zmf+Z
zP+Z///MAP/MM//MZv/Mmf/MzP/M////AP//M///Zv//mf//zAAAACH5BAEAABAALAAAAAAKAAoA
AAgrAAcIFBigYMGBBA0GQDhA4UKEDhk6BECRooCLFytaxChAIwCOHTWC9AgyIAA7

------=_NextPart_000_0000_01C7281E.B051A8A0
Content-Type: image/jpeg
Content-Transfer-Encoding: base64
Content-Location: http://photos1.blogger.com/blogger/145/3359/1600/image004.jpg

/9j/4AAQSkZJRgABAQEAYABgAAD/7QDeUGhvdG9zaG9wIDMuMAA4QklNBAQAAAAAAMEcAlAAC1Bp
Y2FzYSAyLjAAHAJ1AJg8aGVsbG9zdGFtcD4KIDxnaWQ+MC0wLTdmZmZmZmZmLTA8L2dpZD4KIDxt
ZDU+MC0wLTAtMDwvbWQ1PgogPG9yaWdXaWR0aD4wPC9vcmlnV2lkdGg+CiA8b3JpZ0hlaWdodD4w
PC9vcmlnSGVpZ2h0PgogPG9yaWdTaXplPjA8L29yaWdTaXplPgo8L2hlbGxvc3RhbXA+ChwCdgAP
PHBpY2FzYXN0YW1wLz4KAP/gABBKRklGAAEBAAABAAEAAP/bAEMACgcHCAcGCggICAsKCgsOGBAO
DQ0OHRUWERgjHyUkIh8iISYrNy8mKTQpISIwQTE0OTs+Pj4lLkRJQzxINz0+O//bAEMBCgsLDg0O
HBAQHDsoIig7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7
O//AABEIAOcArgMBIgACEQEDEQH/xAAcAAABBAMBAAAAAAAAAAAAAAAFAAMEBgECBwj/xAA5EAAB
AwMCBQIFAwMDAwUAAAABAAIDBBEhBRIGEzFBUSJhBxQycYFCkaEjscEVUtEkJeEzQ2Jy8f/EABkB
AAMBAQEAAAAAAAAAAAAAAAECAwAEBf/EACARAAMBAAMBAQADAQAAAAAAAAABAhEDITESQQQTIjL/
2gAMAwEAAhEDEQA/AOiyUjWAMAyeostKiijfCWOAOE3LV8t45jtueqzLqMZjsz1EqCtMdrCsVOgt
fM7awEZ6hB4tDkptT5rGAhpHbqr9RMbIS5wCU9JG57rABLSbFwLaNIyTT49trgZHhEFXaOd1Cc4Y
ijNUp5G4dnwlms6YR6uLRRyl4BG0rjlVWH/UJc2JeRldQ1GqfUQuY3DSqVqfDkVRudtAOTcJkm3o
2EAahBTRB8kjBjpdB3h2tV2yI2jbkuHZAdY5dDUGIykkHAvdQotbmha9sZIHnoSqfDYp0OOi0mmi
Ec9UwEDLiehQfVZtMp3ER6hHKPa5VQfqTpB6wHE9txumKmN1Q08kOaT1uioG0J6hNTVLbRTsd91W
amkfG9xFnC/ZSHU7onbnN6D/AHKO50hdhpv2unU4JpHs4H7eym0FeaV9ni8Z7BNMk2GzyCe4ssOE
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

------=_NextPart_000_0000_01C7281E.B051A8A0
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Location: http://buttons.blogger.com/bloggerbutton1.gif

R0lGODlhWAAfAOYAAPjx6P9mAABDev///+jcy8i1n+/m2e3j1ezi1O7k1vTr4fPr4PTs4vXt4vLp
3vPq3/Hp3fHo2/Dn2kJxl7bDy/+zgOfl4SFaiRFPgYSgtf/Zv/8AAP+MQFN9nw5NgNfa2XSUrf+W
UB1XhjJmkDxsk8bO0jxskv9wEGOJpjtrkUFwlrW/xJWrvLS+wrW/w/ngy//Gn/yaV9LSzrW/xdXW
0ztskv/iz0p2mPmWUsTKy/5uDvDUu0t3mZeruLbAxkt2mdXV0sTJybO/xv/s3/HWvlqAnvmVUYae
r4efsP9vD1F7naW0vcTKyniVqmmLpdTU0ZWptf+DMJirueTg2ixhjNTW1Et2mC1ijYegsniWq7O+
xv/172iKo6e2v5aruKSzu7TAxsPJzP+fYJaptsPIyHmWrGqMpkp1l2mLpLO9wQAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5
BAEAABsALAAAAABYAB8AAAf/gBsbBISFhoeIiYqLjI2OiIKDCJOUlZaXmJmam5ydlwSDB6KjpKWm
p6ipqqusqAUECbE7RgG1tre4tkY7sb2+v8DBwsPEwa8GBkQ6uczMOkTI0SkpUNFcKWdf0dvc3d7f
4NHHBjjN5rg43Gkp2ylHRyLh8vPzrxIS5/m29/wtNfwSarSQIUDGGA8iyCC5IcEDEn8Sbghg2IJK
QYAYM2q89ypCBGYhKogUKeaEOY8oXZhAGcFEERErPSxBYyKIBxcCrDQpskREBBEuXIgIwrKo0aMo
X0GAgOuEhgFQow7YEqLZ0qsrTFyFYALLCghMBEBYIVaAkx8efnjJIqDtiqxb/+PKnbv1lQMHuJ5K
3RuF2d2/M0j8dUBixl8BT3oIJuGhhwgROXKIACx4sOXLmP++evDgVoi9oGEw40z6igcppEn4IG3G
g4AuD8oIAMLDA+faHoD4IEG6t+/fwB+8WrDgVoWoMDgo/wx1CDPi0KNLh05jyvToNGhc385d+isF
CoxHrVrrxJCoJnGBX8++vZYw7ePLn0+f/isGDMRHtaFBr1QNHNyC34BKqGCgEkLgJ4QAKgzo4IMQ
RijhhPi90kAD+oEGWgW3XOhhWyAKUEUDYDDo4Ykopqjiiixe+AoAAGSooVQc2gLjjW0BYEEHAmQA
AAUCTHDjkEQWaeSRSML4Yv+Mthy3X3/92UDjLUTmCAAIPf4YJIwWoNAWChbAWMIFAoCQQQdcThAk
CxN8AGMGGAQZJgAdZOAlC0QumSF5nkVVYy1V9ggCBheECaSQAKh5AZmIknlBnALA6CWhbVEAAAsC
XDDClgC09ailQ+rZJHLKlcoBDH5SOWSIZcJ4qI4CYGCBBXFa8EGsWkYKAJkl0CqApZu6SWaYbX0w
Z6gEwNjnjHsFaOOqv1KwKQhaCvlqotFyaqWValraVgYZkOmtrkWKaot/zGqAS6Cu5vjqtd1eu62u
3XYa5AT4umlluckyaYtTzA6gQXrP4qhrBu5uaUGss9Z6Kwa5wsirr8AKUALHu0aa69lIHFfg7LrQ
4tsWmkBi4KOijEoswAiQSpopmb8CgDAGE7AM47559quPPkRCOvKcm6K5489ikomlrhaoWXPMMsPc
gZsYQJxxvzHsbE4MSWaNJM4w1qs1vzC+kITVuSTxwtdfs2AmjxeIiUIGR7uJNrI3vlA12bXEcPbc
WfPYFgZ4yhwitXzfuGThiPNdAgUUHAvAB4zLnXgBGxSQ+OWYZ65kJAV07vnnoIcu+uikl2766aFH
ovrqrLfu+uuwxy777IIEAgA7

------=_NextPart_000_0000_01C7281E.B051A8A0
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Location: http://www2.clustrmaps.com/counter/index2.php?url=http://gisindia.blogspot.com

/9j/4AAQSkZJRgABAQAAAQABAAD//gA7Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcg
SlBFRyB2NjIpLCBxdWFsaXR5ID0gOTUK/9sAQwACAQEBAQECAQEBAgICAgIEAwICAgIFBAQDBAYF
BgYGBQYGBgcJCAYHCQcGBggLCAkKCgoKCgYICwwLCgwJCgoK/9sAQwECAgICAgIFAwMFCgcGBwoK
CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK/8IAEQgAagCg
AwEiAAIRAQMRAf/EAB0AAAAGAwEAAAAAAAAAAAAAAAAEBQYHCAEDCQL/xAAbAQACAwEBAQAAAAAA
AAAAAAAABQMEBgECB//aAAwDAQACEAMQAAABv8AADXdCMDIWN4BoODBcFEwrFwSTCcAZEkIyhwSB
hwdHCoIyyAAARApctVhjV6lsnnq2ULzp4z+deyx4vrZfkU9nCi89cKjp/G1rUGr0gUJ5bf0JmYM9
YB8VC8rLF/HfzZTueuna9ykLu4o286xsfHjZrOZzT602VmAls6txXG2yph2Mzpbn79BlPqei5bnP
G18XV/8ALOaJG57uuFr7ymkdWrVCRXOvygGBHL6GMBtejHdFLw5WXISfi7kayRHHjbVrFmoglT59
Lrrs5kTUsEpU07boopyyo8oM8GyrKKRHnKSDgWEBs+fYO2VEmZ3LDaqRSJMZ6NqhhX0P1JuU4fyv
n0lFDNuIg4Tt6ll6p0a3DpkralNagLh0t2S+h4WmwSk4qz+lBJWwHm34gF1ymOdiFEnf2EDkrCj1
yESM+tHx2G3E4DUVhl+5vafi9Hu6bxaTewBVsiL5QAQOYnABWewCwAq+YswArvYAwAq/ODwAV3b9
qADXdAAAAB//xAApEAABBAIBAwMFAAMAAAAAAAAFAgMEBgEHAAgRExASFBUXICEiIzJA/9oACAEB
AAEFAvWympQJwReZ05kdex5S0T9jF2KQY2FDB8B3qKfIbAMFK7R7Hex9blDbgyVKPbvgkghCyyIZ
EptYIHZIbWCC4Iuf9Tg/kfDRbEGJ06HOkMVBlqxj9fQ4dZn61HkGwgaIAh2oAxbK4Y1/COcXrsU9
xGtRylSqUmU4V1WEMMk6gyQKgAsWuBvWdvrUo+UP3Drkmv7j0DuP3dUiMgxtqmjcWDdEsFwH1P1z
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

------=_NextPart_000_0000_01C7281E.B051A8A0
Content-Type: text/css;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www2.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_01C7281E.B051A8A0
Content-Type: text/css;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.blogger.com/css/navbar/classic.css

HTML BODY {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; MARGIN: 0px; PADDING-TOP: 0px
}
BODY #wrapper {
	MARGIN-TOP: 30px
}
BODY #header {
	MARGIN-TOP: 50px
}
#leftcontent {
	_margin-top: 30px
}
#rightcontent {
	MARGIN-TOP: 30px! important
}
#Main #Title {
	MARGIN-TOP: 30px! important
}
BODY #wrap #wrap2 #header {
	MARGIN-TOP: 0px
}
BODY #wrap {
	MARGIN-TOP: 34px
}
#blog-header {
	MARGIN-TOP: -4px
}
BODY #wrap4 {
	PADDING-RIGHT: 15px; MARGIN-TOP: -4px; PADDING-LEFT: 15px; =
PADDING-BOTTOM: 0px; PADDING-TOP: 15px
}
#space-for-ie {
	DISPLAY: none; _border: 0; _display: block
}
#navbar-iframe {
	Z-INDEX: 500; LEFT: 0px; POSITION: absolute; TOP: 0px
}

------=_NextPart_000_0000_01C7281E.B051A8A0
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Location: http://www2.blogger.com/img/navbar/1/btn_search_this.gif

R0lGODlhYAAPANUAAB9YjAlCeEN6rneq3VKIuxBKf0uBtWic0C5mmjVsoTxzpwhCeBhRhm+j1ghC
d0J3q1mOwkJ4qxJLgD9ypDBikhJKgEN4rD5xozBiky9ikiVckRJKfSZdkSVdkRJJfSZdkj9xo2GV
ySZfk36x5BFEd0J4rAlDeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAABgAA8AAAb/QA8G
9CgZj8ikcslsOp/Q54VCynQqpqx2y+16v+CweDyWcCgTyYLMbrvfbsmk5FjD7/i8eLF4RBwBWQkD
IwkmIiOJIlkGIwZZiCMDhiYADY6HI1kji1kCiSMhmZuLiiaDhVuRIwJZIa2ChI+xIwRZDiZFJoEm
AwgFBaNbByEHkJoKmiYNCiYMwpxc0dCLAqK9v8FaiCYIyq9avgwjAM7klVmBEQ+AWQMHnYginQWF
I8HyBMYA99uc8tLi/YtmzR08LvmMmQAnDJwChVoCLChhIQAvSyMQZApxzZuJjJkODFjEzR/HaVqm
ITpZ7RpGjSYb2FoIqyQ4a5HSmSjxwOIWxgiiSjIaEGLAI24GRPF7doxUwKYfW/681rReOYb8gh1o
lqCBsEAlIkjMokAEBFvyRAQLQUAEgaCaxj070JakMpROqZnQF6zsWVWckl1t+6yBAG/PGAxQkExL
n4p2khIIBoBjiKvlKle6ZsBQgbfNNC8st+VyFtGmOZaTrO20ZZhJQxgCABRmJaCzAjgI206P7995
Jl6QwAu48eNhHMihoKHCAoskokufTr269evTA2Dfzr379AofMGxAEyGK+fPo05ufkIFEEAA7

------=_NextPart_000_0000_01C7281E.B051A8A0
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www2.blogger.com/css/navbar/navbar.css?v=1

#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 {
	BACKGROUND: url(../../img/navbar/corner.gif) #147 no-repeat left =
bottom; MARGIN: 0px 0px 0px 34px; HEIGHT: 1em
}
#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_01C7281E.B051A8A0
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www2.blogger.com/css/navbar/1.css?v=1

#b-navbar {
	BACKGROUND: #036; COLOR: #47a; BORDER-BOTTOM: #024 1px solid
}
#b-search TABLE {
	BACKGROUND: url(../../img/navbar/1/corner.gif) #147 no-repeat left =
bottom
}
#b-query {
	BORDER-RIGHT: #47a 1px solid; BORDER-TOP: #47a 1px solid; BORDER-LEFT: =
#47a 1px solid; BORDER-BOTTOM: #47a 1px solid
}
#b-search A {
	COLOR: #9cf
}
#b-search TD {
	COLOR: #fff
}
#b-search A:hover {
	COLOR: #fff
}
#b-sms A {
	COLOR: #9cf
}
#b-sms A:hover {
	COLOR: #fff
}
#navbar-logo {
	BACKGROUND-IMAGE: url(../../img/navbar/1/logobar.gif); WIDTH: 24px; =
HEIGHT: 24px
}
#b-search-this {
	BACKGROUND: #114477
}
.bt1 {
	BACKGROUND-COLOR: #4477aa
}
.bt2 {
	BORDER-RIGHT: #4477aa 1px solid; BORDER-LEFT: #4477aa 1px solid; COLOR: =
#99ccff; BACKGROUND-COLOR: #114477
}
DIV.bt2:hover {
	BACKGROUND-COLOR: #4477aa
}
#bt-flag {
	PADDING-LEFT: 8px; BACKGROUND: url(../../img/navbar/1/flag.gif) =
no-repeat left 50%
}

------=_NextPart_000_0000_01C7281E.B051A8A0
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www2.blogger.com/js/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_01C7281E.B051A8A0
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www2.blogger.com/app/scripts/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 <wbr>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 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 "<iframe id=3D" + id + " name=3D" + id +=0A=
             " src=3D" + url + "></iframe>";=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=
var gt_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_, "&amp;").replace(lt_re_, "&lt;").=0A=
    replace(gt_re_, "&gt;").replace(quote_re_, "&quot;");=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 &nbsp; 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_, "&nbsp;&nbsp;");=0A=
  str =3D str.replace(ret_re_, "");=0A=
  str =3D str.replace(nl_re_, "<br>");=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_, "&quot;");=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_, "<br>");=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 <wbr>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 <wbr>s into.=0A=
//   n: The maximum number of consecutive non-space characters to allow =
before=0A=
//     adding a <wbr>. 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 <wbr> 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 <wbr> 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 <wbr>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)) + '<wbr>';=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 "<img " + attributes + " src=3D" + url + ">";=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" <address> 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 '<p class=3Dlogentry><span class=3Dlogdate>' + new =
Date() +=0A=
                  '</span><span class=3Dlogmsg>' + msg + '</span></p>';=0A=
    logPane.innerHTML =3D logText + logPane.innerHTML;=0A=
  } else {=0A=
    window.status =3D msg;=0A=
  }=0A=
}=0A=

------=_NextPart_000_0000_01C7281E.B051A8A0
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www2.blogger.com/app/scripts/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 <TR> 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<br />";=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 '<div></div>';=0A=
  }=0A=
  var doc =3D getIFrameDocument(iframe);=0A=
  doc.open();=0A=
  doc.write('<body style=3D"' + strStyle + '">' =0A=
    + innerHtml + '</body>');=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=
/* 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_01C7281E.B051A8A0
Content-Type: multipart/alternative;
	boundary="----=_NextPart_001_001B_01C7281E.B0BAA3A0"


------=_NextPart_001_001B_01C7281E.B0BAA3A0
Content-Type: text/html;
	charset="utf-8"
Content-Transfer-Encoding: quoted-printable
Content-Location: http://gisindia.blogspot.com/2006/10/univeral-address-system-panacea-for.html

=EF=BB=BF<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" =
"http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
<HTML lang=3Den xml:lang=3D"en" =
xmlns=3D"http://www.w3.org/1999/xhtml"><HEAD><TITLE>Spatial thoughts...: =
Univeral Address System - a panacea for India</TITLE>
<META content=3D17.399951;78.479977 name=3Dgeo.position>
<META http-equiv=3DContent-Type content=3D"text/html; charset=3DUTF-8">
<META content=3Dtrue name=3DMSSmartTagsPreventParsing>
<META content=3D"MSHTML 6.00.5730.11" name=3DGENERATOR><LINK=20
title=3D"Spatial thoughts... - Atom"=20
href=3D"http://gisindia.blogspot.com/feeds/posts/default"=20
type=3Dapplication/atom+xml rel=3Dalternate><LINK title=3D"Spatial =
thoughts... - RSS"=20
href=3D"http://gisindia.blogspot.com/feeds/posts/default?alt=3Drss"=20
type=3Dapplication/rss+xml rel=3Dalternate><LINK title=3D"Spatial =
thoughts... - Atom"=20
href=3D"http://www.blogger.com/feeds/31163501/posts/default"=20
type=3Dapplication/atom+xml rel=3Dservice.post><LINK title=3DRSD=20
href=3D"http://www2.blogger.com/rsd.g?blogID=3D31163501" =
type=3Dapplication/rsd+xml=20
rel=3DEditURI><LINK title=3D"Spatial thoughts... - Atom"=20
href=3D"http://gisindia.blogspot.com/feeds/4166197368899219948/comments/d=
efault"=20
type=3Dapplication/atom+xml rel=3Dalternate>
<STYLE type=3Dtext/css>@import url( =
http://www2.blogger.com/css/blog_controls.css );
@import url( =
http://www2.blogger.com/dyn-css/authorization.css?blogID=3D31163501 );
</STYLE>

<SCRIPT src=3D"http://www2.blogger.com/js/backlink.js"=20
type=3Dtext/javascript></SCRIPT>

<SCRIPT src=3D"http://www2.blogger.com/js/backlink_control.js"=20
type=3Dtext/javascript></SCRIPT>

<SCRIPT type=3Dtext/javascript>var BL_backlinkURL =3D =
"http://www2.blogger.com/dyn-js/backlink_count.js";var BL_blogId =3D =
"31163501";</SCRIPT>

<STYLE type=3Dtext/css>BODY {
	PADDING-RIGHT: 20px; PADDING-LEFT: 20px; BACKGROUND: #fff; =
PADDING-BOTTOM: 40px; MARGIN: 0px; FONT: small Georgia,Serif; COLOR: =
#333; PADDING-TOP: 40px; TEXT-ALIGN: center
}
A:link {
	COLOR: #58a; TEXT-DECORATION: none
}
A:visited {
	COLOR: #969; TEXT-DECORATION: none
}
A:hover {
	COLOR: #c60; TEXT-DECORATION: underline
}
A IMG {
	BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: =
0px; BORDER-RIGHT-WIDTH: 0px
}

@media All   =20
{
#header {
	BORDER-RIGHT: #ccc 1px solid; BORDER-TOP: #ccc 1px solid; MARGIN: 0px =
auto 10px; BORDER-LEFT: #ccc 1px solid; WIDTH: 660px; BORDER-BOTTOM: =
#ccc 1px solid
}

}

@media Handheld   =20
{
#header {
	WIDTH: 90%
}
    }
#blog-title {
	BORDER-RIGHT: #eee 1px solid; PADDING-RIGHT: 20px; BORDER-TOP: #eee 1px =
solid; PADDING-LEFT: 20px; FONT-WEIGHT: normal; FONT-SIZE: 200%; =
PADDING-BOTTOM: 0.25em; MARGIN: 5px 5px 0px; TEXT-TRANSFORM: uppercase; =
BORDER-LEFT: #eee 1px solid; COLOR: #666; LINE-HEIGHT: 1.2em; =
PADDING-TOP: 20px; BORDER-BOTTOM: #eee 0px solid; LETTER-SPACING: 0.2em
}
#blog-title A {
	COLOR: #666; TEXT-DECORATION: none
}
#blog-title A:hover {
	COLOR: #c60
}
#description {
	BORDER-RIGHT: #eee 1px solid; PADDING-RIGHT: 20px; BORDER-TOP: #eee 0px =
solid; PADDING-LEFT: 20px; MAX-WIDTH: 700px; PADDING-BOTTOM: 20px; =
MARGIN: 0px 5px 5px; FONT: 100%/1.66em "Trebuchet =
MS",Trebuchet,Arial,Verdana,Sans-serif; TEXT-TRANSFORM: uppercase; =
BORDER-LEFT: #eee 1px solid; COLOR: #000; PADDING-TOP: 0px; =
BORDER-BOTTOM: #eee 1px solid; LETTER-SPACING: 0.2em
}

@media All   =20
{
#content {
	MARGIN: 0px auto; WIDTH: 800px; TEXT-ALIGN: left
}
#main {
	FLOAT: left; WIDTH: 560px
}
#sidebar {
	FLOAT: right; WIDTH: 220px
}

}

@media Handheld   =20
{
#content {
	WIDTH: 90%
}
#main {
	FLOAT: none; WIDTH: 100%
}
#sidebar {
	FLOAT: none; WIDTH: 100%
}
    }
H2 {
	MARGIN: 1.5em 0px 0.75em; FONT: 78%/1.4em "Trebuchet =
MS",Trebuchet,Arial,Verdana,Sans-serif; TEXT-TRANSFORM: uppercase; =
COLOR: #999; LETTER-SPACING: 0.2em
}

@media All   =20
{
.date-header {
	MARGIN: 1.5em 0px 0.5em
}
.post {
	PADDING-BOTTOM: 1.5em; MARGIN: 0.5em 0px 1.5em; BORDER-BOTTOM: #ccc 1px =
dotted
}

}

@media Handheld   =20
{
.date-header {
	PADDING-RIGHT: 1.5em; PADDING-LEFT: 1.5em; PADDING-BOTTOM: 0px; =
PADDING-TOP: 0px
}
.post {
	PADDING-RIGHT: 1.5em; PADDING-LEFT: 1.5em; PADDING-BOTTOM: 0px; =
PADDING-TOP: 0px
}
    }
.post-title {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: normal; FONT-SIZE: =
140%; PADDING-BOTTOM: 4px; MARGIN: 0.25em 0px 0px; COLOR: #c60; =
LINE-HEIGHT: 1.4em; PADDING-TOP: 0px
}
.post-title A {
	DISPLAY: block; FONT-WEIGHT: normal; COLOR: #c60; TEXT-DECORATION: none
}
.post-title A:visited {
	DISPLAY: block; FONT-WEIGHT: normal; COLOR: #c60; TEXT-DECORATION: none
}
.post-title STRONG {
	DISPLAY: block; FONT-WEIGHT: normal; COLOR: #c60; TEXT-DECORATION: none
}
.post-title STRONG {
	COLOR: #333
}
.post-title A:hover {
	COLOR: #333
}
.post DIV {
	MARGIN: 0px 0px 0.75em; LINE-HEIGHT: 1.6em
}
P.post-footer {
	MARGIN: -0.25em 0px 0px; COLOR: #ccc
}
.post-footer EM {
	FONT: 78%/1.4em "Trebuchet MS",Trebuchet,Arial,Verdana,Sans-serif; =
TEXT-TRANSFORM: uppercase; LETTER-SPACING: 0.1em
}
.comment-link {
	FONT: 78%/1.4em "Trebuchet MS",Trebuchet,Arial,Verdana,Sans-serif; =
TEXT-TRANSFORM: uppercase; LETTER-SPACING: 0.1em
}
.post-footer EM {
	COLOR: #999; MARGIN-RIGHT: 0.6em; FONT-STYLE: normal
}
.comment-link {
	MARGIN-LEFT: 0.6em
}
.post IMG {
	BORDER-RIGHT: #ddd 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: #ddd 1px =
solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; BORDER-LEFT: #ddd 1px =
solid; PADDING-TOP: 4px; BORDER-BOTTOM: #ddd 1px solid
}
.post BLOCKQUOTE {
	MARGIN: 1em 20px
}
.post BLOCKQUOTE P {
	MARGIN: 0.75em 0px
}
#comments H4 {
	MARGIN: 1em 0px; FONT: bold 78%/1.6em "Trebuchet =
MS",Trebuchet,Arial,Verdana,Sans-serif; TEXT-TRANSFORM: uppercase; =
COLOR: #999; LETTER-SPACING: 0.2em
}
#comments H4 STRONG {
	FONT-SIZE: 130%
}
#comments-block {
	MARGIN: 1em 0px 1.5em; LINE-HEIGHT: 1.6em
}
#comments-block DT {
	MARGIN: 0.5em 0px
}
#comments-block DD {
	MARGIN: 0.25em 0px 0px
}
#comments-block DD.comment-timestamp {
	MARGIN: -0.25em 0px 2em; FONT: 78%/1.4em "Trebuchet =
MS",Trebuchet,Arial,Verdana,Sans-serif; TEXT-TRANSFORM: uppercase; =
LETTER-SPACING: 0.1em
}
#comments-block DD P {
	MARGIN: 0px 0px 0.75em
}
.deleted-comment {
	COLOR: gray; FONT-STYLE: italic
}
#sidebar UL {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 1.5em; MARGIN: =
0px 0px 1.5em; PADDING-TOP: 0px; BORDER-BOTTOM: #ccc 1px dotted; =
LIST-STYLE-TYPE: none
}
#sidebar LI {
	PADDING-RIGHT: 0px; PADDING-LEFT: 15px; PADDING-BOTTOM: 0.25em; MARGIN: =
0px; TEXT-INDENT: -15px; LINE-HEIGHT: 1.5em; PADDING-TOP: 0px
}
#sidebar P {
	COLOR: #666; LINE-HEIGHT: 1.5em
}
#profile-container {
	PADDING-BOTTOM: 1.5em; MARGIN: 0px 0px 1.5em; BORDER-BOTTOM: #ccc 1px =
dotted
}
.profile-datablock {
	MARGIN: 0.5em 0px
}
.profile-img {
	DISPLAY: inline
}
.profile-img IMG {
	BORDER-RIGHT: #ddd 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: #ddd 1px =
solid; PADDING-LEFT: 4px; FLOAT: left; PADDING-BOTTOM: 4px; MARGIN: 0px =
8px 3px 0px; BORDER-LEFT: #ddd 1px solid; PADDING-TOP: 4px; =
BORDER-BOTTOM: #ddd 1px solid
}
.profile-data {
	MARGIN: 0px; FONT: bold 78%/1.6em "Trebuchet =
MS",Trebuchet,Arial,Verdana,Sans-serif; TEXT-TRANSFORM: uppercase; =
LETTER-SPACING: 0.1em
}
.profile-data STRONG {
	DISPLAY: none
}
.profile-textblock {
	MARGIN: 0px 0px 0.5em
}
.profile-link {
	MARGIN: 0px; FONT: 78%/1.4em "Trebuchet =
MS",Trebuchet,Arial,Verdana,Sans-serif; TEXT-TRANSFORM: uppercase; =
LETTER-SPACING: 0.1em
}
#footer {
	CLEAR: both; MARGIN: 0px auto; WIDTH: 660px
}
#footer HR {
	DISPLAY: none
}
#footer P {
	MARGIN: 0px; FONT: 78%/1.6em "Trebuchet =
MS",Trebuchet,Verdana,Sans-serif; TEXT-TRANSFORM: uppercase; =
PADDING-TOP: 15px; LETTER-SPACING: 0.1em
}
</STYLE>
<!-- -->
<STYLE type=3Dtext/css>@import url( =
http://www.blogger.com/css/navbar/classic.css );
DIV.b-mobile {
	DISPLAY: none
}
</STYLE>
</HEAD>
<BODY><IFRAME id=3Dnavbar-iframe marginWidth=3D0 marginHeight=3D0=20
src=3D"http://www2.blogger.com/navbar.g?blogID=3D31163501" =
frameBorder=3D0=20
width=3D"100%" scrolling=3Dno height=3D30></IFRAME>
<DIV id=3Dspace-for-ie></DIV><!-- Start of StatCounter Code -->
<SCRIPT language=3Djavascript type=3Dtext/javascript>
var sc_project=3D2007105;=20
var sc_invisible=3D1;=20
var sc_partition=3D18;=20
var sc_security=3D"48715e67";=20
</SCRIPT>

<SCRIPT language=3Djavascript =
src=3D"http://www.statcounter.com/counter/counter.js"=20
type=3Dtext/javascript></SCRIPT>
<NOSCRIPT><A href=3D"http://www.statcounter.com/" target=3D_blank><IMG=20
alt=3D"free hit counter code"=20
src=3D"http://c19.statcounter.com/counter.php?sc_project=3D2007105&amp;ja=
va=3D0&amp;security=3D48715e67&amp;invisible=3D1"=20
border=3D0></A> </NOSCRIPT><!-- End of StatCounter Code -->
<DIV id=3Dheader>
<H1 id=3Dblog-title><A href=3D"http://gisindia.blogspot.com/">Spatial =
thoughts...=20
</A></H1>
<P id=3Ddescription>GIS, mapping, open-source and more... with focus on=20
India</P></DIV><!-- Begin #content -->
<DIV id=3Dcontent><!-- Begin #main -->
<DIV id=3Dmain>
<DIV id=3Dmain2>
<H2 class=3Ddate-header>Thursday, October 26, 2006</H2><!-- Begin .post =
-->
<DIV class=3Dpost><A name=3D4166197368899219948></A>
<H3 class=3Dpost-title>Univeral Address System - a panacea for India =
</H3>
<DIV class=3Dpost-body>
<DIV>
<DIV style=3D"CLEAR: both"></DIV><SPAN class=3Dblsp-spelling-error=20
id=3DSPELLING_ERROR_0 onclick=3DBLOG_clickHandler(this)>NAC</SPAN> =
Geographic=20
Products Inc. has pioneered a grid-based universal address system called =
'<A=20
href=3D"http://www.nacgeo.com/nacsite/">Natural Area <SPAN=20
class=3Dblsp-spelling-error id=3DSPELLING_ERROR_1=20
onclick=3DBLOG_clickHandler(this)>Geocoding</SPAN> (<SPAN=20
class=3Dblsp-spelling-error id=3DSPELLING_ERROR_2=20
onclick=3DBLOG_clickHandler(this)>NAC</SPAN>)</A>'. In this system a 10 =
digit=20
alpha-numeric code can uniquely describe any square meter of area on =
earth. On=20
the surface it looks very simple but it has got huge=20
implications.<BR><BR>Imagine being able to identify and locate any house =
or any=20
place in the world with<SPAN><SPAN> a 10 digit code. Latitude and =
Longitude=20
serve the same purpose but they are a bit clunky to use and we need 20+=20
characters to get close to meter level location. Plus <SPAN=20
class=3Dblsp-spelling-error id=3DSPELLING_ERROR_3=20
onclick=3DBLOG_clickHandler(this)>NAC</SPAN> works for areas too, making =
it ideal=20
for postal codes. <SPAN class=3Dblsp-spelling-error =
id=3DSPELLING_ERROR_4=20
onclick=3DBLOG_clickHandler(this)>NAC</SPAN> is also hierarchical, so by =
appending=20
letters to the <SPAN class=3Dblsp-spelling-error id=3DSPELLING_ERROR_5=20
onclick=3DBLOG_clickHandler(this)>NAC</SPAN> you can drill down the =
details. for=20
example, the <SPAN class=3Dblsp-spelling-error id=3DSPELLING_ERROR_6=20
onclick=3DBLOG_clickHandler(this)>NAC</SPAN> for <SPAN =
class=3Dblsp-spelling-error=20
id=3DSPELLING_ERROR_7 =
onclick=3DBLOG_clickHandler(this)>Hussainsagar</SPAN> Lake in=20
Hyderabad, India is <SPAN class=3Dblsp-spelling-error =
id=3DSPELLING_ERROR_8=20
onclick=3DBLOG_clickHandler(this)>PJ</SPAN>5 KW2. The <SPAN=20
class=3Dblsp-spelling-error id=3DSPELLING_ERROR_9=20
onclick=3DBLOG_clickHandler(this)>NAC</SPAN> for the island in the lake =
with=20
Buddha statue is <SPAN class=3Dblsp-spelling-error =
id=3DSPELLING_ERROR_10=20
onclick=3DBLOG_clickHandler(this)>PJ</SPAN>5L KW29 and the <SPAN=20
class=3Dblsp-spelling-error id=3DSPELLING_ERROR_11=20
onclick=3DBLOG_clickHandler(this)>NAC</SPAN> for the statue itself is =
<SPAN=20
class=3Dblsp-spelling-error id=3DSPELLING_ERROR_12=20
onclick=3DBLOG_clickHandler(this)>PJ</SPAN>5<SPAN =
class=3Dblsp-spelling-error=20
id=3DSPELLING_ERROR_13 onclick=3DBLOG_clickHandler(this)>LQ</SPAN> =
KW29Q. Have a <A=20
href=3D"http://www.iomass.com/nac_navigator.php?map_type=3DG_HYBRID_MAP&a=
mp;nacstring=3DPJ5L+KW29">look</A>.<BR><BR>As=20
I play with this more, the power of a truly <SPAN =
class=3Dblsp-spelling-corrected=20
id=3DSPELLING_ERROR_14 =
onclick=3DBLOG_clickHandler(this)>universal</SPAN> address=20
systems becomes clearer. in a country like India, where it is virtually=20
impossible to locate any address algorithmically, using <SPAN=20
class=3Dblsp-spelling-error id=3DSPELLING_ERROR_15=20
onclick=3DBLOG_clickHandler(this)>NAC</SPAN> system would solve many of =
our=20
problems. No more long addresses that span 5 lines or more, no more =
asking=20
around the corner <SPAN class=3Dblsp-spelling-error =
id=3DSPELLING_ERROR_16=20
onclick=3DBLOG_clickHandler(this)>panwalla</SPAN> for landmarks and no =
more=20
endless calls for directions from your friends visiting your home.=20
Location-based services could take off on this platform, including =
directions=20
and local shopping info.<BR><BR>Already, China is on it's way to =
adopting <SPAN=20
class=3Dblsp-spelling-error id=3DSPELLING_ERROR_17=20
onclick=3DBLOG_clickHandler(this)>NAC</SPAN> Universal Address system. a =
mobile=20
company called <SPAN class=3Dblsp-spelling-error id=3DSPELLING_ERROR_18=20
onclick=3DBLOG_clickHandler(this)>PDAger</SPAN> Mobility in China has <A =

href=3D"http://www.nacgeo.com/nacsite/press/19jan2006.asp">partnered =
with <SPAN=20
class=3Dblsp-spelling-error id=3DSPELLING_ERROR_19=20
onclick=3DBLOG_clickHandler(this)>NAC</SPAN> Geographic Products</A> to =
use <SPAN=20
class=3Dblsp-spelling-error id=3DSPELLING_ERROR_20=20
onclick=3DBLOG_clickHandler(this)>NAC</SPAN> in their services. The =
Chinese=20
government is also working to digitize Beijing with Universal Address =
System=20
before the 2008 <SPAN class=3Dblsp-spelling-corrected =
id=3DSPELLING_ERROR_21=20
onclick=3DBLOG_clickHandler(this)>Olympics</SPAN>. Here the <SPAN=20
class=3Dblsp-spelling-error id=3DSPELLING_ERROR_22=20
onclick=3DBLOG_clickHandler(this)>NAC</SPAN> offers another advantage of =
being=20
language independent ( well almost! ) hence offering tourists and =
non-<SPAN=20
class=3Dblsp-spelling-corrected id=3DSPELLING_ERROR_23=20
onclick=3DBLOG_clickHandler(this)>Chinese</SPAN> people an easy way to=20
navigate.<BR><BR></SPAN></SPAN>I <SPAN class=3Dblsp-spelling-corrected=20
id=3DSPELLING_ERROR_24 onclick=3DBLOG_clickHandler(this)>believe</SPAN> =
that India=20
must also consider a <SPAN class=3Dblsp-spelling-corrected =
id=3DSPELLING_ERROR_25=20
onclick=3DBLOG_clickHandler(this)>Universal</SPAN> Address System. It is =
high time=20
we modernize our location infrastructure and by doing so we could fuel =
growth to=20
so many industries. But this won't be an easy task. Provided the <SPAN=20
class=3Dblsp-spelling-error id=3DSPELLING_ERROR_26=20
onclick=3DBLOG_clickHandler(this)>NAC</SPAN> is a <SPAN=20
class=3Dblsp-spelling-corrected id=3DSPELLING_ERROR_27=20
onclick=3DBLOG_clickHandler(this)>proprietary</SPAN> technology, the =
government=20
must license it in order to use it. This is a big barrier when =
considering doing=20
something in a big way. Also, the penetration of GPS is abysmal and =
would still=20
be years before real-time location technologies could reach the masses. =
The=20
adoption could come much quicker from private players. One possibility =
is that=20
big <SPAN class=3Dblsp-spelling-error id=3DSPELLING_ERROR_28=20
onclick=3DBLOG_clickHandler(this)>telecom</SPAN> companies come together =
and start=20
the offering location based services using <SPAN =
class=3Dblsp-spelling-error=20
id=3DSPELLING_ERROR_29 onclick=3DBLOG_clickHandler(this)>NAC</SPAN>. Or =
maybe a=20
success story in China would <SPAN class=3Dblsp-spelling-corrected=20
id=3DSPELLING_ERROR_30 onclick=3DBLOG_clickHandler(this)>kick =
start</SPAN> the=20
process...
<DIV style=3D"CLEAR: both; PADDING-BOTTOM: 0.25em"></DIV>
<P class=3Dblogger-labels>Labels: <A=20
href=3D"http://gisindia.blogspot.com/search/label/gis" =
rel=3Dtag>gis</A>, <A=20
href=3D"http://gisindia.blogspot.com/search/label/india"=20
rel=3Dtag>india</A></P></DIV></DIV>
<P class=3Dpost-footer><EM>posted by ujaval at <A title=3D"permanent =
link"=20
href=3D"http://gisindia.blogspot.com/2006/10/univeral-address-system-pana=
cea-for.html">10:09=20
PM</A></EM> <SPAN class=3Ditem-action><A title=3D"Email Post"=20
href=3D"http://www.blogger.com/email-post.g?blogID=3D31163501&amp;postID=3D=
4166197368899219948"><SPAN=20
class=3Demail-post-icon>&nbsp;</SPAN></A></SPAN><SPAN=20
class=3D"item-control blog-admin pid-1790191103"><A title=3D"Edit Post"=20
style=3D"BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; =
BORDER-LEFT-STYLE: none; BORDER-BOTTOM-STYLE: none"=20
href=3D"http://www.blogger.com/post-edit.g?blogID=3D31163501&amp;postID=3D=
4166197368899219948"><SPAN=20
class=3Dquick-edit-icon>&nbsp;</SPAN></A></SPAN> </P>
<P><IMG =
src=3D"http://images.del.icio.us/static/img/delicious.small.gif"><A=20
href=3D"http://del.icio.us/post?url=3Dhttp://gisindia.blogspot.com/2006/1=
0/univeral-address-system-panacea-for.html&amp;title=3DUniveral Address =
System - a panacea for India">=20
Add to del.icio.us. </A>| <A=20
href=3D"http://digg.com/submit?phase=3D2&amp;url=3Dhttp://gisindia.blogsp=
ot.com/2006/10/univeral-address-system-panacea-for.html">Digg=20
this </A>|</P></DIV><!-- End .post --><!-- Begin #comments -->
<DIV id=3Dcomments><A name=3Dcomments></A>
<H4>0 Comments:</H4>
<DL id=3Dcomments-block></DL>
<P class=3Dcomment-timestamp><A class=3Dcomment-link=20
href=3D"http://www.blogger.com/comment.g?blogID=3D31163501&amp;postID=3D4=
166197368899219948">Post=20
a Comment</A> </P><A name=3Dlinks></A>
<H4>Links to this post:</H4>
<DL id=3Dcomments-block>
  <SCRIPT=20
  =
src=3D"http://www2.blogger.com/dyn-js/backlink.js?blogID=3D31163501&amp;p=
ostID=3D4166197368899219948"=20
  defer type=3Dtext/javascript charset=3Dutf-8>=0A=
</SCRIPT>
  <NOSCRIPT><A=20
  =
href=3D"http://blogsearch.blogger.comblogsearch/?q=3Dlink:http%3A%2F%2Fgi=
sindia.blogspot.com%2F2006%2F10%2Funiveral-address-system-panacea-for.htm=
l">See=20
  links to this post</A></NOSCRIPT>=20
  <DIV id=3Dblogger-dcom-block style=3D"DISPLAY: none">
  <DT class=3Dcomment-title><SPAN class=3Dcomment-toggler>&nbsp;</SPAN> =
<A=20
  href=3D"http://gisindia.blogspot.com/2006/10/%3C$BlogBacklinkURL$%3E"=20
  rel=3Dnofollow>&lt;$BlogBacklinkTitle$&gt;</A> <SPAN=20
  class=3D"item-control blog-admin"><A title=3D"Remove Link"=20
  style=3D"BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; =
BORDER-LEFT-STYLE: none; BORDER-BOTTOM-STYLE: none"=20
  =
href=3D"http://www2.blogger.com/delete-backlink.g?blogID=3D31163501&amp;p=
ostID=3D4166197368899219948&amp;backlinkURL=3D%3C$BlogBacklinkURLEscaped$=
%3E"><SPAN=20
  class=3Ddelete-comment-icon>&nbsp;</SPAN></A></SPAN>=20
  <DD class=3Dcomment-body>&lt;$BlogBacklinkSnippet$&gt; <BR><SPAN=20
  class=3Dcomment-poster><EM>posted by &lt;$BlogBacklinkAuthor$&gt; @=20
  &lt;$BlogBacklinkDateTime$&gt;</EM> </SPAN></DD></DIV>
  <SCRIPT type=3Dtext/javascript>if (typeof BL_addOnLoadEvent =3D=3D =
'function') { BL_addOnLoadEvent(function() { BL_writeBacklinks(); }); =
}</SCRIPT>
</DL>
<P class=3Dcomment-timestamp>
<SCRIPT type=3Dtext/javascript>function BlogThis() {=0A=
Q=3D''; x=3Ddocument; y=3Dwindow;=0A=
if(x.selection) {=0A=
  Q=3Dx.selection.createRange().text;=0A=
} else if (y.getSelection) {=0A=
  Q=3Dy.getSelection();=0A=
} else if (x.getSelection) {=0A=
  Q=3Dx.getSelection();=0A=
}=0A=
popw =3D y.open('http://www2.blogger.com/blog-this.g?t=3D' +=0A=
  escape(Q) + '&u=3D' + escape(location.href) + '&n=3D' +=0A=
  escape(document.title),'bloggerForm',=0A=
  =
'scrollbars=3Dno,width=3D475,height=3D300,top=3D175,left=3D75,status=3Dye=
s,resizable=3Dyes');=0A=
void(0);=0A=
}=0A=
</SCRIPT>
<A class=3Dcomment-link id=3Db-backlink =
href=3D"javascript:BlogThis();">Create a=20
Link</A></P>
<P class=3Dcomment-timestamp><A =
href=3D"http://gisindia.blogspot.com/">&lt;&lt;=20
Home</A> </P></DIV><!-- End #comments --></DIV></DIV><!-- End #main =
--><!-- Begin #sidebar -->
<DIV id=3Dsidebar>
<DIV id=3Dsidebar2><!-- Begin #profile-container -->
<DIV id=3Dprofile-container>
<H2 class=3Dsidebar-title>About Me</H2>
<DL class=3Dprofile-datablock>
  <DT class=3Dprofile-img><A=20
  href=3D"http://www.blogger.com/profile/03866971061806405296"><IMG =
height=3D80=20
  alt=3D" My Photo"=20
  src=3D"http://photos1.blogger.com/blogger/145/3359/1600/image004.jpg" =
width=3D60>=20
  </A></DT>
  <DD class=3Dprofile-data><STRONG>Name:</STRONG> Ujaval Gandhi=20
  <DD class=3Dprofile-data><STRONG>Location:</STRONG> Hyderabad, IN =
</DD></DL>
<P class=3Dprofile-link><A=20
href=3D"http://www.blogger.com/profile/03866971061806405296">View my =
complete=20
profile</A> </P></DIV><!-- End #profile -->
<H2 class=3Dsidebar-title>Popular Posts</H2>
<UL id=3Dpopular>
  <LI><A=20
  =
href=3D"http://gisindia.blogspot.com/2006/11/using-real-time-gis-to-preve=
nt-disease.html">Using=20
  real-time GIS to prevent disease outbreaks</A>=20
  <LI><A=20
  =
href=3D"http://gisindia.blogspot.com/2006/11/gapminderorg-data-visualizat=
ion-on_6897.html">Gapminder.org=20
  - data visualization on steroids!</A>=20
  <LI><A=20
  =
href=3D"http://gisindia.blogspot.com/2006/10/univeral-address-system-pana=
cea-for.html">Univeral=20
  Address System - a panacea for India</A> </LI></UL>
<H2 class=3Dsidebar-title>Previous Posts</H2>
<UL id=3Drecently>
  <LI><A=20
  =
href=3D"http://gisindia.blogspot.com/2006/12/crri-to-create-asset-managem=
ent-system.html">CRRI=20
  to create an asset management system for Indi...</A>=20
  <LI><A=20
  =
href=3D"http://gisindia.blogspot.com/2006/12/organic-city-project-mapping=
-stories.html">The=20
  organic city project - mapping stories and con...</A>=20
  <LI><A=20
  =
href=3D"http://gisindia.blogspot.com/2006/12/rural-development-and-gis.ht=
ml">Rural=20
  development and GIS</A>=20
  <LI><A=20
  =
href=3D"http://gisindia.blogspot.com/2006/12/wildlife-tracking-and-conver=
sation-in.html">Wildlife=20
  tracking and conservation - role of GIS</A>=20
  <LI><A=20
  =
href=3D"http://gisindia.blogspot.com/2006/12/swivel-data-sharing-end-to-g=
eospatial.html">Swivel=20
  data sharing - an end to geospatial data wo...</A>=20
  <LI><A=20
  =
href=3D"http://gisindia.blogspot.com/2006/11/effective-decision-making-us=
ing_28.html">Effective=20
  decision making using Participatory GIS</A>=20
  <LI><A=20
  =
href=3D"http://gisindia.blogspot.com/2006/11/gis-to-help-property-tax-ref=
orms-in.html">GIS=20
  to help property tax reforms in Mumbai</A>=20
  <LI><A=20
  =
href=3D"http://gisindia.blogspot.com/2006/11/natural-resource-database-gi=
s-for.html">Natural=20
  Resource Database - GIS for developing cou...</A>=20
  <LI><A=20
  =
href=3D"http://gisindia.blogspot.com/2006/11/open-sourcing-politics.html"=
>Open-sourcing=20
  politics</A>=20
  <LI><A=20
  =
href=3D"http://gisindia.blogspot.com/2006/11/geoiq-pushes-web-mapping-fro=
ntier.html">GeoIQ=20
  pushes the web mapping frontier</A> </LI></UL>
<P id=3Dpowered-by><A href=3D"http://www.blogger.com/"><IMG =
alt=3D"Powered by Blogger"=20
src=3D"http://buttons.blogger.com/bloggerbutton1.gif"></A></P></DIV>
<SCRIPT src=3D"http://embed.technorati.com/embed/c2w6t4msh.js"=20
type=3Dtext/javascript></SCRIPT>

<DIV align=3Dcenter><A id=3DclustrMapsLink=20
href=3D"http://www2.clustrmaps.com/counter/maps.php?url=3Dhttp://gisindia=
.blogspot.com"><IMG=20
id=3DclustrMapsImg title=3D"Locations of visitors to this page"=20
style=3D"BORDER-RIGHT: 1px solid; BORDER-TOP: 1px solid; BORDER-LEFT: =
1px solid; BORDER-BOTTOM: 1px solid"=20
alt=3D"Locations of visitors to this page"=20
onerror=3D"this.onError=3Dnull; =
this.src=3D'http://clustrmaps.com/images/clustrmaps-back-soon.jpg'; =
document.getElementById('clustrMapsLink').href=3D'http://clustrmaps.com'"=
=20
src=3D"http://www2.clustrmaps.com/counter/index2.php?url=3Dhttp://gisindi=
a.blogspot.com">=20
</A><BR></DIV></DIV><!-- End #sidebar --></DIV><!-- End #content --><!-- =
Begin #footer -->
<DIV id=3Dfooter>
<HR>

<P></P></DIV><!-- End #footer --></BODY></HTML>

------=_NextPart_001_001B_01C7281E.B0BAA3A0
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www2.blogger.com/navbar.g?blogID=31163501

=EF=BB=BF<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=3DContent-Type content=3D"text/html; =
charset=3Dutf-8"><LINK=20
href=3D"http://www2.blogger.com/css/navbar/navbar.css?v=3D1" =
type=3Dtext/css=20
rel=3Dstylesheet><LINK =
href=3D"http://www2.blogger.com/css/navbar/1.css?v=3D1"=20
type=3Dtext/css rel=3Dstylesheet>
<META content=3D"MSHTML 6.00.5730.11" name=3DGENERATOR></HEAD>
<BODY>
<SCRIPT src=3D"http://www2.blogger.com/js/cookies.common.js"=20
type=3Dtext/javascript></SCRIPT>

<SCRIPT src=3D"http://www2.blogger.com/app/scripts/common.js"=20
type=3Dtext/javascript></SCRIPT>

<SCRIPT src=3D"http://www2.blogger.com/app/scripts/dom.common.js"=20
type=3Dtext/javascript></SCRIPT>

<SCRIPT type=3Dtext/javascript><!--=0A=
=0A=
=0A=
=0A=
 var ID =3D "31163501";=0A=
 var FLAG_COOKIE_NAME =3D 'flaggedBlog';=0A=
 var MAX_FLAGGED_BLOGS =3D 10;=0A=
 var FLAG_BLOG_URL =3D "http://www2.blogger.com" +=0A=
                     "/flag-blog.g?nav=3D" +=0A=
                     "1" +=0A=
                     "&toFlag=3D" + ID;=0A=
 var UNFLAG_BLOG_URL =3D "http://www2.blogger.com" +=0A=
                     "/unflag-blog.g?nav=3D" +=0A=
                     "1" +=0A=
                     "&toFlag=3D" + ID;=0A=
 var FLAG_IMAGE_URL =3D "http://www2.blogger.com" + "/img/navbar/" +=0A=
                      "1" + "/flag.gif";=0A=
 var UNFLAG_IMAGE_URL =3D "http://www2.blogger.com" + =0A=
                         "/img/navbar/1/unflag.gif";=0A=
   =0A=
 var ncHasFlagged =3D false;=0A=
 var servletTarget =3D new Image();=0A=
=0A=
=0A=
function hasFlagged() {=0A=
  if (getCookie(FLAG_COOKIE_NAME)) {=0A=
    var bloglist =3D getCookie(FLAG_COOKIE_NAME);=0A=
    var blogarray =3D bloglist.split(",")=0A=
    if (FindInArray(blogarray, ID) > 0) {=0A=
      return true;=0A=
    }=0A=
  }=0A=
  return ncHasFlagged;=0A=
}=0A=
=0A=
=0A=
function toggleFlag() {=0A=
  var date =3D new Date();=0A=
  if (hasFlagged()) {=0A=
    removeBlogFromFlagCookie();=0A=
    servletTarget.src =3D UNFLAG_BLOG_URL + '&d=3D' + date.getTime();=0A=
    document.getElementById('bt-flag').style.background =3D =0A=
      'url(' + FLAG_IMAGE_URL + ') left no-repeat';=0A=
    ncHasFlagged =3D false;=0A=
    document.getElementById('bt-unflag-body').style.display =3D 'none';=0A=
    document.getElementById('bt-flag-body').style.display =3D 'inline'=0A=
    refreshDrop();=0A=
  } else { =0A=
    setBloggerFlagCookie();=0A=
    servletTarget.src =3D FLAG_BLOG_URL + '&d=3D' + date.getTime();=0A=
    document.getElementById('bt-flag').style.background =3D =0A=
      'url(' + UNFLAG_IMAGE_URL + ') left no-repeat';=0A=
    ncHasFlagged =3D true;=0A=
    document.getElementById('bt-flag-body').style.display =3D 'none'=0A=
    document.getElementById('bt-unflag-body').style.display =3D 'inline'=0A=
    refreshDrop();=0A=
  }=0A=
}=0A=
=0A=
=0A=
function showDrop() {=0A=
 var overlap =3D 5;=0A=
 var dropdown_position =3D =0A=
   GetPageOffsetRight(document.getElementById('b-flag-this')) - overlap =
+ "px";=0A=
=0A=
 document.getElementById('unflagi').style.display =3D 'none';=0A=
 document.getElementById('flagi').style.display =3D 'none';=0A=
=0A=
 if (!hasFlagged()) { =0A=
    document.getElementById('flagi').style.display =3D 'inline';=0A=
    document.getElementById('flagi').style.left =3D dropdown_position;=0A=
    showElement(document.getElementById('flagi'));     =0A=
  } else { =0A=
    document.getElementById('unflagi').style.display =3D 'inline';=0A=
    document.getElementById('unflagi').style.left =3D dropdown_position;=0A=
    showElement(document.getElementById('unflagi')); =0A=
  }   =0A=
}=0A=
=0A=
=0A=
function hideDrop() {=0A=
    hideElement(document.getElementById('flagi'));=0A=
    hideElement(document.getElementById('unflagi')); =0A=
}=0A=
=0A=
=0A=
function refreshDrop() {=0A=
  hideDrop();=0A=
  showDrop();=0A=
}=0A=
=0A=
=0A=
function setBloggerFlagCookie() {=0A=
  var bloglist =3D ""=0A=
  if (getCookie(FLAG_COOKIE_NAME)) {=0A=
    bloglist =3D getCookie(FLAG_COOKIE_NAME)=0A=
    var blogarray =3D bloglist.split(",")=0A=
    if (blogarray.length >=3D MAX_FLAGGED_BLOGS) { =0A=
      blogarray.shift()  =0A=
    }=0A=
    InsertArray(blogarray, ID)=0A=
    bloglist =3D blogarray.toString(); =0A=
  } else {=0A=
    bloglist =3D ID=0A=
  } =0A=
  setCookie(FLAG_COOKIE_NAME, bloglist, null, null, '/', null)=0A=
 }   =0A=
=0A=
 =0A=
function removeBlogFromFlagCookie(){=0A=
  if (getCookie(FLAG_COOKIE_NAME)) {=0A=
    var bloglist =3D getCookie(FLAG_COOKIE_NAME);=0A=
    var blogarray =3D bloglist.split(",") =0A=
    if (FindInArray(blogarray, ID) > 0) {=0A=
      DeleteArrayElement(blogarray, ID)=0A=
      bloglist =3D blogarray.toString();=0A=
    }=0A=
    setCookie(FLAG_COOKIE_NAME, bloglist, null, null, '/', null);=0A=
  } =0A=
}=0A=
=0A=
=0A=
//--> </SCRIPT>

<DIV id=3Dflagi onmouseover=3DshowDrop() style=3D"POSITION: absolute"=20
onmouseout=3DhideDrop();>
<DIV id=3Dflagi-body>Notify Blogger about <A=20
href=3D"http://help.blogger.com/bin/answer.py?answer=3D1200"=20
target=3D_blank>objectionable content</A> on this page. </DIV></DIV>
<DIV id=3Dunflagi onmouseover=3DshowDrop() style=3D"POSITION: absolute"=20
onmouseout=3DhideDrop()>
<DIV id=3Dunflagi-body>You flagged this blog as having <A=20
href=3D"http://help.blogger.com/bin/answer.py?answer=3D1200"=20
target=3D_blank>objectionable content</A>. </DIV></DIV>
<DIV id=3Db-navbar><A id=3Db-logo title=3D"Go to Blogger.com"=20
href=3D"http://www2.blogger.com/">
<DIV id=3Dnavbar-logo></DIV></A>
<DIV class=3Db-mobile id=3Db-sms><A=20
href=3D"sms:?body=3DHi%2C%20check%20out%20Spatial%20thoughts...%20at%20ht=
tp%3A%2F%2Fgisindia.blogspot.com%2Findex.html">Send=20
As SMS </A></DIV>
<DIV id=3Db-search>
<TABLE cellSpacing=3D0 cellPadding=3D0>
  <TBODY>
  <TR>
    <TD class=3Dnavsearch vAlign=3Dcenter noWrap>
      <FORM id=3Dsearchthis style=3D"DISPLAY: inline"=20
      action=3Dhttp://gisindia.blogspot.com/search method=3Dget>
      <TABLE cellSpacing=3D0 cellPadding=3D0>
        <TBODY>
        <TR>
          <TD vAlign=3Dcenter><INPUT id=3Db-query name=3Dq> </TD>
          <TD class=3Dnavbutton vAlign=3Dcenter><NOSCRIPT><INPUT =
id=3Db-searchbtn=20
            title=3D"Search this blog" type=3Dimage alt=3D"Search This =
Blog"=20
            =
src=3D"http://www2.blogger.com/img/navbar/1/btn_search_this.gif">=20
            </NOSCRIPT>
            <SCRIPT type=3Dtext/javascript>document.write(" <div =
id\u003d\"b-search-this\" =
onclick\u003d\"document.getElementById(\'searchthis\').submit()\"> <div =
class\u003d\"bt1\">&nbsp;</div> <div class\u003d\"bt2\"> Search Blog =
</div> <div class\u003d\"bt1\">&nbsp;</div> </div> ");</SCRIPT>
          </TD>
          <TD class=3Dnavbutton vAlign=3Dcenter>
            <SCRIPT type=3Dtext/javascript>document.write(" <div =
onclick\u003d\"toggleFlag();\" id\u003d\"b-flag-this\" =
onmouseout\u003d\"hideDrop()\" onmouseover\u003d\"showDrop()\"> <div =
class\u003d\"bt1\">&nbsp;</div> <div class\u003d\"bt2\">  <div =
id\u003d\"bt-flag\"> <div id\u003d\"bt-flag-body\"> Flag Blog </div> =
<div style\u003d\"display:none\" id\u003d\"bt-unflag-body\"> Blog =
Flagged </div> </div>  </div> <div class\u003d\"bt1\">&nbsp;</div> =
</div> ");</SCRIPT>
          </TD></TR></TBODY></TABLE></FORM></TD>
    <TD vAlign=3Dcenter noWrap width=3D"100%"><A id=3Db-next=20
      =
href=3D"http://www.blogger.com/redirect/next_blog.pyra?navBar=3Dtrue">Nex=
t=20
      Blog=C2=BB </A></TD>
    <TD class=3Dnavbar-right vAlign=3Dcenter noWrap align=3Dright><A =
id=3Db-getorpost=20
      href=3D"http://www2.blogger.com/signup.g">Create Blog </A>| <A=20
      href=3D"http://www2.blogger.com/">Sign In=20
</A></TD></TR></TBODY></TABLE></DIV></DIV></BODY></HTML>

------=_NextPart_001_001B_01C7281E.B0BAA3A0--

------=_NextPart_000_0000_01C7281E.B051A8A0
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www2.blogger.com/js/backlink.js

// Global variable which is populated by the dynamic javascript =0A=
// retrieved from a request to the blogger server=0A=
var BL_Backlinks =3D new Array();=0A=
var BL_BacklinkCount =3D new Array();=0A=
=0A=
function BL_processBacklinkTemplate(templateHTML) {=0A=
  var finalHTML =3D "";=0A=
  for (i=3D0; i < BL_Backlinks.length; i++) {=0A=
    var html =3D templateHTML;=0A=
    html =3D =
html.replace(/(<|%3C)\$BlogBacklinkURL\$(>|%3E)/g,BL_Backlinks[i]["BlogBa=
cklinkURL"]);=0A=
    html =3D =
html.replace(/(<|%3C)\$BlogBacklinkURLEscaped\$(>|%3E)/g,escape(BL_Backli=
nks[i]["BlogBacklinkURL"]));=0A=
    html =3D =
html.replace(/&lt;\$BlogBacklinkTitle\$&gt;/g,BL_Backlinks[i]["BlogBackli=
nkTitle"]);=0A=
    html =3D =
html.replace(/&lt;\$BlogBacklinkSnippet\$&gt;/g,BL_Backlinks[i]["BlogBack=
linkSnippet"]);=0A=
    html =3D =
html.replace(/&lt;\$BlogBacklinkAuthor\$&gt;/g,BL_Backlinks[i]["BlogBackl=
inkAuthor"]);=0A=
    html =3D =
html.replace(/&lt;\$BlogBacklinkDateTime\$&gt;/g,BL_Backlinks[i]["BlogBac=
klinkDateTime"]);=0A=
    finalHTML +=3D html;=0A=
  }=0A=
  return finalHTML;=0A=
}=0A=
=0A=
function BL_writeBacklinks() {=0A=
  var dcomDiv =3D document.getElementById('blogger-dcom-block');=0A=
  if (dcomDiv !=3D null && dcomDiv.innerHTML) {=0A=
    var finalHTML =3D BL_processBacklinkTemplate(dcomDiv.innerHTML); =0A=
    // Add a div with a unique id to test if the subsequent write=0A=
    // succeeded=0A=
    if (finalHTML !=3D "") {=0A=
      finalHTML +=3D '<span id=3D"blogger-dcom-ihtest"></span>';=0A=
      dcomDiv.innerHTML =3D finalHTML;=0A=
      if (document.getElementById('blogger-dcom-ihtest')) {=0A=
        dcomDiv.style.display =3D "block";         	=0A=
      }=0A=
    }=0A=
  }=0A=
}=0A=
=0A=
function BL_addOnLoadEvent(func) {=0A=
  var oldonload =3D window.onload;=0A=
  if (typeof window.onload !=3D 'function') {=0A=
    window.onload =3D func;=0A=
  } else {=0A=
    window.onload =3D function() {=0A=
      oldonload();=0A=
      func();=0A=
    }=0A=
  }=0A=
}=0A=
=0A=
function BL_loadScript (url) {=0A=
  if (document.getElementById) {=0A=
    var script =3D document.createElement('script');=0A=
    script.defer =3D true;=0A=
    script.src =3D url;=0A=
    document.getElementsByTagName('head')[0].appendChild(script);=0A=
  }=0A=
}=0A=
=0A=
function BL_populateBacklinksCount() {=0A=
  var linkSpans =3D document.getElementsByTagName("span");=0A=
  var postQuery =3D "";=0A=
  for (var i=3D0; i < linkSpans.length; i++) {=0A=
    if (linkSpans[i].className =3D=3D "backlinkcount") {         =0A=
      var postId =3D linkSpans[i].id;	=0A=
      if (postId) {=0A=
        BL_BacklinkCount[postId] =3D linkSpans[i];=0A=
        postQuery +=3D "&postID=3D" + postId;=0A=
      }=0A=
    }=0A=
  }=0A=
  if (postQuery !=3D "") {=0A=
    var url =3D window.BL_backlinkURL + "?blogID=3D" + window.BL_blogId =
+ postQuery; =0A=
    BL_loadScript(url);	=0A=
  }=0A=
}=0A=
=0A=
BL_addOnLoadEvent(function() { BL_populateBacklinksCount(); })=0A=

------=_NextPart_000_0000_01C7281E.B051A8A0
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www2.blogger.com/js/backlink_control.js

if (document.getElementById) {=0A=
  var toggle_opened =3D new Image();=0A=
  var toggle_closed =3D new Image();=0A=
  // pre-loading the images=0A=
  toggle_opened.src =3D "http://www.blogger.com/img/triangle_open.gif";=0A=
  toggle_closed.src =3D "http://www.blogger.com/img/triangle.gif";=0A=
  document.write(['<style type=3D"text/css">',=0A=
                '.comment-toggler {',=0A=
                'background:url(',=0A=
	        toggle_closed.src,=0A=
		') no-repeat left center;',=0A=
	        'padding-right:11px;',=0A=
		'margin-right:0.1em;',=0A=
		'cursor:pointer;',=0A=
                'cursor:hand;',=0A=
	        '}',=0A=
	        '#blogger-dcom-block dd {',=0A=
		'display:none;',=0A=
		'margin-top:1em;',=0A=
		'padding-left:14px;',=0A=
		'margin-left:0.4em;',=0A=
		'}',=0A=
		'</style>'].join(""));=0A=
=0A=
  // Register old onmousedown function=0A=
  var BL_oldonmousedown =3D document.onmousedown; =0A=
=0A=
  document.onmousedown =3D function(e) {  =0A=
   =0A=
    var shouldPropagate =3D true;=0A=
=0A=
    var target =3D window.event ? window.event.srcElement : e.target;=0A=
	    =0A=
    if (target.className =3D=3D "comment-toggler") {=0A=
      var dt =3D target.parentNode;=0A=
      var dd =3D dt.nextSibling;=0A=
		=0A=
      while (dd.tagName !=3D "DD") {=0A=
        dd =3D dd.nextSibling; =0A=
      }=0A=
		=0A=
      if (dd.style.display =3D=3D "block") {=0A=
        dd.style.display =3D "none";=0A=
        target.style.backgroundImage =3D "url(" + toggle_closed.src + =
")";=0A=
      } else {=0A=
        dd.style.display =3D "block";=0A=
        target.style.backgroundImage =3D "url(" + toggle_opened.src + =
")";=0A=
      } =0A=
      shouldPropagate =3D false;	=0A=
    }	    =0A=
    // call old onmousedown function if registered 	=0A=
    if (typeof window.BL_oldonmousedown =3D=3D 'function') {=0A=
      return window.BL_oldonmousedown(e);=0A=
    }=0A=
    return shouldPropagate;    =0A=
  }=0A=
}=0A=
=0A=

------=_NextPart_000_0000_01C7281E.B051A8A0
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.statcounter.com/counter/counter.js

var sc_width=3Dscreen.width;	=09
var sc_referer =3D ""+document.referrer;
// var sc_referer =3D parent.document.referrer;
var sc_title =3D "";
var sc_url =3D "";
var sc_unique =3D 0;
var sc_returning =3D 0;
var sc_returns =3D 0;
var sc_agent =3D navigator.appName+' '+navigator.appVersion;
var sc_base_dir;
var sc_error=3D0;
var sc_remove=3D0;
var sc_http_url=3D"http";
var sc_link_back_start =3D "";
var sc_link_back_end =3D "";
var sc_security_code =3D "";


if(window.sc_https) {
	if(sc_https=3D=3D1) {
		sc_doc_loc =3D ''+document.location;
		myRE =3D new RegExp("^https", "i")
		if(sc_doc_loc.match(myRE)) {
			sc_http_url =3D "https";
		}
		else {
			sc_http_url =3D "http";
		}
	}
	else
		sc_http_url =3D "http";
}


if(window.sc_partition) {
	var sc_counter =3D sc_partition+1;
	sc_base_dir =3D sc_http_url+"://c"+sc_counter+".statcounter.com/";
}
else {
	sc_base_dir =3D sc_http_url+"://c1.statcounter.com/";
	var sc_partition=3D0;
}

if(window.sc_text)
	sc_base_dir +=3D "text.php?";
else
	sc_base_dir +=3D "t.php?";

if(window.sc_project) {
	sc_base_dir +=3D "sc_project=3D"+sc_project;
	=
if((sc_project=3D=3D1395484)||(sc_project=3D=3D1395532)||(sc_project=3D=3D=
1300900)||(sc_project=3D=3D1420550)||(sc_project=3D=3D1301977)||(sc_proje=
ct=3D=3D1299576)||(sc_project=3D=3D1286300))
		sc_remove=3D1;
}
else if(window.usr) {
	sc_base_dir +=3D "usr=3D"+usr;
}
else {
	sc_error =3D 1;
}

if(window.sc_remove_link) {
	sc_link_back_start =3D "";
	sc_link_back_end =3D "";
}
else {
	sc_link_back_start =3D "<a href=3D\"http://www.StatCounter.com\" =
target=3D\"_blank\">";
	sc_link_back_end =3D "<\/a>";
}

sc_date =3D new Date();
sc_time =3D sc_date.getTime();
sc_agent =3D sc_agent.toUpperCase();

sc_time_difference =3D 60*60*1000;

sc_title =3D ""+document.title;
sc_url =3D ""+document.location;
sc_referer =3D sc_referer.substring(0, 150);
sc_title =3D sc_title.substring(0, 150);
sc_url =3D sc_url.substring(0, 150);
sc_referer =3D escape(sc_referer);
sc_title =3D escape(sc_title);
sc_url =3D escape(sc_url);

if (window.sc_security) {
	sc_security_code =3D sc_security;
}

var sc_tracking_url =3D =
sc_base_dir+"&resolution=3D"+sc_width+"&camefrom=3D"+sc_referer+"&u=3D"+s=
c_url+"&t=3D"+sc_title+"&java=3D1&security=3D"+sc_security_code+"&sc_rand=
om=3D"+Math.random();

// if no usr or project set then display visibile

// if usr=3D=3D"someuser" then display visibile

if(sc_error=3D=3D1) {
		document.writeln("Code corrupted. Insert fresh copy.");
}
else if(sc_remove=3D=3D1) {
		document.writeln("<b>StatCounter cannot track a high volume website =
like yours for free. This was stated several times during the sign up =
process. Please remove the code ASAP.</b>");
}
//else if(sc_partition=3D=3D6) {
	// down at the moment
//}
else if (window.sc_invisible) {
	if(window.sc_invisible=3D=3D1) {
	sc_img =3D new Image();
	sc_img.src =3D sc_tracking_url;
	}
	else {
		document.writeln(sc_link_back_start+"<IMG =
SRC=3D\""+sc_tracking_url+"\" ALT=3D\"StatCounter - Free Web Tracker and =
Counter\" BORDER=3D\"0\">"+sc_link_back_end);
	}
}
else if (window.sc_text) {
	document.writeln('<scr' + 'ipt language=3D"JavaScript"' + ' src=3D' + =
sc_tracking_url+"&text=3D" + sc_text+ '></scr' + 'ipt>');
}
else {
	document.writeln(sc_link_back_start+"<IMG SRC=3D\""+sc_tracking_url+"\" =
ALT=3D\"StatCounter - Free Web Tracker and Counter\" =
BORDER=3D\"0\">"+sc_link_back_end);
}

------=_NextPart_000_0000_01C7281E.B051A8A0
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www2.blogger.com/dyn-js/backlink.js?blogID=31163501&postID=4166197368899219948

=0A=
var backlink;=0A=

------=_NextPart_000_0000_01C7281E.B051A8A0
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://embed.technorati.com/embed/c2w6t4msh.js

<!--=0A=
drawTREmbed( '<div id=3D"technorati">' +=0A=
'<form id=3D"te_s" method=3D"post" =
action=3D"http://www.technorati.com/search.php">' +=0A=
'<label for=3D"te_search">Search this blog:</label> <input =
id=3D"te_search" type=3D"text" size=3D"12" name=3D"s" maxlength=3D"255" =
/>' +=0A=
'<input type=3D\"submit\" class=3D\"btn\" value=3D\"Search\" /> <input =
type=3D\"hidden\" name=3D\"sub\" value=3D\"searchlet\" /> <input =
type=3D\"hidden\" name=3D\"from\" =
value=3D\"http://gisindia.blogspot.com\" /> <input type=3D\"hidden\" =
name=3D\"cc\" value=3D\"c2w6t4msh\" /> </form>' +=0A=
'<p id=3D"te_l" class=3D"te_l">' +=0A=
'<a =
href=3D"http://www.technorati.com/search/http://gisindia.blogspot.com?cc=3D=
c2w6t4msh" id=3D"te_lh">&#187 Blogs that link here</a>' +=0A=
'</p>' +=0A=
'<p id=3D"te_lo" class=3D"te_lo"><a =
href=3D"http://www.technorati.com/?cc=3Dc2w6t4msh"><img border=3D"0" =
src=3D"http://static.technorati.com/pix/tn-tiny.gif" alt=3D"Powered by =
Technorati" /></a></p>' +=0A=
'</div>'=0A=
);=0A=
=0A=
=0A=
function drawTREmbed(s){=0A=
    document.write(s);=0A=
}=0A=
// -->=0A=

------=_NextPart_000_0000_01C7281E.B051A8A0--

