From: <Saved by Windows Internet Explorer 7>
Subject: =?Windows-1252?Q?The_latest_Real_Estate_News_=96_Melinda_Flynn_=96_News?=
Date: Fri, 9 Nov 2007 05:35:18 -0800
MIME-Version: 1.0
Content-Type: multipart/related;
	type="text/html";
	boundary="----=_NextPart_000_0061_01C82292.502B3E40"
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.3198

This is a multi-part message in MIME format.

------=_NextPart_000_0061_01C82292.502B3E40
Content-Type: text/html;
	charset="utf-8"
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.melindaflynn.com/News?ID=65115

=EF=BB=BF<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML xmlns=3D"http://www.w3.org/1999/xhtml"><HEAD><TITLE>The latest =
Real Estate News =E2=80=93 Melinda Flynn =E2=80=93 News</TITLE>
<META http-equiv=3DContent-Type content=3D"text/html; charset=3Dutf-8">
<META http-equiv=3DExpires content=3D-1>
<META http-equiv=3DPragma content=3Dno-cache>
<META=20
content=3D"Palos Verdes Estates, CA, real estate, listings, home buying, =
home selling, Realtor, homes for sale, real estate agent, broker, =
relocation, land, residential, property, house, properties, multiple =
listing service, mls, moving"=20
name=3Dkeywords>
<META=20
content=3D"Get all the lastest real estate news stories here. Melinda =
Flynn, Palos Verdes Estates CA"=20
name=3Ddescription><LINK href=3D"http://www.melindaflynn.com/Styles.css" =

type=3Dtext/css rel=3Dstylesheet><LINK=20
href=3D"http://www.melindaflynn.com/templates/themes/transition/styleShee=
t.css"=20
type=3Dtext/css rel=3Dstylesheet>
<SCRIPT src=3D"http://www.melindaflynn.com/scripts/flashobject.js"=20
type=3Dtext/javascript></SCRIPT>

<SCRIPT src=3D"http://www.melindaflynn.com/scripts/themeScripts.js"=20
type=3Dtext/javascript></SCRIPT>

<SCRIPT src=3D"http://www.melindaflynn.com/scripts/flashPopup.js"=20
type=3Dtext/javascript></SCRIPT>
<!-- chat includes -->
<SCRIPT src=3D"http://www.melindaflynn.com/chat/js/Ajax4SoapBox.js"=20
type=3Dtext/javascript></SCRIPT>

<SCRIPT =
src=3D"http://www.melindaflynn.com/chat/js/Ajax4SoapBoxMethods.js"=20
type=3Dtext/javascript></SCRIPT>

<SCRIPT src=3D"http://www.melindaflynn.com/chat/js/chat.js"=20
type=3Dtext/javascript></SCRIPT>

<SCRIPT src=3D"http://www.melindaflynn.com/chat/js/yahoo.js"=20
type=3Dtext/javascript></SCRIPT>

<SCRIPT src=3D"http://www.melindaflynn.com/chat/js/event.js"=20
type=3Dtext/javascript></SCRIPT>

<SCRIPT src=3D"http://www.melindaflynn.com/chat/js/connection.js"=20
type=3Dtext/javascript></SCRIPT>

<SCRIPT type=3Dtext/javascript>
        	function chatNotifyFinalAdjustment(nAdjustmentAmount){
    			if (what =3D=3D "dom1"){
    				var objChatDiv =3D document.getElementById("flashPopupChat");
    			}
    			else{
    				var objChatDiv =3D document.all["flashPopupChat"];
    			}
    		=09
    			if (objChatDiv.style.top !=3D "200px"){
	    			var currentTop =3D =
Number(objChatDiv.style.top.substring(0,objChatDiv.style.top.indexOf("px"=
)));
	    			currentTop +=3D nAdjustmentAmount;    		=09
	    			objChatDiv.style.top =3D currentTop + "px";
    			}
    			else{
    				klugeForTopTheme =3D nAdjustmentAmount;
    			}

        	}
        =09
        </SCRIPT>

<META content=3D"MSHTML 6.00.6000.16544" name=3DGENERATOR></HEAD>
<BODY leftMargin=3D0 topMargin=3D0 onload=3DflashPopupInit();>
<DIV id=3DflashPopupNavLeft onmouseover=3DstopTime();=20
style=3D"Z-INDEX: 999; LEFT: -200px; VISIBILITY: visible; WIDTH: 5px; =
POSITION: absolute; TOP: 200px; HEIGHT: 5px"=20
onmouseout=3DstartTime();><!-- alt content goes here, renders when the =
user doesn't have the proper flash file --></DIV>
<DIV id=3DflashPopupChat=20
style=3D"Z-INDEX: 999; LEFT: 200px; VISIBILITY: hidden; WIDTH: 5px; =
POSITION: absolute; TOP: 200px; HEIGHT: 5px"></DIV>
<TABLE class=3Dmain id=3DflashNav height=3D"100%" cellSpacing=3D0 =
cellPadding=3D0=20
width=3D759 align=3Dcenter border=3D0>
  <TBODY>
  <TR>
    <TD class=3Dtop width=3D759 colSpan=3D3 height=3D100>
      <DIV id=3DtopFlashNav><!-- needs flash plugin --></DIV></TD></TR>
  <TR>
    <TD class=3Dnav style=3D"BORDER-LEFT: #000066 1px solid" =
vAlign=3Dtop width=3D140>
      <DIV id=3DleftFlashNav onmouseover=3DstopTime(); =
onmouseout=3DstartTime();><!-- needs flash plugin --></DIV></TD>
    <SCRIPT type=3Dtext/javascript>
					// initialize chat vars
					var _AWSAccountsID =3D 315138;
					var _Server =3D 'im.alamode.com';
					var _GUID =3D 'zxjrqk55klhchjjlodsc2p45';
					var _IP =3D '24.24.210.118';
					var _LO =3D '';
					var _UID =3D 'guest_' + _AWSAccountsID + '_' + _GUID;
					var _FromRequest =3D false;
					var _InChat =3D false;
					var _PageID =3D 31091820;
				=09
					//Other Page Vars
					var dtDate =3D new Date();
					var szPageGuid =3D dtDate.getUTCMilliseconds().toString();
					var objSecNav;
					var objChatNotification;

					function LoadChatNotification(){					=09
						var foChatNotification =3D new =
FlashObject("/templates/ChatNotification.swf", "chatNotification", =
"245", "138", 8, "#FFFFFF");
						foChatNotification.addParam("scale", "noscale");
						foChatNotification.addParam("salign", "lt");
						foChatNotification.addParam("menu", "false");
						foChatNotification.addVariable("host", "www.melindaflynn.com");
						foChatNotification.write("flashPopupChat");
					=09
						if (document.getElementById("chatNotification") !=3D undefined){
							objChatNotification =3D =
document.getElementById("chatNotification");
						}
						else {
							objChatNotification =3D =
document.getElementById("chatNotification2");
						}=09
					}		=09
			=09
					// <![CDATA[
					var foTop =3D new =
FlashObject("/templates/themes/FamilyTop/TopNav.swf", "topNav", "759", =
"300", 8, "#FFFFFF", "/XSitesBasic/HTMLSite.aspx");
					foTop.addVariable("host", "www.melindaflynn.com");
					foTop.addVariable("AWSAccountsID", "315138");
					foTop.addVariable("ChosenLanguage", "English");
					foTop.addVariable("sitename", "/xSites/Agents/melindaflynn/");
					foTop.addVariable("FileName", "news.x");
					foTop.addVariable("IsMaster", "True");
					foTop.addVariable("lcGuid", szPageGuid);
					foTop.addVariable("OS", BrowserDetect.OS);
					foTop.addParam("wmode", "transparent");
					foTop.addParam("scale", "noscale");
					foTop.addParam("salign", "lt");
					foTop.addParam("menu", "false");
					foTop.write("topFlashNav");

					function loadLeftNav(){
						var foSec =3D new =
FlashObject("/templates/themes/FamilyTop/LeftNav.swf", "leftNav", "140", =
"650", 8, "#FFFFFF");
						foSec.addVariable("host", "www.melindaflynn.com");
						foSec.addVariable("AWSAccountsID", "315138");
						foSec.addVariable("ChosenLanguage", "English");
						foSec.addVariable("sitename", "/xSites/Agents/melindaflynn/");
						foSec.addVariable("lcGuid", szPageGuid);
						foSec.addVariable("OS", BrowserDetect.OS);
						foSec.addVariable("FileName", "news.x");
						foSec.addParam("scale", "noscale");
						foSec.addParam("salign", "lt");
						foSec.addParam("menu", "false");
						foSec.write("leftFlashNav");
					=09
						if (document.getElementById("leftNav") !=3D undefined){
							objSecNav =3D document.getElementById("leftNav");
						}
						else if (document.getElementById("leftNav2") !=3D undefined){
							objSecNav =3D document.getElementById("leftNav2");
						}
					}
				=09
					var foDiv =3D new =
FlashObject("/templates/themes/nestedNav/style1.swf", "popupSwf", "200", =
"25", 8, "#FFFFFF");
					foDiv.addVariable("host", "www.melindaflynn.com");
					foDiv.addVariable("AWSAccountsID", "315138");
					foDiv.addVariable("sitename", "/xSites/Agents/melindaflynn/");
					foDiv.addVariable("ChosenLanguage", "English");
					foDiv.addVariable("lcGuid", szPageGuid);
					foDiv.addVariable("OS", BrowserDetect.OS);
					foDiv.addParam("scale", "noscale");
					foDiv.addParam("salign", "lt");
					foDiv.addParam("menu", "false");
					foDiv.write("flashPopupNavLeft");
			=09
					function getChatAvailability()
					{
						DoLogin();
					}=09
				=09
					function LaunchChatWindow()
					{
						window.open("../Chat/Chat.aspx?ID=3D" + _UID + "&LO=3D" + _LO, =
null, =
"height=3D270,width=3D230,status=3Dno,toolbar=3Dno,menubar=3Dno,location=3D=
no");
						HideChatNotification();=09
					}				=09
					// ]]>
				</SCRIPT>

    <TD style=3D"BORDER-RIGHT: #000066 1px solid" vAlign=3Dtop =
width=3D626=20
    bgColor=3D#ffffff>
      <TABLE cellSpacing=3D0 cellPadding=3D7 width=3D"100%" border=3D0>
        <TBODY>
        <TR>
          <TD>
            <TABLE cellSpacing=3D0 cellPadding=3D10 width=3D"100%" =
border=3D0>
              <TBODY>
              <TR>
                <TD><!----></TD></TR>
              <TR>
                <TD>
                  <CENTER>
                  <TABLE width=3D"90%">
                    <TBODY>
                    <TR>
                      <TD><FONT face=3Darial size=3D3><STRONG>Is buying =
home today=20
                        a good investment?</STRONG></FONT>=20
                        <HR width=3D"80%" noShade>

                        <BLOCKQUOTE><FONT face=3Darial =
size=3D2><B>Answer depends=20
                          on whether goals are short- or =
long-term</B></FONT>=20
                          <P align=3Dright><FONT face=3Darial =
size=3D2><I>Monday,=20
                          November 05, 2007</I></FONT></P>
                          <P><STRONG><FONT face=3Darial =
size=3D2>By&nbsp;Dian=20
                          Hymer<BR><A href=3D"http://www.inman.com/"=20
                          target=3D_blank>Inman News</A> =
</FONT></STRONG>
                          <P><FONT face=3Darial size=3D2><IMG=20
                          =
src=3D"http://inman.com/images/Columnist/174.jpg"=20
                          align=3Dright>=20
                          <P>Up until the recent slowdown, homeowners in =
many=20
                          parts of the country saw the value of their =
homes rise=20
                          rapidly. Home prices, in many areas, seemed to =
move in=20
                          just one direction: up.</P>
                          <P>A combination of record-low interest rates =
and=20
                          rapid price appreciation turned many =
homeowners into=20
                          serial refinancers. When interest rates =
dropped, one=20
                          mortgage was exchanged for another, sometimes =
several=20
                          times within one year. </P>
                          <P>As home values rose, cash-out refinances =
allowed=20
                          homeowners to pull equity out of their homes =
to=20
                          remodel, send children to college, take =
vacations and=20
                          buy new cars. It was good for the economy =
while wiping=20
                          out billions of dollars of homeowner equity. =
</P>
                          <P>Tapping into home equity seemed like a =
great idea=20
                          until the housing market softened. Now there =
are=20
                          millions of homeowners around the country who =
can't=20
                          sell their home for enough to pay off the =
loans=20
                          secured against the property. </P>
                          <P>HOUSE HUNTING TIP: Buying a home is still a =
good=20
                          investment if you can afford it, if you are =
ready to=20
                          put down roots in a community, and if you want =
to=20
                          invest in your personal happiness. Profit =
potential=20
                          shouldn't be your only reason for buying a =
home, even=20
                          though in most cases your home will appreciate =
in=20
                          value if you maintain it and if you own it =
long=20
                          enough.</P>
                          <P>The housing market, like any economic =
market, is=20
                          cyclical. There are periods of robust activity =

                          followed by periods of sluggishness. Prices =
can go=20
                          down as well as up. Now that the market has =
softened=20
                          in most areas, it's time to look at owning =
your home=20
                          as a way to gain control over your personal =
domain --=20
                          not as a source of quick cash.</P>
                          <P>In the areas that were previously hot, we =
are=20
                          unlikely to see such significant home-price=20
                          appreciation in the near future. So, if you're =

                          considering buying in one of these areas, =
think in=20
                          terms of buying for the long term. If your =
future is=20
                          uncertain, it might make more sense to =
rent.</P>
                          <P>Some niche markets in South Carolina, =
Idaho,=20
                          Washington, Texas and Utah are experiencing=20
                          double-digit home-price appreciation while the =
country=20
                          on a whole is suffering a slowdown. If you are =
buying=20
                          in such a market, take a lesson from the =
numerous=20
                          homeowners who bought using risky mortgages =
and=20
                          extinguished their equity through successive=20
                          refinances. </P>
                          <P>Pay careful attention to how you finance =
your home=20
                          purchase. The cheapest loan possible may be =
not be the=20
                          best loan if it requires you to refinance or =
sell=20
                          within the next few years. If the market slows =
and you=20
                          are no longer earning appreciation on your =
home,=20
                          refinancing could be a problem. If the market =
is soft=20
                          then, you could have difficulty selling.</P>
                          <P>One of the best investment strategies is to =
buy=20
                          when the market is soft, not when it's racing =
forward=20
                          perhaps toward a peak. It's also a time when =
you'll=20
                          find the least competition from other buyers, =
most of=20
                          whom will wait to buy until the market has =
already=20
                          turned.</P>
                          <P>Don't forget to consider the tax advantages =
of home=20
                          ownership when considering whether home =
ownership=20
                          makes sense for you. Generally, property taxes =
and=20
                          interest paid on mortgages up to $1 million on =
your=20
                          primary residence can be deducted for =
income-tax=20
                          purposes. Restrictions apply, so consult your =
tax=20
                          adviser before making a move.</P>
                          <P>The tax advantage of home ownership should =
not be=20
                          your sole reason for buying. Owning your own =
home is a=20
                          big commitment financially as well as in terms =
of the=20
                          time and energy you will spend maintaining and =

                          improving your property. </P>
                          <P>THE CLOSING: In some countries, such as =
Australia,=20
                          there is no tax break for owning a home. =
Nevertheless,=20
                          people still buy houses there.</P>
                          <P><EM>Dian Hymer is author of "House Hunting, =
The=20
                          Take-Along Workbook for Home Buyers" and =
"Starting=20
                          Out, The Complete Home Buyer's Guide," =
Chronicle=20
                          Books.</EM></P><!--BEGIN CONTACT-->
                          <P align=3Dcenter>***</P>
                          <P class=3Dcontactinfo>What's your opinion? =
Send your=20
                          Letter to the Editor to <A=20
                          =
href=3D"mailto:opinion@inman.com">opinion@inman.com</A>.</P><!--END =
CONTACT--></FONT>
                          <P><FONT face=3Darial size=3D1>Copyright 2007 =
Dian=20
                          Hymer</FONT> </P></BLOCKQUOTE><!-- cut from =
here!!!djg: 11/09/1998 --><!-- cut to here!!!djg: 11/09/1998 =
--></TD></TR></TBODY></TABLE></CENTER>
                  <HR>
                  <A href=3D"http://www.melindaflynn.com/News">Back</A>=20
              </TD></TR></TBODY></TABLE>
            <SCRIPT =
src=3D"http://www.melindaflynn.com/scripts/flashobject_fp8.js"=20
            type=3Dtext/javascript></SCRIPT>

            <TABLE cellSpacing=3D0 cellPadding=3D0 width=3D"100%" =
border=3D0>
              <TBODY>
              <TR>
                <TD><!--<img src=3D"/graphics/shim.gif" border=3D"0" =
width=3D"10" height=3D"10">--></TD>
                <TD vAlign=3Dtop width=3D"100%"></TD>
                <TD><!--<img src=3D"/graphics/shim.gif" border=3D"0" =
width=3D"10" height=3D"10">--></TD></TR></TBODY></TABLE><!--<div =
id=3D"FormsLayer" style=3D"position:absolute; width:368px; height:178; =
z-index:2; left: 0; top: 0; visibility: visible;"></div>-->
            <DIV class=3DtableText align=3Dcenter>
            <DIV class=3DtableText align=3Dcenter><BR>Melinda Flynn 68 =
Malaga Cove=20
            Plaza Palos Verdes Estates, CA 90274<BR></DIV><SPAN>Phone:=20
            310-265-4222 Direct</SPAN> <SPAN>Fax: 310-347-4018</SPAN> =
<SPAN>
            <SCRIPT language=3Djavascript> var username =3D 'homes'; var =
hostname =3D 'melindaflynn.com'; document.write('<span>E-mail: <a =
href=3Dmail' + 'to:' + username + '@' + hostname + '>' + username + '@' =
+ hostname + '</a>');</SCRIPT>

            <P><A href=3D"http://www.melindaflynn.com/ContactUs"><SPAN=20
            style=3D"WHITE-SPACE: nowrap">Client Appreciation</SPAN></A> =
| <A=20
            href=3D"http://www.melindaflynn.com/FreeHomeValuation"><SPAN =

            style=3D"WHITE-SPACE: nowrap">Free Home Valuation</SPAN></A> =
| <A=20
            =
href=3D"http://www.melindaflynn.com/MelindasMissionStatement"><SPAN=20
            style=3D"WHITE-SPACE: nowrap">Mission Statement</SPAN></A> | =
<A=20
            href=3D"http://www.melindaflynn.com/Partyphotos"><SPAN=20
            style=3D"WHITE-SPACE: nowrap">Party Photos!</SPAN></A> | <A=20
            =
href=3D"http://www.melindaflynn.com/www.MelindaFlynn.com"><SPAN=20
            style=3D"WHITE-SPACE: nowrap">Melinda's Blog</SPAN></A> | <A =

            href=3D"http://www.melindaflynn.com/LookingtoBuy"><SPAN=20
            style=3D"WHITE-SPACE: nowrap">Looking to Buy?</SPAN></A> | =
<A=20
            href=3D"http://www.melindaflynn.com/LookingtoSell"><SPAN=20
            style=3D"WHITE-SPACE: nowrap">Looking to Sell?</SPAN></A> | =
<A=20
            href=3D"http://www.melindaflynn.com/HomePage"><SPAN=20
            style=3D"WHITE-SPACE: nowrap">Home Page</SPAN></A> | <A=20
            =
href=3D"http://www.melindaflynn.com/NeighborhoodPrices"><SPAN=20
            style=3D"WHITE-SPACE: nowrap">Neighborhood Prices</SPAN></A> =
| <A=20
            =
href=3D"http://www.melindaflynn.com/MortgageCalculators"><SPAN=20
            style=3D"WHITE-SPACE: nowrap">Mortgage =
Calculators</SPAN></A> | <A=20
            =
href=3D"http://www.melindaflynn.com/RequestIndustryInfo"><SPAN=20
            style=3D"WHITE-SPACE: nowrap">FREE REPORTS</SPAN></A> | <A=20
            =
href=3D"http://www.melindaflynn.com/Reasonshomesdon'tsell"><SPAN=20
            style=3D"WHITE-SPACE: nowrap">Reasons homes don't =
sell</SPAN></A> | <A=20
            =
href=3D"http://www.melindaflynn.com/EthicsinRealEstate"><SPAN=20
            style=3D"WHITE-SPACE: nowrap">Ethics in Real =
Estate</SPAN></A>
            <P>Copyright =C2=A9 2007&nbsp;Melinda Flynn<BR>Portions =
Copyright =C2=A9 2007=20
            a la mode, inc.<BR>Another XSite by <A=20
            href=3D"http://www.alamode.com/" target=3D_blank>a la mode,=20
            inc.</A>&nbsp;|&nbsp;<A=20
            =
href=3D"https://melindaflynn.agentxsites.com/apps/alamodelogin/login.aspx=
">Admin=20
            Login</A>|&nbsp;<A=20
            href=3D"http://www.melindaflynn.com/TermsOfUse">Terms of=20
            Use</A>|&nbsp;<A =
href=3D"http://www.melindaflynn.com/SiteMap">Site=20
            Map</A><BR>All rate, payment, and area information are =
estimates and=20
            approximations=20
  =
only.</P></DIV></SPAN></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE=
>
<TABLE class=3Dmain=20
style=3D"BORDER-RIGHT: #000066 1px solid; BORDER-LEFT: #000066 1px =
solid"=20
cellSpacing=3D0 cellPadding=3D0 width=3D759 align=3Dcenter border=3D0>
  <TBODY>
  <TR height=3D90>
    <TD>&nbsp;</TD></TR>
  <TR>
    <TD width=3D759></TD></TR>
  <TR>
    <TD bgColor=3D#000066 =
height=3D5>&nbsp;</TD></TR></TBODY></TABLE></BODY></HTML>

------=_NextPart_000_0061_01C82292.502B3E40
Content-Type: image/jpeg
Content-Transfer-Encoding: base64
Content-Location: http://inman.com/images/Columnist/174.jpg

/9j/4AAQSkZJRgABAQEBLAEsAAD/2wBDAAYEBAQFBAYFBQYJBgUGCQsIBgYICwwKCgsKCgwQDAwM
DAwMEAwODxAPDgwTExQUExMcGxsbHCAgICAgICAgICD/2wBDAQcHBw0MDRgQEBgaFREVGiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICD/wAARCACCAGQDAREA
AhEBAxEB/8QAHAAAAQUBAQEAAAAAAAAAAAAABAEDBQYHAgAI/8QAPRAAAQIEBAMFBQcDAwUAAAAA
AQIDAAQFEQYSITETIkEHMlFhkRRCcYGxFSNSYnKhwSQzgkPR4VSSsvDx/8QAGQEAAwEBAQAAAAAA
AAAAAAAAAAEEAwIF/8QAJBEBAAICAgMAAgIDAAAAAAAAAAECAxEhMQQSQRMyInGBofD/2gAMAwEA
AhEDEQA/AIhLcduTgahg6lmGR3gQARJ02Ymn0sS7fEdVsnb1J0EczOjiNrnT+zFkIbcrVWakg53W
WhxHD62H1jGfJq0jDKfX2NYdfZvKVSYbcOxdQkj0skwRniROOUFV+x+sSKC5LzLU0kbe4T63jv8A
I59VGdknW1lC0ZVDe8aOXHs8BOSxADZYhhwWYAdQzCM+liAjyWIAkKbSX514NtgWuMyjoBHF7xXt
1WsytjtAqdLlAqnS44qtC/lzn9RBiLJM3/pVSIqFla7R6asuTzqp6oDvurOx68o5v4jLhryKZ7Uq
g/NCXkWkMt3sXAlPFt/ndP7R3F3P41wYxS6pkJemmASOfOc9v+3IkR1F5cTSAzVJw5V5l9l5pD57
/FSi2qhrbuneH+WYkpxxpV8X9nRpjKp+mrL8mn+80rvt+fmn9xFOPLEsLU0pZlxGzNwpgeEANcCG
HTbXlCMQhqAOnyiXllvuaJbHqegjm9vWDrXZih41mpRTqmUN3TpnVqhvqSbW2Eefe0ytrQPO9qmJ
5xt1uVmAiWJyhSU5Cr5JtpHOnUQqiK5PzU7lKQu+6iD9fhD1A5Es1SooWokobb8RmUf30hcHynKL
iltL7YfvwQbJubXPXboIcFLacKVGlTkoJjiEObIcB6fp8I0szWCXq8s3MGSmVAOEaX2Wk/Hxjitt
C1dsuxZRG6bWHWmR/TOfeMeGU9PlF2K+4S3jUoMtRo5NlmGTyWo5M8lEMInEzzSJdptZtqVn4Abx
N5Mt8EIKmOS8xSktoV924TnV89R+0R2V1WKRocjLU9RUAltCcx/Udz6mM7S1rU9Q8OtuSfGbZGVX
dPXmgmXVamZrCNw7cWWtYTbawjn2O0Iqt4WeRzpQQVEIatpYCNK35ZzR1QKnVaYoyilaJUUi/QBw
ERpM7Z60uy8Ue1U0TTlyqSJyLB5svh67RmHnKy3VJJo5ytSLHXpmTr+8V+LPxN5EBCiLExOHDI2B
HJuhDCg48nlor8vL/wCmplIA+N4k8jtTg6ROHS63T0tXuriEeqr7RNkVYoaXRqXN1dxuXUVIk2yO
MRuo9ED49YwUtUkaExKpF0ABGqQdAmydPSNoqymyGmqS57cwnh6uXcy+R2jLXLrYPE8s3LyzTpQC
lpdzBJs6rPAQpUwBve3rvHUMrIV+vpYpRkU/6xBcPgAbWjWKstvYEqr66v7Lf7lxKjbyAuPpG+H9
mWX9Wh2ixGS0ACiEbqGGf9pkoBNyk2o5QpORKvzJ1H1ifNDfCN7PqL9oKaecs2tQzeIF9zEt4WUa
gzOy1LQlmnTCJh1rUtIRf4m4jiKteZWSQrX2gWkElJ7y21dfL4QpGiVDESJBx95zK5MnRKD3v+IN
yPVDTM1NVqUcQltpQX7qV3Uk/CFMSe4hlmLG35VvItCgGeVaR+r+YdYZ3lQqs6UKV14ibE+HUxvC
eVs7K5Fb0zM1Ips0yjgNk9VK1Pon6xvhrztjlt8aRFLAtoCBCOTdCGFS7T5Jb+HeMgXVLrCvl1jH
MowfU92a0uXmKAwhlRQ4WQm/5j3rRFft6GOvG0tK9mlMl3WyX3yUH70A8znNmspXh8LRpF3E03O1
mlEJkagw024p3KjVTm/W23pGdmmtmJdCJ56dUVcNxSwLpSCco71j0J8YKHaNKtM4NxOzOmbYqqlO
IWCyq/uX1SoaknzjS0xpxWLb5kNjSnOOyjyCPvi3cr/MIzqL1Y63TpyqrQy0ffAWR0H/ANjaGFKe
06bNh2lNUuksyqAEnvuZdBmVvFOPpJn/AHnSTjVkWAARCDsQAFWJBNQkjKK7rpyn/LSM8vTXBP8A
J7s8bXIvPSixYy9k28+sefkevgnjTS0uNJYLiz+kDcxzB2hE0GalJ+dmVIdSstp5k3ykE9Nd40iH
MyaosxKO1V2XDqeJmVmCDcpKfxRxMHtOv2bbUkgH80c7OIZnjGccUosoVqq+3SNMcOM8orB2G1yU
u6/NNWMxYoJ8lX/4jekblNNvWsz9WqLXmlhgl4ABBjk3YMBFIBFoUxs4nTimS82qqvuNnM5ZBXb3
hY6/HSPPzV9Xq+Pk3G03OYnpVJWGalMIYmDs2rVR/Skan0jKtdqN7Bs1LAVafUt6fVKvJTq5ZxnM
jqMwjaKy7tgvHzZyn1fBUhmZp0/Loy6DMciz81WJji1ZKcd69wlHqk67Jl1POi3KtOoPzEZaKLKY
85L/AGil2c2UsC38GKKxxwly255WGdf4rvJYNJACAPrFeHHpDmy+weN2D0AehhHxmCi8MHRAD1Mm
vYqw08r+08OGr9Q29QTEvk1+rfEt8EY4pn2guVn5FKPtKU55V476iyk384nx20viKzxboTQ8UVOb
YSmqUaWK21DMp5teYlBvcZULGpjR3Pg1r+t5/wC/ygKxT6piOY4E/IS9Oo6FFORpsJccG1r97bc6
Qe+ivgxV+zef9Lck06nURMow0hhhpOVtpAsEjuj+Yn7lxvanyi252ccmB3EK5RF2CHn+TZJ5hFKQ
t4YLcQw5JhBHJjgzggBQq0MG5wF2UdbSbOFJyHwUNU/vHNo3Dqs6k7hbETU+hErOHI6ka/7iPOmH
q0ttoVOkUFq5XomCIdWRFZVLSt3FK5htm6RyagVatTdSe9gkbkuHmV4JjuGUyhp7FsvheqM0hxgv
h5AcceBsUm+W1uu0VYZ4Q545W+Vm2ZuXRMMKzNrFwf4ihOfvDD14YevAEffSODLmgD2aAKRj3Gzs
ildOpq8swBaYmB7n5U+fiYUyYikszE3haQqbJLc2EIUXBoq/X1iGe19Ok5KYrxiw0EN5Hk27xuDH
LX2k249iarzCW3+XiHRCdfUmAbXGl4aYo8gXFjNNODVccyGe9oOGqYqSdxBNcRM4wEtS2U8i1Kc5
UqSd9CTpG2G3xNmr9DYLxEWEmTdBUzfvDdJt0iyJRyviXEqSFJOZKtUqHUR2Rc0ALDAAGODKBAFW
xRjASCVy8iQqaHfd3CD5eJhbNUcC4eXifGMkzNHNIoUqZm7rCCpLYK7ZiFDmI2O8Y5bahriruWu0
uUL0xNSy0JQJk50BKQhIzfhSNAB4CJFiYpVLlFM5X2gHUnW4gl1Cdo9Db9pL6W7JAsmApkTU5QuW
R46AecKRDFO2yopFXkKGweSWb9qfFrcy9G9evKL/ADijx6/U3kW+KSxMuS7QbQeZQ5lfGKUy64Vr
6mJAtzBLiEqASb7X8PSHEktUtUJOY/tuC/4ToY6IXaGFQmMXSrQshvMelzHBoOo4vnnW1IQvhg/g
0/eEanzrq1Jsd1AqP0EAaf2Dy/8AWOzDbmRZztWBKV5fZ1HoFct/KJc0KsDQm5T7yWmrZVIU3mHk
4SIwhTKzOSa5Z+6U5m1ag/WHJQNlXXFocUdLHInw03gKYBVeek6fJP1Kcc4cnJpu+/a4TcHKAOpU
RaDWw+U6zWnq3X5+sOpCFTjxcS2L2QjZCRfoEgCL6xw8+07lw2SfnDJJNT/Bbyg3CSNOkAFy2IMp
sNICSzeMVoQBxLQ9jSkGbcWoJSeZUIzqiBYL0SOsARsy7ndVl1RsPMCAL72L1lun4wYDysjLqVIc
UApRFxl2SR+KMcrbD2+gZelAu2c5A0qy0W1unxiaIWj5t5ZbDbPvbqPQeUOSgAZoJbUkgDIFcJBN
k8oKiT8hcxy66Y120YreVwaOlS0cQcZbCrXSyo5ms9vfcvm8hYRvhp9S57/GRtPtNkcQ8pO8UpUn
naDOdpWb+IAaaUssvjrlzj/HeAGG5g2vAHJfVfQwAM5OusJWphGd0aXOgTAAzaam6sOTroy78BP8
mADWhuYAsXZ860jF9NS/qy85wXOmjgKd/nHGSOHeOeX0hI1B6RaRLTw0byoamgFqS4hSrZn3D3VJ
FtesRPRSiqrTFhsiYbCFlaUnNe5b328dhD2WpRNamZZmkzFWqyOHSJJsPTEq8mzrzqE6IHggqUBb
rBSszItaKw+Wq1VZqrVSZqMybvzLhcV4C+yR5JGgi6IebM7AFtKwUqF0q3EMjDbU4wshteYfhV/v
1gAlFZcll51tKKrFNgLg3FrXEAI2TkSdtNoAWAAb/wBQ0OhfNx8EQgPG8AOI6wwNw6SK9Tbf9U1/
5iFbo69vraVSlRcSoXSSLg7bxFD0ZFLYYRxFJbSlR3IAG20Nyznt1WsYCABNlTjIV56LMd4u2Wbp
85dIqSFEAOObo+H8wA10gDs9z/3xgDkwB//Z

------=_NextPart_000_0061_01C82292.502B3E40
Content-Type: text/css;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.melindaflynn.com/Styles.css

BODY {
	FONT-SIZE: 10pt; COLOR: #666666; FONT-FAMILY: Verdana, Arial
}
TEXTAREA {
	BEHAVIOR: url(/Behaviors/maxlength.htc)
}
.mailmerge {
	FONT-WEIGHT: normal; FONT-SIZE: 10pt; COLOR: red; FONT-FAMILY: Verdana
}
.h1 {
	FONT-WEIGHT: normal; FONT-SIZE: 14pt; COLOR: #000000; FONT-FAMILY: =
Verdana
}
.StatusText {
	FONT-WEIGHT: bolder; FONT-SIZE: 10pt; COLOR: red; FONT-FAMILY: =
Verdana,Arial, Helvetica, sans-serif
}
.AlertText {
	FONT-SIZE: 8pt; COLOR: red; FONT-FAMILY: Verdana, Arial
}
.BottomTableBorder {
	BORDER-BOTTOM: black 1px solid
}
.ToolHeader {
	FONT-WEIGHT: bolder; FONT-SIZE: 12pt; COLOR: #000000; FONT-FAMILY: =
Verdana,Arial, Helvetica, sans-serif
}
.ControlFont {
	FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Verdana, Arial
}
.tableHeader {
	PADDING-LEFT: 11px; FONT-WEIGHT: bold; FONT-SIZE: 8pt; COLOR: white; =
FONT-FAMILY: Verdana; BACKGROUND-COLOR: #48669f
}
.GridHeader {
	FONT-WEIGHT: bold; BACKGROUND-IMAGE: =
url(/admin/Graphics/topnav_bkg.jpg); COLOR: black; BACKGROUND-REPEAT: =
repeat-x
}
.GridLeft {
	BORDER-TOP: #a6e6ee 2px solid; BORDER-LEFT: #a6e6ee 2px solid; COLOR: =
#000000; BORDER-BOTTOM: #82b5bb 2px solid
}
.GridMiddle {
	BORDER-TOP: #a6e6ee 2px solid; COLOR: #000000; BORDER-BOTTOM: #82b5bb =
2px solid
}
.GridRight {
	BORDER-RIGHT: #82b5bb 2px solid; BORDER-TOP: #a6e6ee 2px solid; COLOR: =
#000000; BORDER-BOTTOM: #82b5bb 2px solid
}
.mol {
	FONT-SIZE: 9px; COLOR: #999999; FONT-FAMILY: Verdana, Arial, Helvetica, =
sans-serif
}
TBODY {
	FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana, Arial
}
.SectionHeader {
	FONT-WEIGHT: bolder; FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: =
Verdana, Arial
}
.ContentText {
	FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana, Arial
}
.GreyText {
	FONT-SIZE: 10pt; COLOR: #666666; FONT-FAMILY: Verdana, Arial
}
.SmallGreyText {
	FONT-SIZE: 8pt; COLOR: #666666; FONT-FAMILY: Verdana, Arial
}
.TitleHeader {
	FONT-WEIGHT: bolder; FONT-SIZE: 12pt; COLOR: #000000; FONT-FAMILY: =
Verdana,Arial, Helvetica, sans-serif
}
A.DynContentText {
	FONT-SIZE: 8pt; FONT-FAMILY: Verdana, Arial
}
.DynContentText {
	FONT-SIZE: 8pt; FONT-FAMILY: Verdana, Arial
}
.ColumnTitle {
	FONT-SIZE: medium; FONT-FAMILY: Verdana; BACKGROUND-COLOR: white
}
.ListBarGroupHeader {
	BORDER-RIGHT: #808080 1px solid; PADDING-RIGHT: 2px; =
BACKGROUND-POSITION: 50% top; BORDER-TOP: #ffffff 1px solid; =
PADDING-LEFT: 2px; BACKGROUND-IMAGE: url(../images/gradient_head.gif); =
PADDING-BOTTOM: 1px; BORDER-LEFT: #ffffff 1px solid; PADDING-TOP: 1px; =
BORDER-BOTTOM: #808080 1px solid; BACKGROUND-REPEAT: repeat-x; HEIGHT: =
24px
}
.ListBarGroupTextHeader {
	FONT-WEIGHT: bold; FONT-SIZE: 8pt; COLOR: #868686
}
.ListBarGroup {
	COLOR: #000000; FONT-FAMILY: Verdana,Arial, Helvetica, sans-serif; =
BACKGROUND-COLOR: #ffffff; TEXT-ALIGN: left
}
.ControlFont {
	FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: Verdana, Arial
}
.ControlFontBold {
	FONT-WEIGHT: bold; FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: Verdana, =
Arial
}
.txtInput {
	BORDER-RIGHT: #c0c0c0 1px solid; BORDER-TOP: #c0c0c0 1px solid; =
FONT-SIZE: 8pt; BORDER-LEFT: #c0c0c0 1px solid; COLOR: black; =
BORDER-BOTTOM: #c0c0c0 1px solid; FONT-FAMILY: Verdana, Arial
}
.GreenText {
	FONT-SIZE: 11px; COLOR: #006600; FONT-FAMILY: Verdana
}
.SmallGreenText {
	FONT-SIZE: 10px; COLOR: green; FONT-FAMILY: Verdana
}
.FormSelect {
	FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Verdana, Arial; POSITION: =
absolute
}
.AlertText {
	FONT-SIZE: 12px; COLOR: red; FONT-FAMILY: Verdana
}
.PodBoxHeader {
	FONT-WEIGHT: bold; FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: =
Verdana,Arial, Helvetica, sans-serif
}
.XpButton {
	BEHAVIOR: url(/Behaviors/xpbutton.htc)
}
.NoWrap {
	WHITE-SPACE: nowrap
}

------=_NextPart_000_0061_01C82292.502B3E40
Content-Type: text/css;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.melindaflynn.com/templates/themes/transition/styleSheet.css

.header {
	FONT-WEIGHT: bold; FONT-SIZE: 14px; COLOR: #000000; FONT-FAMILY: =
Verdana, Arial, Helvetica, sans-serif
}
BODY {
	FONT-SIZE: 11px; COLOR: #000000; LINE-HEIGHT: 18px; FONT-FAMILY: =
Verdana, Arial, Helvetica, sans-serif; BACKGROUND-COLOR: #cccccc
}
.main {
	BACKGROUND-COLOR: #ffffff
}

------=_NextPart_000_0061_01C82292.502B3E40
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.melindaflynn.com/scripts/flashobject.js

/*
 * FlashObject embed
 * by Geoff Stearns (geoff@deconcept.com, http://www.deconcept.com/)
 *
 * v1.1.0 - 03-31-2005
 *
 * writes the embed code for a flash movie, includes plugin detection
 *
 * Usage:
 *
 *	myFlash =3D new FlashObject("path/to/swf.swf", "swfid", "width", =
"height", flashversion, "backgroundcolor");
 *	myFlash.write("objId");
 *
 * for best practices, see:
 *  =
http://blog.deconcept.com/2005/03/31/proper-flash-embedding-flashobject-b=
est-practices/
 *
 */

var FlashObject =3D function(swf, id, w, h, ver, c, redirect) {
	this.swf =3D swf;
	this.id =3D id;
	this.width =3D w;
	this.height =3D h;
	this.version =3D ver;
	this.align =3D "middle";

	this.params =3D new Object();
	this.variables =3D new Object();

	if(redirect =3D=3D undefined) { this.redirect =3D ""; } else { =
this.redirect =3D redirect; }
	this.sq =3D document.location.search.split("?")[1] || "";
=09
	this.bypassTxt =3D "<p>Already have Macromedia Flash Player? <a =
href=3D'?detectflash=3Dfalse&"+ this.sq +"'>Click here if you have Flash =
Player "+ this.version +" installed</a>.</p>";
=09
	if (c) this.color =3D this.addParam('bgcolor', c);
	this.addParam('quality', 'high'); // default to high
	this.doDetect =3D getQueryParamValue('detectflash');
}

var FOP =3D FlashObject.prototype;

FOP.addParam =3D function(name, value) { this.params[name] =3D value; }

FOP.getParams =3D function() { return this.params; }

FOP.getParam =3D function(name) { return this.params[name]; }

FOP.addVariable =3D function(name, value) { this.variables[name] =3D =
value; }

FOP.getVariable =3D function(name) { return this.variables[name]; }

FOP.getVariables =3D function() { return this.variables; }

FOP.getParamTags =3D function() {
    var paramTags =3D "";
    for (var param in this.getParams()) {
        paramTags +=3D '<param name=3D"' + param + '" value=3D"' + =
this.getParam(param) + '" />';
    }
    return (paramTags =3D=3D "") ? false:paramTags;
}

FOP.getHTML =3D function() {
    var flashHTML =3D "";
    if (navigator.plugins && navigator.mimeTypes.length) { // netscape =
plugin architecture
		//  appends '2' on the end of the ID for the resizer to work
        flashHTML +=3D '<embed type=3D"application/x-shockwave-flash" =
src=3D"' + this.swf + '" width=3D"' + this.width + '" height=3D"' + =
this.height + '" name=3D"' + this.id + "2" + '" id=3D"' + this.id + "2" =
+ '" align=3D"' + this.align + '"';
        for (var param in this.getParams()) {
            flashHTML +=3D ' ' + param + '=3D"' + this.getParam(param) + =
'"';
        }
        if (this.getVariablePairs()) {
            flashHTML +=3D ' flashVars=3D"' + this.getVariablePairs() + =
'"';
        }
        flashHTML +=3D '></embed>';
    } else { // PC IE
        flashHTML +=3D '<object =
classid=3D"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width=3D"' + =
this.width + '" height=3D"' + this.height + '" id=3D"' + this.id + '" =
align=3D"' + this.align + '">';
        flashHTML +=3D '<param name=3D"movie" value=3D"' + this.swf + '" =
/>';
        if (this.getParamTags()) {
            flashHTML +=3D this.getParamTags();
        }
        if (this.getVariablePairs() !=3D null) {
            flashHTML +=3D '<param name=3D"flashVars" value=3D"' + =
this.getVariablePairs() + '" />';
        }
        flashHTML +=3D '</object>';
    }
    return flashHTML;=09
}

FOP.getVariablePairs =3D function() {
    var variablePairs =3D new Array();
    for (var name in this.getVariables()) {=20
    	variablePairs.push(name + "=3D" + escape(this.getVariable(name)));=20
    }
    return (variablePairs.length > 0) ? variablePairs.join("&"):false;
}

FOP.write =3D function(elementId) {
	if(detectFlash(this.version) || this.doDetect=3D=3D'false') {
		if (elementId) {
			document.getElementById(elementId).innerHTML =3D this.getHTML();
		} else {
			document.write(this.getHTML());
		}
	} else {
		if (this.redirect !=3D "") {
			document.location.replace(this.redirect);
		} else if (this.altTxt) {
			if (elementId) {
				document.getElementById(elementId).innerHTML =3D this.altTxt +""+ =
this.bypassTxt;
			} else {
				document.write(this.altTxt +""+ this.bypassTxt);
			}
		}
	}
	if (navigator.appName && navigator.appName.indexOf("Microsoft") !=3D -1 =
&& navigator.userAgent.indexOf("Windows") !=3D -1 && =
navigator.userAgent.indexOf("Windows 3.1") =3D=3D -1){=09
		try{=09
			document.all[this.id].attachEvent("fscommand", eval(this.id + =
"_DoFSCommand"));
		}catch(er){
		}
	}
}

/* ---- detection functions ---- */
function getFlashVersion() {
	var flashversion =3D 0;
	if (navigator.plugins && navigator.mimeTypes.length) {
		var x =3D navigator.plugins["Shockwave Flash"];
		if(x && x.description) {
			var y =3D x.description;
   			flashversion =3D y.charAt(y.indexOf('.')-1);
		}
	} else {
		result =3D false;
	    for(var i =3D 15; i >=3D 3 && result !=3D true; i--){
   			execScript('on error resume next: result =3D =
IsObject(CreateObject("ShockwaveFlash.ShockwaveFlash.'+i+'"))','VBScript'=
);
   			flashversion =3D i;
   		}
	}
	return flashversion;
}

function detectFlash(ver) {	return (getFlashVersion() >=3D ver) ? =
true:false; }

// get value of query string param
function getQueryParamValue(param) {
	var q =3D document.location.search || =
document.location.href.split("#")[1];
	if (q) {
		var detectIndex =3D q.indexOf(param +"=3D");
		var endIndex =3D (q.indexOf("&", detectIndex) > -1) ? q.indexOf("&", =
detectIndex) : q.length;
		if (q.length > 1 && detectIndex > -1) {
			return q.substring(q.indexOf("=3D", detectIndex)+1, endIndex);
		} else {
			return "";
		}
	}
}

/* add Array.push if needed */
if(Array.prototype.push =3D=3D null){
	Array.prototype.push =3D function(item) { this[this.length] =3D item; =
return this.length; }
}



------=_NextPart_000_0061_01C82292.502B3E40
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.melindaflynn.com/scripts/themeScripts.js

function AdjustLeftNav(nPixelsPerMenuItem,nLeftNavSize)
{
	return;
}


function AdjustTopNav(nPixelsPerMenuItem,nLeftNavSize)
{
	return;
}

function DDLang(language)
{	=09
	var bDoorwayLoaded =3D false;=09
	try
	{
		bDoorwayLoaded =3D gbDoorwayLoaded;
	}
	catch(ex){}
	if(bDoorwayLoaded)
	{
	alert("Please fill out the form currently loaded or if possible skip =
the form before switching to " + language + ". Thank you.");
	}
	else
	{
	prefix =3D "";
	tempArg =3D "ChosenLanguage=3D" + language;
	tempLocation =3D location.href;
	nStart =3D tempLocation.toLowerCase().indexOf("/", 8) + 1;

	// Pull #
	if(tempLocation.indexOf("#") !=3D -1)
	{
	tempLocation =3D tempLocation.substr(0, tempLocation.indexOf("#"));
	}

	// Determine if the URL is to a physical file.
	if((tempLocation.toLowerCase().indexOf(".aspx") !=3D -1) || (nStart =
=3D=3D tempLocation.length) || =
(tempLocation.indexOf("?ChosenLanguage=3D") !=3D -1))
	{
		//Pull Existing Language Querystring	=09
		if(tempLocation.indexOf("?ChosenLanguage=3D") !=3D -1)
		{
			tempLocation =3D tempLocation.substr(0, =
tempLocation.indexOf("?ChosenLanguage=3D"));
			prefix =3D "?";
		}
		else if(tempLocation.indexOf("&ChosenLanguage=3D") !=3D -1)
		{
			tempLocation =3D tempLocation.substr(0, =
tempLocation.indexOf("&ChosenLanguage=3D"));
			prefix =3D "&";
		}
		else if(tempLocation.indexOf("&language=3D") !=3D -1)
		{		=09
			tempLocation =3D tempLocation.substr(0, =
tempLocation.indexOf("&language=3D"));
			prefix =3D "&";
		}
		else if(tempLocation.indexOf("?") =3D=3D -1)
		{
		prefix =3D "?";
		}
		else if(tempLocation.indexOf("&") =3D=3D -1)
		{
		prefix =3D "&";
		}
	}
	else
	{
		//Pull Existing Language Querystring
		if (tempLocation.toLowerCase().indexOf("/english") !=3D -1)
		{
		tempLocation =3D tempLocation.substr(0, =
tempLocation.toLowerCase().indexOf("/english"));
		}
		if (tempLocation.toLowerCase().indexOf("/spanish") !=3D -1)
		{
		tempLocation =3D tempLocation.substr(0, =
tempLocation.toLowerCase().indexOf("/spanish"));
		}
		if (tempLocation.toLowerCase().indexOf("/french") !=3D -1)
		{
		tempLocation =3D tempLocation.substr(0, =
tempLocation.toLowerCase().indexOf("/french"));
		}
		if (tempLocation.toLowerCase().indexOf("/german") !=3D -1)
		{
		tempLocation =3D tempLocation.substr(0, =
tempLocation.toLowerCase().indexOf("/german"));
		}
		if (tempLocation.toLowerCase().indexOf("/portuguese") !=3D -1)
		{
		tempLocation =3D tempLocation.substr(0, =
tempLocation.toLowerCase().indexOf("/portuguese"));
		}
	=09
		tempArg =3D "/" + language;
	}

	Cat =3D tempLocation + prefix + tempArg;
	window.location =3D Cat;
	}
}


function resizeIFrame(h)
{
	var w =3D document.getElementById("ContentIFrame").width;
	document.ContentIFrame.resizeTo(w,h);
}


var FlashResizer =3D function(){}
	FlashResizer.prototype.resizeFlash =3D function(flashID, newWidth, =
newHeight)
	{
		var obj =3D {};
		//debugger;
		if(document.getElementById(flashID))
		{
			obj =3D document.getElementById(flashID);
		}
		else if(document.getElementById(flashID + '2'))
		{
			obj =3D document.getElementById(flashID + '2');
		}
	=09
		if(obj)
		{
			if(newWidth !=3D undefined){obj.width =3D newWidth;}
 			if(newHeight !=3D undefined){obj.height =3D newHeight;}
 		}
	 =09
 		if(navigator.appName.indexOf("Microsoft") !=3D -1)
 		{
 			window.parent.resizeFrame(document.body.scrollWidth, =
document.body.scrollHeight + 10);
 		}
 		else
 		{
 			var objIFrame =3D =
window.parent.document.getElementById('gridFrame');
		 =09
 			if(objIFrame && newHeight !=3D undefined)
 			{
				objIFrame.height =3D newHeight;
			}
		}
	}

var resizer =3D new FlashResizer();

//Browser detection
var BrowserDetect =3D {
	init: function () {
		this.browser =3D this.searchString(this.dataBrowser) || "An unknown =
browser";
		this.version =3D this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS =3D this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var i=3D0;i<data.length;i++)	{
			var dataString =3D data[i].string;
			var dataProp =3D data[i].prop;
			this.versionSearchString =3D data[i].versionSearch || =
data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) !=3D -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index =3D dataString.indexOf(this.versionSearchString);
		if (index =3D=3D -1) return;
		return =
parseFloat(dataString.substring(index+this.versionSearchString.length+1))=
;
	},
	dataBrowser: [
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{	// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 	// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]

};
BrowserDetect.init();

//=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
//7/07 ASL - Motion theme has its own resizeSWF function becuase its =
layout is a little different
//Used to set the OnBoard url for the Neighborhood Info content page
function SetOnBoardURL(){
	return =
'http://www.onboardnavigator.com/webcontent/OBWC_Results.aspx?AID=3D134-8=
e8091169b1d';=09
}

//Chat functions
//***********************************************************************=
******************************
var _ChatSession;

function changeChatAvailability(bAvailable){
	if (objSecNav !=3D undefined){
		objSecNav.switchAvailability(bAvailable);
	}
	else if (document.getElementById("topNav") !=3D undefined){
		document.getElementById("topNav").switchAvailability(bAvailable);
	}
	else document.getElementById("topNav2").switchAvailability(bAvailable);
}

function LaunchChatNotification(){
	document.getElementById("flashPopupChat").style.visibility =3D =
'visible';
}

function DeclineChat(){=09
	HideChatNotification();
	restartCalls();
}

function restartCalls(){
	if (objSecNav !=3D undefined){
		objSecNav.restartCalls();
	}
	else if (document.getElementById("topNav") !=3D undefined){
		document.getElementById("topNav").restartCalls();
	}
	else document.getElementById("topNav2").restartCalls();
}

function HideChatNotification(){
	document.getElementById("flashPopupChat").style.visibility =3D =
'hidden';
}

function getUserName(){
	return _UID;
}

function getServer(){
	return _Server;
}

function getIP(){
	return _IP;
}

function getPageID(){
	return _PageID;
}

function setChatSession(szChatSession){
	_ChatSession =3D szChatSession;
	_SessionID =3D szChatSession;
}

function getChatSession(){
	return _ChatSession;
}

function setXSDUser(szUser){
	_LO =3D szUser;
}

function getXSDUser(){
	return _LO;
}
//***********************************************************************=
******************************





------=_NextPart_000_0061_01C82292.502B3E40
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.melindaflynn.com/scripts/flashPopup.js

var isInternetExplorer =3D navigator.appName.indexOf("Microsoft") !=3D =
-1;
var klugeForTopTheme =3D 0;

//***********************************************************************=
*************
// Used for the loan app.
//***********************************************************************=
*************
function openEditUser(a_sPage){
	var pageURL =3D a_sPage;
	var params =3D "width=3D610";
	params +=3D ",height=3D675";
	params +=3D ",toolbar=3Dfalse";
	params +=3D ",location=3Dfalse";
	params +=3D ",status=3Dyes";
	params +=3D ",menubar=3Dfalse";
	params +=3D ",resizable=3Dyes";
	window.open(pageURL,"Edit",params);
}

//***********************************************************************=
*************
//NEW FLASH RESIZE TEST -- added by Robert Smith 5/11/06
//***********************************************************************=
*************

function setFlashWidth(divid, newW){
	document.getElementById(divid).style.width =3D newW+"px";
}
function setFlashHeight(divid, newH,flashID,divHeight){
	resizeFlash(flashID, null, newH);
	var tempHeight =3D newH+"px";
	document.getElementById(divid).style.height =3D tempHeight;
}
function setFlashSize(divid, newW, newH){
	setFlashWidth(divid, newW);
	setFlashHeight(divid, newH);
}
function canResizeFlash(){
	var ua =3D navigator.userAgent.toLowerCase();
	var opera =3D ua.indexOf("opera");
	if( document.getElementById ){
		if(opera =3D=3D -1) return true;
		else if(parseInt(ua.substr(opera+6, 1)) >=3D 7) return true;
	}
	return false;
}

function setFlashHeightIncFrame(divid,newH,flashID){
	resizeFlash(flashID,null,newH);
	document.getElementById(divid).style.height =3D newH+"px";
	resizeGrid();
}
function setFlashWidthHeight(divid, newW, newH,flashID,divHeight){
	handleSetFlashWidthHeight(divid,newW,newH,flashID);
}
function setFlashWidthHeightIncFrame(divid,newW,newH,flashID){
	handleSetFlashWidthHeight(divid,newW,newH,flashID);
	resizeGrid();
}
function handleSetFlashWidthHeight(divid,newW,newH,flashID){
	var flashElement =3D document.getElementById(divid);
	var moveRight =3D newW - flashElement.offsetWidth;

	resizeFlash(flashID, newW, newH);
	flashElement.style.width =3D newW+"px";
	flashElement.style.height =3D newH+"px";

	var element =3D parent.document.getElementById("topNavFlash");
	if (element !=3D undefined){
		if (moveRight < 0){moveRight =3D 0;}
		element.style.paddingLeft =3D 0 + moveRight+"px";
		if (screen.width >=3D1024 && (element.offsetWidth - =
parent.document.body.offsetWidth + 30) > 0){
			top.resizeBy(element.offsetWidth - parent.document.body.offsetWidth + =
30);
		}
	}
}


//***********************************************************************=
*************
// RESIZE FLASH OBJECT
//***********************************************************************=
*************
function resizeFlash(flashID, newWidth, newHeight){
 	if(document.getElementById(flashID) !=3D undefined){
 		var obj =3D document.getElementById(flashID);=20
 	}else{
 		var obj =3D document.getElementById(flashID + '2');=20
 	}
 	if(newWidth !=3D undefined ){obj.width =3D newWidth;}
 	if(newHeight !=3D undefined){obj.height =3D newHeight;}
 	if(window.parent.document.getElementById('gridFrame') !=3D undefined){
 		window.parent.resizeFrame(newHeight + 40);
 	}
}

function resizeSWFNested(objectTagName, embedTagName, newWidth, =
newHeight){
=09
	if (objectTagName =3D=3D "topNav"){
		if ('function' =3D=3D typeof chatNotifyFinalAdjustment){
			chatNotifyFinalAdjustment(newHeight - 230);
		}
	}
=09
	if (BrowserDetect.browser =3D=3D "Safari"){
		var obj =3D document.getElementById(objectTagName);
		var obj2 =3D document.getElementById(embedTagName);
	=09
		if (hasValue(newHeight) && newHeight > 650){
			obj.height =3D newHeight;
			obj2.height =3D newHeight;
		}
		if(hasValue(newWidth)){
			obj.width =3D newWidth;
			obj2.width =3D newWidth;
		}
=09
	}else{=09
		var obj =3D {};
	=09
		if(document.getElementById(objectTagName)){
			obj =3D document.getElementById(objectTagName);
		}else if(document.getElementById(embedTagName)){
			obj =3D document.getElementById(embedTagName);
		}
=09
		if(obj){
			if(hasValue(newWidth)){obj.width =3D newWidth;}
	 		if(hasValue(newHeight) && ((newHeight > 650 && obj =3D=3D =
document.getElementById("leftNav")) || obj !=3D =
document.getElementById("leftNav"))){
				obj.height =3D newHeight;
			}
	 	}
	 }
}

function hasValue(v){
	return v !=3D undefined && v !=3D "" && v !=3D null && v !=3D "null";
}

//  Define global variables
var timerID =3D null;
var timerOn =3D false;
var timecount =3D 1000;

//  Change this to the time delay that you desire
var what =3D null;
var newbrowser =3D true;
var check =3D false;

//  The function flashPopupInit() determines for us what browser version =
that we are dealing with and assigns a values to the variables what, =
layerRef, styleSwitch and visibleVar, which we will use in our layer =
visibility toggling functions. We also assign the Boolean value ?true? =
to the check variable.
function flashPopupInit(){
	if (document.layers){
		what =3D "ns4";
	}else if(document.all){
		what =3D "ie4";
	}else if(document.getElementById){
		what=3D"dom1";
	}else{
		what =3D "none";
		newbrowser =3D false;
	}
	check =3D true;
}

=20
//  Toggles the layer visibility on=20
function showLayer(layerName, yPos, divYStart, leftPos){
	if(check){
		if (what =3D=3D "none"){
			return;
		}else if (what =3D=3D "dom1"){
			if (document.getElementById("leftNav") !=3D undefined){
				flashID =3D document.getElementById("leftNav");
				oMozE =3D flashID.parentNode.parentNode.parentNode.parentNode;
			} else {
				flashID =3D document.getElementById("leftNav2");
				oMozE =3D flashID.parentNode.parentNode.parentNode.parentNode;
			}
		=09
			var myOffset;
			if =
(flashID.parentNode.parentNode.parentNode.parentNode.parentNode.offsetLef=
t =3D=3D 0){
				myOffset =3D flashID.parentNode.parentNode.offsetLeft;
			} else {
				myOffset =3D =
flashID.parentNode.parentNode.parentNode.parentNode.parentNode.offsetLeft=
;
			}
			document.getElementById(layerName).style.visibility =3D "visible";
			document.getElementById(layerName).style.left =3D myOffset + leftPos =
+ "px";
			document.getElementById(layerName).style.top =3D oMozE.offsetTop + =
divYStart + yPos + "px";
		}else{
			var oElement =3D document.all.flashNav;
			var tempLayerRef =3D document.all[layerName];
			tempLayerRef.style.visibility =3D "visible";
			tempLayerRef.style.left =3D oElement.offsetLeft + leftPos + "px";
			tempLayerRef.style.top =3D oElement.offsetTop + divYStart + yPos + =
"px";
		}
	}else{
		return;
	}
}

function positionChatPopup(){
	//Base this function off of an arguments array rather than actual =
argument names
	var layerName =3D arguments[0];
	var yPos =3D arguments[1];
	var divYStart =3D arguments[2];
	var leftPos =3D arguments[3];
	var topAdjFF;
	var leftAdjFF;
	var topAdjIE;
	var leftAdjIE;
=09
	if (arguments[4] !=3D undefined){
		topAdjFF =3D arguments[4];
	}
	else topAdjFF =3D 0;
=09
	if (arguments[5] !=3D undefined){
		leftAdjFF =3D arguments[5];
	}
	else leftAdjFF =3D 0;
=09
	if (arguments[6] !=3D undefined){
		topAdjIE =3D arguments[6];
	}
	else topAdjIE =3D 0;
=09
	if (arguments[7] !=3D undefined){
		leftAdjIE =3D arguments[7];
	}
	else leftAdjIE =3D 0;
=09
	if (what =3D=3D "dom1"){
		if (document.getElementById("leftNav") !=3D undefined){
			flashID =3D document.getElementById("leftNav");
		} else {
			flashID =3D document.getElementById("leftNav2");
		}
		oMozE =3D flashID.parentNode.parentNode.parentNode.parentNode;
	=09
		var myOffset;
		if =
(flashID.parentNode.parentNode.parentNode.parentNode.parentNode.offsetLef=
t =3D=3D 0){
			myOffset =3D flashID.parentNode.parentNode.offsetLeft;
		} else {
			myOffset =3D =
flashID.parentNode.parentNode.parentNode.parentNode.parentNode.offsetLeft=
;
		}
	=09
		document.getElementById(layerName).style.left =3D myOffset + leftPos + =
leftAdjFF + "px";
		document.getElementById(layerName).style.top =3D oMozE.offsetTop + =
divYStart + yPos + topAdjFF + klugeForTopTheme + "px";
	=09
	}
	else{
		var oElement =3D document.all.flashNav;
		var tempLayerRef =3D document.all[layerName];
		tempLayerRef.style.left =3D oElement.offsetLeft + leftPos + leftAdjIE =
+ "px";
		tempLayerRef.style.top =3D oElement.offsetTop + divYStart + yPos + =
klugeForTopTheme + topAdjIE + "px";
	}
=09
}

//  Toggles the layer visibility off=20
function hideLayer(layerName){
	if(check){
		if (what =3D=3D "none"){
			return;
		}else if (what =3D=3D "dom1"){
			document.getElementById(layerName).style.visibility=3D"hidden";
		}else{
			var tempLayerRef =3D document.all[layerName];
			if(tempLayerRef){
				tempLayerRef.style.visibility=3D"hidden";
			}
		}
	}else{
		return;
	}
}

//  hide all
function hideAll(){
    //  Put all layers used in the nav here.
    hideLayer('flashPopupNavLeft');
}

function startTime(){
	if (timerOn =3D=3D false){
		timerID =3D setTimeout("hideAll()", timecount);
		timerOn =3D true;
	}
}

function stopTime(){
	if (timerOn){
		clearTimeout(timerID);
		timerID =3D null;
		timerOn =3D false;
	}
}

flashPopupInit();

function flashWrapper(a_szLayer, a_nYPos, a_nDivYStart, a_nDivWidth){
	hideAll();
	showLayer(a_szLayer, a_nYPos, a_nDivYStart, a_nDivWidth);
	stopTime();
}

// hack for satisfactory functioning in IE. Not required for Firefox.=20
function clearObjs(obj){
    var theObj =3D eval(obj);
    theObj.style.display =3D "none";
    for (var prop in theObj){
	    if (typeof(theObj[prop]) =3D=3D "function"){
		    theObj[prop]=3Dnull
	    }
	}=09
  }

// hack for satisfactory functioning in IE. Not required for Firefox.
function cleanup(){
	try { DoLogout(); } catch(e) {} // log out of chat
=09
    __flash_unloadHandler =3D function(){	=09
		externalProbSet =3D true;
		if (externalProbSet) {return};
		clearObjs(explorer);
		clearObjs(flashcontent);
		if (__flash_savedUnloadHandler !=3D null){
		    __flash_savedUnloadHandler();
		}	=09
    }

    if (window.onunload !=3D __flash_unloadHandler){=20
		__flash_savedUnloadHandler =3D window.onunload;
		window.onunload =3D __flash_unloadHandler;
    }
}

function scrollToTop(){
	window.parent.scrollTo(0,0);
}

// hack for satisfactory functioning in IE. Not required for Firefox.
window.onbeforeunload=3Dcleanup;


------=_NextPart_000_0061_01C82292.502B3E40
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.melindaflynn.com/chat/js/Ajax4SoapBox.js

/********************************************
** Name: Ajax4SoapBox javascript library    *
** Purpose: create a javascript abstraction *
**          of SoapBox Webservice.          *
** Author: Ing. Paolo Labellarte            *
** Version: 1.0 (20070306)                  *
** Customer: Conversant                     *   =20
********************************************/


//CONSTANTS
//define base SOAP request
var SoapBoxBaseRequestHeader=3D'<?xml version=3D"1.0" =
encoding=3D"utf-8"?>'
            +'<soap:Envelope =
xmlns:xsi=3D"http://www.w3.org/2001/XMLSchema-instance" =
xmlns:xsd=3D"http://www.w3.org/2001/XMLSchema" =
xmlns:soap=3D"http://schemas.xmlsoap.org/soap/envelope/">'
                +'<soap:Header>'
                  +'<SoapBoxHeader xmlns=3D"URI">'
              +'SBHeaderParams'
            +'</SoapBoxHeader>'
          +'</soap:Header>'
          +'<soap:Body>'
            +'<MethodName xmlns=3D"URI">'
              +'SBParams'
            +'</MethodName>'
          +'</soap:Body>'
        +'</soap:Envelope>'

//URI - SOAP namespace
var =
webServiceUri=3D'http://www.winfessor.com/SoapBoxWebService/SoapBoxWebSer=
vice';
var =
webServiceUriXSD=3D'http://tempuri.org/MortgageLoanSVC/XSitesDesktop'
//Utility
//Expose some static methods
Utility=3Dfunction()
    {
          =20
           =20
       =20
        }
=20
=20
 //getSoapBoxRequest
 //build the soap envelope to use in DoSoapBoxRequest
Utility.getSoapBoxRequest=3Dfunction(methodName,xmlStringHeaderParams,xml=
StringBodyParams)
            {
              =20
                var reURI=3D/URI/g;
                var reSBHeaderParams=3D/SBHeaderParams/;
                var reMethodName=3D/MethodName/g;
                var reSBParams=3D/SBParams/;
               =20
                var =
res=3DSoapBoxBaseRequestHeader.replace(reURI,webServiceUri).replace(reSBH=
eaderParams,xmlStringHeaderParams).replace(reMethodName,methodName).repla=
ce(reSBParams,xmlStringBodyParams);
                //alert(res);
                return res;                               =20
               =20
            }=20
           =20
//getXmlDocument
//not used           =20
Utility.getXmlDocument=3Dfunction(xmlString)
            {
            var xmlDocString=3DxmlString;
            var xDoc=3Dnull;
            if (document.implementation && =
document.implementation.createDocument){
            =
//xDoc=3Ddocument.implementation.createDocument("","root",null);
            var parser=3Dnew DOMParser();
            xDoc=3Dparser.parseFromString(xmlDocString,"text/xml");
            }else if (typeof ActiveXObject !=3D "undefined"){
            var msXmlAx=3Dnull;
            try{
            msXmlAx=3Dnew ActiveXObject("Msxml2.DOMDocument");
            msXmlAx.async =3D false;
            }catch (e){
            msXmlAx=3Dnew ActiveXObject("Msxml.DOMDocument");
            msXmlAx.async =3D false;
            }
           =20
            msXmlAx.loadXML(xmlDocString);
            xDoc=3DmsXmlAx;
            }
            if (xDoc=3D=3Dnull || typeof xDoc.load=3D=3D"undefined"){
            xDoc=3Dnull;
            }
            return xDoc;
               =20
              }

//serialize
//convert params in a xml rappresentation
//params must be a key-value object=20
Utility.serialize=3D
        function(params)
        {=20
            var res=3D'';
            for(var param in params)
            {
                res+=3D'<'+param+'>'+params[param]+'</'+param+'>';
            }
            return res;
        }
       =20
//deserialize
//not used       =20
Utility.deserialize=3D
        function(xmlString)
        {=20
            //var =
xmlDoc=3DSys.Serialization.JavaScriptSerializer.deserialize(xmlString);
            //alert(xmlDoc.getElementById('params'));
             var doc=3DUtility.getXmlDocument(xmlString);
             //alert(doc);
        }   =20
       =20
//htmlEncode
//simple encode of xml response to be printed in html document      =20
Utility.htmlEncode=3D
        function(htmlString)
        {=20
            var res=3D'';
            =
if(htmlString!=3Dnull)res=3DhtmlString.replace(/&/g,'&amp;').replace(/</g=
,'&lt;').replace(/>/g,'&gt;').replace(/\'/g,'&apos;').replace(/"/g,'&quot=
;');
            return res;
        }           =20
       =20
WebService=3Dfunction(OnCompleteHandler, url)
                     {
						  this._webServiceUrl =3D url;
                          this._sessionID=3Dnull;
                          this._lastResponseData=3D'';
                          this._lastResponseXml=3Dnull;
                          this._lastResponseError=3D'';
                          this._request=3D[];
                         =20
                          WebService._OnComplete=3DOnCompleteHandler;=20
                     }


WebService.prototype.set_OnComplete=3Dfunction(OnCompleteHandler)
                    {WebService._OnComplete=3DOnCompleteHandler;}     =20
                                 =20
WebService.prototype.get_sessionID=3Dfunction()
                {return this._sessionID;}       =20
WebService.prototype.get_lastResponseData=3Dfunction()
                {return this._lastResponseData;}
WebService.prototype.get_lastResponseXml=3Dfunction()
                {return this._lastResponseXml;}     =20
WebService.prototype.get_lastResponseError=3Dfunction()
                {return this._lastResponseError;}                        =
      =20

//****methods=20

WebService.prototype.DoSoapBoxRequest=3D
        =
function(mode,methodName,SBHeaderParams,SBBodyParams,OnWebRequestComplete=
d)
        {
			var xmlSoapBoxHeaderParams=3DUtility.serialize(SBHeaderParams);
			var xmlSoapBoxBodyParams=3DUtility.serialize(SBBodyParams);
			var strSoap;
		=09
			YAHOO.util.Connect.resetDefaultHeaders();
		=09
			if(mode =3D=3D 1)
			{
				strSoap=3DUtility.getSoapBoxRequest(methodName,
													xmlSoapBoxHeaderParams,
													xmlSoapBoxBodyParams);
	           =20
				YAHOO.util.Connect.initHeader("SOAPAction", webServiceUri + '/' + =
methodName, false);
				YAHOO.util.Connect.initHeader("Content-Type", "text/xml", true); =09
			}
			else if(mode =3D=3D 2)
			{=09
				strSoap =3D '<?xml version=3D"1.0" encoding=3D"utf-8"?>';
				strSoap +=3D '<soap:Envelope =
xmlns:xsi=3D"http://www.w3.org/2001/XMLSchema-instance" =
xmlns:xsd=3D"http://www.w3.org/2001/XMLSchema" =
xmlns:soap=3D"http://schemas.xmlsoap.org/soap/envelope/">';
				strSoap +=3D '<soap:Body>';
				strSoap +=3D '<' + methodName + ' xmlns=3D"' + webServiceUriXSD + =
'">';
				strSoap +=3D xmlSoapBoxBodyParams;=09
				strSoap +=3D '</' + methodName + '>';
				strSoap +=3D '</soap:Body>';
				strSoap +=3D '</soap:Envelope>';	           =20
			=09
				YAHOO.util.Connect.initHeader("SOAPAction", webServiceUriXSD + '/' + =
methodName, false);
				YAHOO.util.Connect.initHeader("Content-Type", =
"application/x-www-form-urlencoded", true);=20
			}
		=09
			YAHOO.util.Connect.setDefaultPostHeader(false);     =20
		=09
			var id =3D YAHOO.util.Connect._transaction_id;
			this._request[this._request.length] =3D =
YAHOO.util.Connect.asyncRequest('POST', this._webServiceUrl, { =
success:this.OnWebRequestCompleted, failure:this.OnError, =
argument:[this, id] }, strSoap);
		}        =20

WebService.prototype.OnError =3D function(error)
{
	WebService._OnComplete(this._sessionID,null,null,null);
} =20

WebService.prototype.dispose =3D function()
{
	if(this._request !=3D null)
	{
		while(this._request.length > 0)
		{		=09
			this.removeAt(0);
		}	=09
	}
	YAHOO.util.Connect._transaction_id =3D 0;
	this._request =3D [];
	if (typeof CollectGarbage !=3D 'undefined') CollectGarbage();
}  =20

WebService.prototype.removeAt =3D function(idx)
{		=09
	if(this._request[idx] !=3D null)
	{
		YAHOO.util.Connect.abort(this._request[idx], this.disposeComplete, =
true);
		YAHOO.util.Connect.releaseObject(this._request[idx]);
	}
	this._request.splice(idx, 1);
}  =20

WebService.prototype.disposeComplete =3D function()
{
}  =20

//*****settings
WebService.prototype.SettingsSetAutoAwayPresenceValues=3Dfunction(SBHeade=
rsMembers,SBBodyMembers)
                =
{this.DoSoapBoxRequest(1,'SettingsSetAutoAwayPresenceValues',SBHeadersMem=
bers,SBBodyMembers,this._OnWebRequestCompleted)}       =20
WebService.prototype.SettingsSetSessionTimeouts=3Dfunction(SBHeadersMembe=
rs,SBBodyMembers)
                =
{this.DoSoapBoxRequest(1,'SettingsSetSessionTimeouts',SBHeadersMembers,SB=
BodyMembers,this._OnWebRequestCompleted)}       =20

//*****session                    =20
WebService.prototype.SessionLogin=3Dfunction(SBHeadersMembers,SBBodyMembe=
rs)
                =
{this.DoSoapBoxRequest(1,'SessionLogin',SBHeadersMembers,SBBodyMembers,th=
is._OnWebRequestCompleted)}       =20
WebService.prototype.SessionLoginEx=3Dfunction(SBHeadersMembers,SBBodyMem=
bers)
                =
{this.DoSoapBoxRequest(1,'SessionLoginEx',SBHeadersMembers,SBBodyMembers,=
this._OnWebRequestCompleted)}                       =20
WebService.prototype.SessionLogout=3Dfunction(SBHeadersMembers,SBBodyMemb=
ers)
                =
{this.DoSoapBoxRequest(1,'SessionLogout',SBHeadersMembers,SBBodyMembers,t=
his._OnWebRequestCompleted)}
WebService.prototype.SessionLogoutEx=3Dfunction(SBHeadersMembers,SBBodyMe=
mbers)
                =
{this.DoSoapBoxRequest(1,'SessionLogoutEx',SBHeadersMembers,SBBodyMembers=
,this._OnWebRequestCompleted)}=20

//*****message
WebService.prototype.MessageSend=3Dfunction(SBHeadersMembers,SBBodyMember=
s)
                =
{this.DoSoapBoxRequest(1,'MessageSend',SBHeadersMembers,SBBodyMembers,thi=
s._OnWebRequestCompleted)}       =20
WebService.prototype.MessageSendEx=3Dfunction(SBHeadersMembers,SBBodyMemb=
ers)
                =
{this.DoSoapBoxRequest(1,'MessageSendEx',SBHeadersMembers,SBBodyMembers,t=
his._OnWebRequestCompleted)}       =20
WebService.prototype.MessageSendEx2=3Dfunction(SBHeadersMembers,SBBodyMem=
bers)
                =
{this.DoSoapBoxRequest(1,'MessageSendEx2',SBHeadersMembers,SBBodyMembers,=
this._OnWebRequestCompleted)}       =20
WebService.prototype.MessageSendEx3=3Dfunction(SBHeadersMembers,SBBodyMem=
bers)
                =
{this.DoSoapBoxRequest(1,'MessageSendEx3',SBHeadersMembers,SBBodyMembers,=
this._OnWebRequestCompleted)}       =20
WebService.prototype.MessageDequeue=3Dfunction(SBHeadersMembers,SBBodyMem=
bers)
                =
{this.DoSoapBoxRequest(1,'MessageDequeue',SBHeadersMembers,SBBodyMembers,=
this._OnWebRequestCompleted)}       =20
WebService.prototype.MessageWaitForIncoming=3Dfunction(SBHeadersMembers,S=
BBodyMembers)
                =
{this.DoSoapBoxRequest(1,'MessageWaitForIncoming',SBHeadersMembers,SBBody=
Members,this._OnWebRequestCompleted)}       =20
WebService.prototype.CancelMessageWaitForIncoming=3Dfunction(SBHeadersMem=
bers,SBBodyMembers)
                =
{this.DoSoapBoxRequest(1,'CancelMessageWaitForIncoming',SBHeadersMembers,=
SBBodyMembers,this._OnWebRequestCompleted)}       =20

//****contacts
WebService.prototype.ContactsGet=3Dfunction(SBHeadersMembers,SBBodyMember=
s)
                =
{this.DoSoapBoxRequest(1,'ContactsGet',SBHeadersMembers,SBBodyMembers,thi=
s._OnWebRequestCompleted)}       =20
WebService.prototype.ContactsGetDelta=3Dfunction(SBHeadersMembers,SBBodyM=
embers)
                =
{this.DoSoapBoxRequest(1,'ContactsGetDelta',SBHeadersMembers,SBBodyMember=
s,this._OnWebRequestCompleted)}       =20
WebService.prototype.ContactsRequestFromServerAndWait=3Dfunction(SBHeader=
sMembers,SBBodyMembers)
                =
{this.DoSoapBoxRequest(1,'ContactsRequestFromServerAndWait',SBHeadersMemb=
ers,SBBodyMembers,this._OnWebRequestCompleted)}       =20
WebService.prototype.ContactsWaitForDelta=3Dfunction(SBHeadersMembers,SBB=
odyMembers)
                =
{this.DoSoapBoxRequest(1,'ContactsWaitForDelta',SBHeadersMembers,SBBodyMe=
mbers,this._OnWebRequestCompleted)}       =20
WebService.prototype.ContactsAddUser=3Dfunction(SBHeadersMembers,SBBodyMe=
mbers)
                =
{this.DoSoapBoxRequest(1,'ContactsAddUser',SBHeadersMembers,SBBodyMembers=
,this._OnWebRequestCompleted)}       =20
WebService.prototype.ContactsRemoveUser=3Dfunction(SBHeadersMembers,SBBod=
yMembers)
                =
{this.DoSoapBoxRequest(1,'ContactsRemoveUser',SBHeadersMembers,SBBodyMemb=
ers,this._OnWebRequestCompleted)}       =20
WebService.prototype.ContactsUpdateUser=3Dfunction(SBHeadersMembers,SBBod=
yMembers)
                =
{this.DoSoapBoxRequest(1,'ContactsUpdateUser',SBHeadersMembers,SBBodyMemb=
ers,this._OnWebRequestCompleted)}      =20
WebService.prototype.InsertContact=3Dfunction(SBHeadersMembers,SBBodyMemb=
ers)
                =
{this.DoSoapBoxRequest(2,'InsertContact',SBHeadersMembers,SBBodyMembers,t=
his._OnWebRequestCompleted)}      =20

//****presence
WebService.prototype.PresenceSendAvailable=3Dfunction(SBHeadersMembers,SB=
BodyMembers)
                =
{this.DoSoapBoxRequest(1,'PresenceSendAvailable',SBHeadersMembers,SBBodyM=
embers,this._OnWebRequestCompleted)}       =20
WebService.prototype.PresenceSendAvailableEx=3Dfunction(SBHeadersMembers,=
SBBodyMembers)
                =
{this.DoSoapBoxRequest(1,'PresenceSendAvailableEx',SBHeadersMembers,SBBod=
yMembers,this._OnWebRequestCompleted)}       =20
WebService.prototype.PresenceSendCurrent=3Dfunction(SBHeadersMembers,SBBo=
dyMembers)
                =
{this.DoSoapBoxRequest(1,'PresenceSendCurrent',SBHeadersMembers,SBBodyMem=
bers,this._OnWebRequestCompleted)}       =20
WebService.prototype.PresenceSendUnavailable=3Dfunction(SBHeadersMembers,=
SBBodyMembers)
                =
{this.DoSoapBoxRequest(1,'PresenceSendUnavailable',SBHeadersMembers,SBBod=
yMembers,this._OnWebRequestCompleted)}       =20
WebService.prototype.PresenceSendUnavailableEx=3Dfunction(SBHeadersMember=
s,SBBodyMembers)
                =
{this.DoSoapBoxRequest(1,'PresenceSendUnavailableEx',SBHeadersMembers,SBB=
odyMembers,this._OnWebRequestCompleted)}       =20


//****registration
WebService.prototype.RegisterUser=3Dfunction(SBHeadersMembers,SBBodyMembe=
rs)
                =
{this.DoSoapBoxRequest(1,'RegisterUser',SBHeadersMembers,SBBodyMembers,th=
is._OnWebRequestCompleted)}       =20
WebService.prototype.RegisterUserEx=3Dfunction(SBHeadersMembers,SBBodyMem=
bers)
                =
{this.DoSoapBoxRequest(1,'RegisterUserEx',SBHeadersMembers,SBBodyMembers,=
this._OnWebRequestCompleted)}       =20
WebService.prototype.RegisterUserWithGateway=3Dfunction(SBHeadersMembers,=
SBBodyMembers)
                =
{this.DoSoapBoxRequest(1,'RegisterUserWithGateway',SBHeadersMembers,SBBod=
yMembers,this._OnWebRequestCompleted)}       =20
WebService.prototype.RegisterRemoveUser=3Dfunction(SBHeadersMembers,SBBod=
yMembers)
                =
{this.DoSoapBoxRequest(1,'RegisterRemoveUser',SBHeadersMembers,SBBodyMemb=
ers,this._OnWebRequestCompleted)}       =20
WebService.prototype.RegisterRemoveUserFromGateway=3Dfunction(SBHeadersMe=
mbers,SBBodyMembers)
                =
{this.DoSoapBoxRequest(1,'RegisterRemoveUserFromGateway',SBHeadersMembers=
,SBBodyMembers,this._OnWebRequestCompleted)}       =20
               =20
//****exception               =20
WebService.prototype.AsyncExceptionsDequeue=3Dfunction(SBHeadersMembers,S=
BBodyMembers)
                =
{this.DoSoapBoxRequest(1,'AsyncExceptionsDequeue',SBHeadersMembers,SBBody=
Members,this._OnWebRequestCompleted)}       =20

//_OnWebRequestCompleted
//Call back method that must be call before other call back.
WebService.prototype.OnWebRequestCompleted=3Dfunction(o)
                {
               =20
                    var nameResponse=3D'';
                    var xmlDoc=3Dnull;                      =20
                    var arr=3Dnull;
                   =20
                    this._lastResponseData=3Do.responseText;
                   =20
                    var reFaultString=3Dnew =
RegExp('<faultstring>(.*)','');
                    arr=3DreFaultString.exec(o.responseText);
                    if(arr!=3Dnull)this._lastResponseError=3Darr[1];
                   =20
                    var reSessionID=3Dnew =
RegExp('<SoapBoxHeader[^>]*><SessionID>(.*?)</SessionID></SoapBoxHeader>'=
,'');
                    arr=3DreSessionID.exec(o.responseText);
                    if(arr!=3Dnull)this._sessionID=3Darr[1];             =
         =20
                                       =20
                    var reXml=3Dnew =
RegExp('Response[^>]*>([.|^.]*)','');
                    arr=3DreXml.exec(o.responseText);
                    if(arr!=3Dnull)this._lastResponseXml=3Darr[1];       =
              =20
                   =20
                    =
WebService._OnComplete(this._sessionID,this._lastResponseData,this._lastR=
esponseXml,this._lastResponseError);
               =20
					if(o.argument[0]._request !=3D null)
					{
						for(i=3D0; i<o.argument[0]._request.length; i++)
						{
							if(o.argument[0]._request[i].tId =3D=3D o.argument[1])
							{
								o.argument[0].removeAt(i);
								break;
							}
						}
					}
                 }       =20


//To create UI for web service




           =20
        
------=_NextPart_000_0061_01C82292.502B3E40
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.melindaflynn.com/chat/js/Ajax4SoapBoxMethods.js

// JScript File
//Web service model
var methodArray =3D new Array()
methodArray=3D{
                //Settings
                =
'SettingsSetAutoAwayPresenceValues':{type:'Session',headerParams:['Sessio=
nID'],bodyParams:['autoAwayStatus','autoAwayShowValue']},
                =
'SettingsSetSessionTimeouts':{type:'Session',headerParams:['SessionID'],b=
odyParams:['autoAwayTimeoutSeconds','autoBlockMessagesTimeoutSeconds','au=
toLogoutTimeoutSeconds']},
                //Session
                =
'SessionLoginEx':{type:'Session',headerParams:['SessionID'],bodyParams:['=
username','password','resource','hostname']},
                =
'SessionLogin':{type:'Session',headerParams:['SessionID'],bodyParams:['us=
ername','password','hostname']},
                =
'SessionLogout':{type:'Session',headerParams:['SessionID'],bodyParams:[]}=
,
                =
'SessionLogout':{type:'Session',headerParams:['SessionID'],bodyParams:['r=
emove']},
                //Message
                =
'MessageSend':{type:'Message',headerParams:['SessionID'],bodyParams:['tex=
t','toUser','thread']},
                =
'MessageSendEx':{type:'Message',headerParams:['SessionID'],bodyParams:['t=
ext','toUser','thread','payload']},
                =
'MessageSendEx2':{type:'Message',headerParams:['SessionID'],bodyParams:['=
text','toUser','thread','subject']},
                =
'MessageSendEx3':{type:'Message',headerParams:['SessionID'],bodyParams:['=
text','toUser','thread','subject','payload']},
                =
'MessageDequeue':{type:'Message',headerParams:['SessionID'],bodyParams:[]=
},
                =
'MessageWaitForIncoming':{type:'Session',headerParams:['SessionID'],bodyP=
arams:['waitMilliseconds']},
                =
'CancelMessageWaitForIncoming':{type:'Session',headerParams:['SessionID']=
,bodyParams:[]},
                //contacts
                =
'ContactsGet':{type:'contacts',headerParams:['SessionID'],bodyParams:[]},=

                =
'ContactsGetDelta':{type:'contacts',headerParams:['SessionID'],bodyParams=
:[]},
                =
'ContactsRequestFromServerAndWait':{type:'contacts',headerParams:['Sessio=
nID'],bodyParams:['waitMilliseconds']},
                =
'ContactsWaitForDelta':{type:'contacts',headerParams:['SessionID'],bodyPa=
rams:['waitMilliseconds']},
                =
'ContactsAddUser':{type:'contacts',headerParams:['SessionID'],bodyParams:=
['friendlyName','group','jid']},
                =
'ContactsRemoveUser':{type:'contacts',headerParams:['SessionID'],bodyPara=
ms:['jid']},
                =
'ContactsUpdateUser':{type:'contacts',headerParams:['SessionID'],bodyPara=
ms:['friendlyName','group','jid']},
                =
'InsertContact':{type:'contacts',headerParams:[],bodyParams:['nPassportID=
','strFirst','strLast','strAddress','strCity','strState','strZip','strPho=
ne','strEmail']},
                //presence
                =
'PresenceSendAvailable':{type:'presence',headerParams:['SessionID'],bodyP=
arams:['showValue','longText']},
                =
'PresenceSendAvailableEx':{type:'presence',headerParams:['SessionID'],bod=
yParams:['showValue','longText','priority']},
                =
'PresenceSendCurrent':{type:'presence',headerParams:['SessionID'],bodyPar=
ams:['toUserJID']},
                =
'PresenceSendUnavailable':{type:'presence',headerParams:['SessionID'],bod=
yParams:[]},
                =
'PresenceSendUnavailableEx':{type:'presence',headerParams:['SessionID'],b=
odyParams:['toUserJID']},
                //registration
                =
'RegisterUser':{type:'registration',headerParams:['SessionID'],bodyParams=
:['username','password','hostname']},
                =
'RegisterUserEx':{type:'registration',headerParams:['SessionID'],bodyPara=
ms:['username','password','hostname']},
                =
'RegisterUserWithGateway':{type:'registration',headerParams:['SessionID']=
,bodyParams:['username','password','hostname','gatewayJID']},
                =
'RegisterRemoveUser':{type:'registration',headerParams:['SessionID'],body=
Params:[]},
                =
'RegisterRemoveUserFromGateway':{type:'registration',headerParams:['Sessi=
onID'],bodyParams:['gatewayJID']},
                //exception
                =
'AsyncExceptionsDequeue':{type:'exception',headerParams:['SessionID'],bod=
yParams:[]}
            }



------=_NextPart_000_0061_01C82292.502B3E40
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.melindaflynn.com/chat/js/chat.js

var _FirstTime =3D true;
var _msg =3D '';
var ws;
var _Waiting =3D false;
var _TimeoutID =3D 0;
var _Closing =3D false;
var _Presence =3D 'normal';

function HandleError(e)
{
	if(e.statusText =3D=3D undefined)
	{
		alert(e.message);
	}
	else
	{
		alert(e.statusText);
	}
	messageWait();
}

function OnMessageWait(sessionID, data, xml, error)=20
{=09
	try
	{
		_Waiting =3D false;
	=09
		var re =3D new RegExp("<body>(.*)<\/body>");

		var m =3D re.exec(data);
		if (m !=3D null)=20
		{
			if (m[1] !=3D '')=20
			{
				AppendToMessageWindow(m[1], 'blue', true);
			}
		}
	}
	catch(e)
	{
		HandleError(e);
	}
}

function messageWait()=20
{=09
	try
	{	=09
		if(_Waiting =3D=3D true)
			return;
		=09
		var hParams=3D{};
		var bParams=3D{};

		if (_SessionID !=3D '')=20
		{
			hParams['SessionID']=3D_SessionID;
			bParams['waitMilliseconds']=3D'15000';		=09
			bParams['bGetWebChatMsgs'] =3D true;
			bParams['bGetWebChatCmds'] =3D false;
		=09
			ws['MessageWaitForIncoming'](hParams,bParams);=09
			_Waiting =3D true;=09
		=09
			clearTimeout(_TimeoutID);
			_TimeoutID =3D setTimeout('WatchTimeout()', 20000);
		}
	}
	catch(e)
	{
		HandleError(e);
	}
}

function SendPresence()
{
    var hParams=3D{};
	var bParams=3D{};

	hParams['SessionID']=3D_SessionID;
	bParams['showValue']=3D_Presence;
	bParams['longText']=3D'';
=09
    ws['PresenceSendAvailable'](hParams,bParams); =20
}

function Unwrap(msg)
{
	msg =3D replaceAll(msg, "&amp;", "&");
	msg =3D replaceAll(msg, "&lt;", "<");
	msg =3D replaceAll(msg, "&gt;", ">");
=09
	var xml =3D GetXMLObject(msg);	=09
	var msgnode =3D xml.getElementsByTagName('Message')[0];
	if(msgnode !=3D null)
	{
		var lo =3D msgnode.getAttribute("From");
		if(lo !=3D _LO)=09
			return;

		var bodynode =3D msgnode.getElementsByTagName('Body')[0];
		if(bodynode !=3D null)
		{		=09
			var txt;
			if(isIE)
				txt =3D bodynode.text;
			else
				txt =3D bodynode.textContent;
			=09
			if(txt =3D=3D '_GetContact_')
				return 'contact';
			else if(txt.indexOf('Name::', txt) !=3D -1)
			{
				_Name =3D txt.substring(6, txt.length);
				document.getElementById('CurrentSessionID').innerText =3D _Name;
			=09
				return 'name';
			}
		=09
			return txt;=09
		}=20
	}	=09
}

function Wrap(msg)
{
	var xml =3D '<Message><Body>' + msg + '</Body></Message>';
	xml =3D escape(xml);
=09
	return xml;
}

function GetXMLObject(xmlstring)
{
    var xmlobject;
   =20
    // code for IE
	if (window.ActiveXObject)
	{
        xmlobject=3Dnew ActiveXObject("Microsoft.XMLDOM");
        xmlobject.async=3D"false";
        xmlobject.loadXML(xmlstring);
	}
	// code for Mozilla, Firefox, Opera, etc.
	else
	{
        var parser=3Dnew DOMParser();
        xmlobject=3Dparser.parseFromString(xmlstring,"text/xml");
	}
=09
	return xmlobject;
}

function replaceAll(str, look, replace)
{
    while(str.indexOf(look) !=3D -1)
        str =3D str.replace(look, replace);
       =20
    return str;
}

function SendIfEnter(evt)=20
{
    var charCode =3D (evt.which) ? evt.which : event.keyCode
=09
    if (charCode =3D=3D 13)=20
    {
    	if(_LO.length > 0)
    		DoSendMessage();    	=09
    	return false;
    }
   =20
    return true;
}

function DoSendMessage()
{
	try
	{
		if(null =3D=3D _SessionID || _SessionID.length =3D=3D 0)
			return;
		=09
		AppendToMessageWindow(document.getElementById('txtMessage').value, =
'green', false);
	=09
		var hParams=3D{};
		var bParams=3D{};
	=09
		hParams['SessionID']=3D_SessionID;
		bParams['text']=3DWrap(document.getElementById('txtMessage').value); =20
	=09
		document.getElementById('txtMessage').value =3D '';=20

		bParams['toUser']=3D_LO;
		bParams['thread']=3D'XMPP';	=09
	=09
		ws['MessageSend'](hParams,bParams);	=09
	}
	catch(e)
	{
		HandleError(e);
	}
}

function DoSendContact()
{
	try
	{
		var wsContact =3D new WebService(OnWebserviceCallback, =
window.location.protocol + '//' + window.location.host + =
'/mercury/webservices/XSitesDesktop.asmx');
		var hParams=3D{};
		var bParams=3D{};
	=09
		bParams['nPassportID']=3D_LO.split("@")[0];
		bParams['strFirst']=3Ddocument.getElementById('txtFirst').value;=09
		bParams['strLast']=3Ddocument.getElementById('txtLast').value;=09
		bParams['strAddress']=3Ddocument.getElementById('txtAddress').value;=09
		bParams['strCity']=3Ddocument.getElementById('txtCity').value;=09
		bParams['strState']=3Ddocument.getElementById('txtState').value;=09
		bParams['strZip']=3Ddocument.getElementById('txtZip').value;=09
		bParams['strPhone']=3Ddocument.getElementById('txtPhone').value;=09
		bParams['strEmail']=3Ddocument.getElementById('txtEmail').value;=09
	=09
		wsContact['InsertContact'](hParams,bParams);=09
	=09
		var msg =3D '<Message>';
		msg +=3D '<System>New contact has been added:\r\n';
		msg +=3D bParams['strFirst'] + ' ' + bParams['strLast'] + '\r\n';
		msg +=3D bParams['strAddress'] + '\r\n';
		msg +=3D bParams['strCity'] + ', ' + bParams['strState'] + ' ' + =
bParams['strZip'] + '\r\n';
		msg +=3D bParams['strPhone'] + '\r\n';
		msg +=3D bParams['strEmail'];
		msg +=3D '</System>';	=09
		msg +=3D '</Message>';
		msg =3D escape(msg);
=09
		hParams['SessionID']=3D_SessionID;
		bParams['text']=3Dmsg;
		bParams['toUser']=3D_LO;
		bParams['thread']=3D'XMPP';	=09
	=09
		ws['MessageSend'](hParams,bParams);	=09
	=09
		msg =3D '<Message>';
		msg +=3D '<Name>';
		msg +=3D bParams['strFirst'] + ' ' + bParams['strLast'];
		msg +=3D '</Name>';
		msg +=3D '</Message>';
		msg =3D escape(msg);
	=09
		bParams['text']=3Dmsg;	=09
	=09
		ws['MessageSend'](hParams,bParams);
	}
	catch(e)
	{
		HandleError(e);
	}
}

function AppendToMessageWindow(msg, color, unwrap)=20
{=09
	if(unwrap =3D=3D true)
		msg =3D Unwrap(msg);
=09
	if(msg !=3D 'contact' && msg !=3D 'name')
	{
		if (document.getElementById('outMessage').innerHTML.length > 0)=20
			=
document.getElementById('outMessage').innerHTML=3Ddocument.getElementById=
('outMessage').innerHTML + "<br>";
		=09
		var pref;
		if(unwrap)
			pref =3D "<b>" + _Name + " said:</b><br>";
		else
			pref =3D "<b>You said:</b><br>";
	=09
		=
document.getElementById('outMessage').innerHTML=3Ddocument.getElementById=
('outMessage').innerHTML + "<font color=3D'" + color + "'>" + pref + msg =
+ "</font>";
		document.getElementById('outMessage').scrollTop =3D =
document.getElementById('outMessage').scrollHeight;
	}
	else if(msg =3D=3D 'contact')
	{
		GetContactInfo();
	}=09
}=09

function DoLogin()
{
	try
	{	=09
		ws =3D new WebService(OnWebserviceCallback, window.location.protocol + =
'//' + window.location.host + =
'/chat/ws/SoapBoxWebServiceWithRawXml.asmx');
	=09
		var hParams=3D{};
		var bParams=3D{};

		hParams['SessionID']=3D'';
		bParams['username']=3D_UID;
		bParams['password']=3D'alamode';
		bParams['autocreate']=3Dtrue;
		bParams['hostname']=3D_Server;    =09

		ws['SessionLogin'](hParams,bParams);=09
	}
	catch(e)
	{
		HandleError(e);
	}
}

function WatchTimeout()
{
	if(true =3D=3D _Waiting)
	{
		_Waiting =3D false;
		messageWait();=09
	}
}

function DoLogout()
{/*
	try
	{	=09
		try
		{
			if(null =3D=3D _SessionID || _SessionID =3D=3D 'undefined' || =
_SessionID.length =3D=3D 0)
				return;
		}
		catch(ex)
		{
			return;
		}
		=09
		if(null =3D=3D ws)
			ws =3D new WebService(OnWebserviceCallback, window.location.protocol =
+ '//' + window.location.host + =
'/chat/ws/SoapBoxWebServiceWithRawXml.asmx');
	=09
		_Presence =3D 'unavailable';
		SendPresence();
	=09
		var hParams=3D{};
		var bParams=3D{};
	=09
		hParams['SessionID']=3D _SessionID;
		bParams['remove']=3Dtrue;

		ws['SessionLogoutEx'](hParams,bParams);
=09
		ws.dispose();
		ws =3D null;	=09
	}
	catch(e)
	{
		HandleError(e);
	}*/
}

function OnWebserviceCallback(sessionID, data, xml, error)
{
	try
	{
		if(true =3D=3D _Closing)
			return;
		=09
		if(data =3D=3D null)
		{
			messageWait();
			return;
		}
		=09
		if(sessionID !=3D null && _SessionID.length =3D=3D 0)
			_SessionID =3D sessionID;
		=09
		var webService =3D GetResponseType(data);
	=09
		switch (webService)
		{
			case 'SessionLoginResponse':
				SendPresence();
				break;		=09
			case 'MessageWaitForIncomingResponse':
				OnMessageWait(sessionID, data, xml, error);
				SendPresence();
				break;	=09
			case 'MessageSendResponse':
				messageWait();
				break;=09
			case 'CancelMessageWaitForIncomingResponse':
				DoSendMessageEx();
				break;
			case 'PresenceSendAvailableResponse':
				messageWait();
				break;
			case 'soap:Fault':
				alert(data);
				break;
			default:		=09
				break;
		}
	}
	catch(e)
	{
		HandleError(e);	=09
		messageWait();
	}
}

function GetResponseType(data)
{
	// code for IE
	if (window.ActiveXObject)
    {
        var xmlobject=3Dnew ActiveXObject("Microsoft.XMLDOM");
        xmlobject.async=3D"false";
        xmlobject.loadXML(data);
    }
	// code for Mozilla, Firefox, Opera, etc.
	else
    {
        var parser=3Dnew DOMParser();
        var xmlobject=3Dparser.parseFromString(data,"text/xml");
    }

	// get the XML root item
	var root =3D xmlobject.getElementsByTagName('Body');
	if(root[0] =3D=3D null)
		root =3D xmlobject.getElementsByTagName('soap:Body');
	=09
	if(root[0] !=3D null)
	{
		var responseType =3D root[0].firstChild;
		if (responseType)
			return responseType.nodeName;
		else
			return "";
	}
	else
		return "";
}

var isIE =3D (window.navigator.userAgent.indexOf("MSIE") > 0);
if (! isIE)=20
	{
	HTMLElement.prototype.__defineGetter__("innerText", function () { =
return(this.textContent); });
	HTMLElement.prototype.__defineSetter__("innerText", function (txt) { =
this.textContent =3D txt; });
	}
------=_NextPart_000_0061_01C82292.502B3E40
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.melindaflynn.com/chat/js/yahoo.js

/*=0A=
Copyright (c) 2007, Yahoo! Inc. All rights reserved.=0A=
Code licensed under the BSD License:=0A=
http://developer.yahoo.net/yui/license.txt=0A=
version: 2.3.1=0A=
*/=0A=
/**=0A=
 * The YAHOO object is the single global object used by YUI Library.  It=0A=
 * contains utility function for setting up namespaces, inheritance, and=0A=
 * logging.  YAHOO.util, YAHOO.widget, and YAHOO.example are namespaces=0A=
 * created automatically for and used by the library.=0A=
 * @module yahoo=0A=
 * @title  YAHOO Global=0A=
 */=0A=
=0A=
/**=0A=
 * YAHOO_config is not included as part of the library.  Instead it is =
an =0A=
 * object that can be defined by the implementer immediately before =0A=
 * including the YUI library.  The properties included in this object=0A=
 * will be used to configure global properties needed as soon as the =0A=
 * library begins to load.=0A=
 * @class YAHOO_config=0A=
 * @static=0A=
 */=0A=
=0A=
/**=0A=
 * A reference to a function that will be executed every time a YAHOO =
module=0A=
 * is loaded.  As parameter, this function will receive the version=0A=
 * information for the module. See <a href=3D"YAHOO.env.html#getVersion">=0A=
 * YAHOO.env.getVersion</a> for the description of the version data =
structure.=0A=
 * @property listener=0A=
 * @type Function=0A=
 * @static=0A=
 * @default undefined=0A=
 */=0A=
=0A=
/**=0A=
 * Set to true if the library will be dynamically loaded after =
window.onload.=0A=
 * Defaults to false =0A=
 * @property injecting=0A=
 * @type boolean=0A=
 * @static=0A=
 * @default undefined=0A=
 */=0A=
=0A=
/**=0A=
 * Instructs the yuiloader component to dynamically load yui components =
and=0A=
 * their dependencies.  See the yuiloader documentation for more =
information=0A=
 * about dynamic loading=0A=
 * @property load=0A=
 * @static=0A=
 * @default undefined=0A=
 * @see yuiloader=0A=
 */=0A=
=0A=
if (typeof YAHOO =3D=3D "undefined") {=0A=
    /**=0A=
     * The YAHOO global namespace object.  If YAHOO is already defined, =
the=0A=
     * existing YAHOO object will not be overwritten so that defined=0A=
     * namespaces are preserved.=0A=
     * @class YAHOO=0A=
     * @static=0A=
     */=0A=
    var YAHOO =3D {};=0A=
}=0A=
=0A=
/**=0A=
 * Returns the namespace specified and creates it if it doesn't exist=0A=
 * <pre>=0A=
 * YAHOO.namespace("property.package");=0A=
 * YAHOO.namespace("YAHOO.property.package");=0A=
 * </pre>=0A=
 * Either of the above would create YAHOO.property, then=0A=
 * YAHOO.property.package=0A=
 *=0A=
 * Be careful when naming packages. Reserved words may work in some =
browsers=0A=
 * and not others. For instance, the following will fail in Safari:=0A=
 * <pre>=0A=
 * YAHOO.namespace("really.long.nested.namespace");=0A=
 * </pre>=0A=
 * This fails because "long" is a future reserved word in ECMAScript=0A=
 *=0A=
 * @method namespace=0A=
 * @static=0A=
 * @param  {String*} arguments 1-n namespaces to create =0A=
 * @return {Object}  A reference to the last namespace object created=0A=
 */=0A=
YAHOO.namespace =3D function() {=0A=
    var a=3Darguments, o=3Dnull, i, j, d;=0A=
    for (i=3D0; i<a.length; i=3Di+1) {=0A=
        d=3Da[i].split(".");=0A=
        o=3DYAHOO;=0A=
=0A=
        // YAHOO is implied, so it is ignored if it is included=0A=
        for (j=3D(d[0] =3D=3D "YAHOO") ? 1 : 0; j<d.length; j=3Dj+1) {=0A=
            o[d[j]]=3Do[d[j]] || {};=0A=
            o=3Do[d[j]];=0A=
        }=0A=
    }=0A=
=0A=
    return o;=0A=
};=0A=
=0A=
/**=0A=
 * Uses YAHOO.widget.Logger to output a log message, if the widget is=0A=
 * available.=0A=
 *=0A=
 * @method log=0A=
 * @static=0A=
 * @param  {String}  msg  The message to log.=0A=
 * @param  {String}  cat  The log category for the message.  Default=0A=
 *                        categories are "info", "warn", "error", time".=0A=
 *                        Custom categories can be used as well. (opt)=0A=
 * @param  {String}  src  The source of the the message (opt)=0A=
 * @return {Boolean}      True if the log operation was successful.=0A=
 */=0A=
YAHOO.log =3D function(msg, cat, src) {=0A=
    var l=3DYAHOO.widget.Logger;=0A=
    if(l && l.log) {=0A=
        return l.log(msg, cat, src);=0A=
    } else {=0A=
        return false;=0A=
    }=0A=
};=0A=
=0A=
/**=0A=
 * Registers a module with the YAHOO object=0A=
 * @method register=0A=
 * @static=0A=
 * @param {String}   name    the name of the module (event, slider, etc)=0A=
 * @param {Function} mainClass a reference to class in the module.  This=0A=
 *                             class will be tagged with the version info=0A=
 *                             so that it will be possible to identify =
the=0A=
 *                             version that is in use when multiple =
versions=0A=
 *                             have loaded=0A=
 * @param {Object}   data      metadata object for the module.  =
Currently it=0A=
 *                             is expected to contain a "version" =
property=0A=
 *                             and a "build" property at minimum.=0A=
 */=0A=
YAHOO.register =3D function(name, mainClass, data) {=0A=
    var mods =3D YAHOO.env.modules;=0A=
    if (!mods[name]) {=0A=
        mods[name] =3D { versions:[], builds:[] };=0A=
    }=0A=
    var =
m=3Dmods[name],v=3Ddata.version,b=3Ddata.build,ls=3DYAHOO.env.listeners;=0A=
    m.name =3D name;=0A=
    m.version =3D v;=0A=
    m.build =3D b;=0A=
    m.versions.push(v);=0A=
    m.builds.push(b);=0A=
    m.mainClass =3D mainClass;=0A=
    // fire the module load listeners=0A=
    for (var i=3D0;i<ls.length;i=3Di+1) {=0A=
        ls[i](m);=0A=
    }=0A=
    // label the main class=0A=
    if (mainClass) {=0A=
        mainClass.VERSION =3D v;=0A=
        mainClass.BUILD =3D b;=0A=
    } else {=0A=
        YAHOO.log("mainClass is undefined for module " + name, "warn");=0A=
    }=0A=
};=0A=
=0A=
/**=0A=
 * YAHOO.env is used to keep track of what is known about the YUI =
library and=0A=
 * the browsing environment=0A=
 * @class YAHOO.env=0A=
 * @static=0A=
 */=0A=
YAHOO.env =3D YAHOO.env || {=0A=
=0A=
    /**=0A=
     * Keeps the version info for all YUI modules that have reported =
themselves=0A=
     * @property modules=0A=
     * @type Object[]=0A=
     */=0A=
    modules: [],=0A=
    =0A=
    /**=0A=
     * List of functions that should be executed every time a YUI module=0A=
     * reports itself.=0A=
     * @property listeners=0A=
     * @type Function[]=0A=
     */=0A=
    listeners: []=0A=
};=0A=
=0A=
/**=0A=
 * Returns the version data for the specified module:=0A=
 *      <dl>=0A=
 *      <dt>name:</dt>      <dd>The name of the module</dd>=0A=
 *      <dt>version:</dt>   <dd>The version in use</dd>=0A=
 *      <dt>build:</dt>     <dd>The build number in use</dd>=0A=
 *      <dt>versions:</dt>  <dd>All versions that were registered</dd>=0A=
 *      <dt>builds:</dt>    <dd>All builds that were registered.</dd>=0A=
 *      <dt>mainClass:</dt> <dd>An object that was was stamped with the=0A=
 *                 current version and build. If =0A=
 *                 mainClass.VERSION !=3D version or mainClass.BUILD =
!=3D build,=0A=
 *                 multiple versions of pieces of the library have been=0A=
 *                 loaded, potentially causing issues.</dd>=0A=
 *       </dl>=0A=
 *=0A=
 * @method getVersion=0A=
 * @static=0A=
 * @param {String}  name the name of the module (event, slider, etc)=0A=
 * @return {Object} The version info=0A=
 */=0A=
YAHOO.env.getVersion =3D function(name) {=0A=
    return YAHOO.env.modules[name] || null;=0A=
};=0A=
=0A=
/**=0A=
 * Do not fork for a browser if it can be avoided.  Use feature =
detection when=0A=
 * you can.  Use the user agent as a last resort.  YAHOO.env.ua stores a =
version=0A=
 * number for the browser engine, 0 otherwise.  This value may or may =
not map=0A=
 * to the version number of the browser using the engine.  The value is =0A=
 * presented as a float so that it can easily be used for boolean =
evaluation =0A=
 * as well as for looking for a particular range of versions.  Because =
of this, =0A=
 * some of the granularity of the version info may be lost (e.g., Gecko =
1.8.0.9 =0A=
 * reports 1.8).=0A=
 * @class YAHOO.env.ua=0A=
 * @static=0A=
 */=0A=
YAHOO.env.ua =3D function() {=0A=
    var o=3D{=0A=
=0A=
        /**=0A=
         * Internet Explorer version number or 0.  Example: 6=0A=
         * @property ie=0A=
         * @type float=0A=
         */=0A=
        ie:0,=0A=
=0A=
        /**=0A=
         * Opera version number or 0.  Example: 9.2=0A=
         * @property opera=0A=
         * @type float=0A=
         */=0A=
        opera:0,=0A=
=0A=
        /**=0A=
         * Gecko engine revision number.  Will evaluate to 1 if Gecko =0A=
         * is detected but the revision could not be found. Other =
browsers=0A=
         * will be 0.  Example: 1.8=0A=
         * <pre>=0A=
         * Firefox 1.0.0.4: 1.7.8   <-- Reports 1.7=0A=
         * Firefox 1.5.0.9: 1.8.0.9 <-- Reports 1.8=0A=
         * Firefox 2.0.0.3: 1.8.1.3 <-- Reports 1.8=0A=
         * Firefox 3 alpha: 1.9a4   <-- Reports 1.9=0A=
         * </pre>=0A=
         * @property gecko=0A=
         * @type float=0A=
         */=0A=
        gecko:0,=0A=
=0A=
        /**=0A=
         * AppleWebKit version.  KHTML browsers that are not WebKit =
browsers =0A=
         * will evaluate to 1, other browsers 0.  Example: 418.9.1=0A=
         * <pre>=0A=
         * Safari 1.3.2 (312.6): 312.8.1 <-- Reports 312.8 -- currently =
the =0A=
         *                                   latest available for Mac =
OSX 10.3.=0A=
         * Safari 2.0.2:         416     <-- hasOwnProperty introduced=0A=
         * Safari 2.0.4:         418     <-- preventDefault fixed=0A=
         * Safari 2.0.4 (419.3): 418.9.1 <-- One version of Safari may =
run=0A=
         *                                   different versions of webkit=0A=
         * Safari 2.0.4 (419.3): 419     <-- Current Safari release=0A=
         * Webkit 212 nightly:   522+    <-- Safari 3.0 (with native =
SVG) should=0A=
         *                                   be higher than this=0A=
         *                                   =0A=
         * </pre>=0A=
         * http://developer.apple.com/internet/safari/uamatrix.html=0A=
         * @property webkit=0A=
         * @type float=0A=
         */=0A=
        webkit:0=0A=
    };=0A=
=0A=
    var ua=3Dnavigator.userAgent, m;=0A=
=0A=
    // Modern KHTML browsers should qualify as Safari X-Grade=0A=
    if ((/KHTML/).test(ua)) {=0A=
        o.webkit=3D1;=0A=
    }=0A=
    // Modern WebKit browsers are at least X-Grade=0A=
    m=3Dua.match(/AppleWebKit\/([^\s]*)/);=0A=
    if (m&&m[1]) {=0A=
        o.webkit=3DparseFloat(m[1]);=0A=
    }=0A=
=0A=
    if (!o.webkit) { // not webkit=0A=
        // @todo check Opera/8.01 (J2ME/MIDP; Opera Mini/2.0.4509/1316; =
fi; U; ssr)=0A=
        m=3Dua.match(/Opera[\s\/]([^\s]*)/);=0A=
        if (m&&m[1]) {=0A=
            o.opera=3DparseFloat(m[1]);=0A=
        } else { // not opera or webkit=0A=
            m=3Dua.match(/MSIE\s([^;]*)/);=0A=
            if (m&&m[1]) {=0A=
                o.ie=3DparseFloat(m[1]);=0A=
            } else { // not opera, webkit, or ie=0A=
                m=3Dua.match(/Gecko\/([^\s]*)/);=0A=
                if (m) {=0A=
                    o.gecko=3D1; // Gecko detected, look for revision=0A=
                    m=3Dua.match(/rv:([^\s\)]*)/);=0A=
                    if (m&&m[1]) {=0A=
                        o.gecko=3DparseFloat(m[1]);=0A=
                    }=0A=
                }=0A=
            }=0A=
        }=0A=
    }=0A=
    =0A=
    return o;=0A=
}();=0A=
=0A=
/*=0A=
 * Initializes the global by creating the default namespaces and applying=0A=
 * any new configuration information that is detected.  This is the setup=0A=
 * for env.=0A=
 * @method init=0A=
 * @static=0A=
 * @private=0A=
 */=0A=
(function() {=0A=
    YAHOO.namespace("util", "widget", "example");=0A=
    if ("undefined" !=3D=3D typeof YAHOO_config) {=0A=
        var =
l=3DYAHOO_config.listener,ls=3DYAHOO.env.listeners,unique=3Dtrue,i;=0A=
        if (l) {=0A=
            // if YAHOO is loaded multiple times we need to check to see =
if=0A=
            // this is a new config object.  If it is, add the new =
component=0A=
            // load listener to the stack=0A=
            for (i=3D0;i<ls.length;i=3Di+1) {=0A=
                if (ls[i]=3D=3Dl) {=0A=
                    unique=3Dfalse;=0A=
                    break;=0A=
                }=0A=
            }=0A=
            if (unique) {=0A=
                ls.push(l);=0A=
            }=0A=
        }=0A=
    }=0A=
})();=0A=
/**=0A=
 * Provides the language utilites and extensions used by the library=0A=
 * @class YAHOO.lang=0A=
 */=0A=
YAHOO.lang =3D {=0A=
    /**=0A=
     * Determines whether or not the provided object is an array.=0A=
     * Testing typeof/instanceof/constructor of arrays across frame =0A=
     * boundaries isn't possible in Safari unless you have a reference=0A=
     * to the other frame to test against its Array prototype.  To=0A=
     * handle this case, we test well-known array properties instead.=0A=
     * properties.=0A=
     * @method isArray=0A=
     * @param {any} o The object being testing=0A=
     * @return Boolean=0A=
     */=0A=
    isArray: function(o) { =0A=
=0A=
        if (o) {=0A=
           var l =3D YAHOO.lang;=0A=
           return l.isNumber(o.length) && l.isFunction(o.splice) && =0A=
                  !l.hasOwnProperty(o.length);=0A=
        }=0A=
        return false;=0A=
    },=0A=
=0A=
    /**=0A=
     * Determines whether or not the provided object is a boolean=0A=
     * @method isBoolean=0A=
     * @param {any} o The object being testing=0A=
     * @return Boolean=0A=
     */=0A=
    isBoolean: function(o) {=0A=
        return typeof o =3D=3D=3D 'boolean';=0A=
    },=0A=
    =0A=
    /**=0A=
     * Determines whether or not the provided object is a function=0A=
     * @method isFunction=0A=
     * @param {any} o The object being testing=0A=
     * @return Boolean=0A=
     */=0A=
    isFunction: function(o) {=0A=
        return typeof o =3D=3D=3D 'function';=0A=
    },=0A=
        =0A=
    /**=0A=
     * Determines whether or not the provided object is null=0A=
     * @method isNull=0A=
     * @param {any} o The object being testing=0A=
     * @return Boolean=0A=
     */=0A=
    isNull: function(o) {=0A=
        return o =3D=3D=3D null;=0A=
    },=0A=
        =0A=
    /**=0A=
     * Determines whether or not the provided object is a legal number=0A=
     * @method isNumber=0A=
     * @param {any} o The object being testing=0A=
     * @return Boolean=0A=
     */=0A=
    isNumber: function(o) {=0A=
        return typeof o =3D=3D=3D 'number' && isFinite(o);=0A=
    },=0A=
      =0A=
    /**=0A=
     * Determines whether or not the provided object is of type object=0A=
     * or function=0A=
     * @method isObject=0A=
     * @param {any} o The object being testing=0A=
     * @return Boolean=0A=
     */  =0A=
    isObject: function(o) {=0A=
return (o && (typeof o =3D=3D=3D 'object' || YAHOO.lang.isFunction(o))) =
|| false;=0A=
    },=0A=
        =0A=
    /**=0A=
     * Determines whether or not the provided object is a string=0A=
     * @method isString=0A=
     * @param {any} o The object being testing=0A=
     * @return Boolean=0A=
     */=0A=
    isString: function(o) {=0A=
        return typeof o =3D=3D=3D 'string';=0A=
    },=0A=
        =0A=
    /**=0A=
     * Determines whether or not the provided object is undefined=0A=
     * @method isUndefined=0A=
     * @param {any} o The object being testing=0A=
     * @return Boolean=0A=
     */=0A=
    isUndefined: function(o) {=0A=
        return typeof o =3D=3D=3D 'undefined';=0A=
    },=0A=
    =0A=
    /**=0A=
     * Determines whether or not the property was added=0A=
     * to the object instance.  Returns false if the property is not =
present=0A=
     * in the object, or was inherited from the prototype.=0A=
     * This abstraction is provided to enable hasOwnProperty for Safari =
1.3.x.=0A=
     * There is a discrepancy between YAHOO.lang.hasOwnProperty and=0A=
     * Object.prototype.hasOwnProperty when the property is a primitive =
added to=0A=
     * both the instance AND prototype with the same value:=0A=
     * <pre>=0A=
     * var A =3D function() {};=0A=
     * A.prototype.foo =3D 'foo';=0A=
     * var a =3D new A();=0A=
     * a.foo =3D 'foo';=0A=
     * alert(a.hasOwnProperty('foo')); // true=0A=
     * alert(YAHOO.lang.hasOwnProperty(a, 'foo')); // false when using =
fallback=0A=
     * </pre>=0A=
     * @method hasOwnProperty=0A=
     * @param {any} o The object being testing=0A=
     * @return Boolean=0A=
     */=0A=
    hasOwnProperty: function(o, prop) {=0A=
        if (Object.prototype.hasOwnProperty) {=0A=
            return o.hasOwnProperty(prop);=0A=
        }=0A=
        =0A=
        return !YAHOO.lang.isUndefined(o[prop]) && =0A=
                o.constructor.prototype[prop] !=3D=3D o[prop];=0A=
    },=0A=
 =0A=
    /**=0A=
     * IE will not enumerate native functions in a derived object even =
if the=0A=
     * function was overridden.  This is a workaround for specific =
functions =0A=
     * we care about on the Object prototype. =0A=
     * @property _IEEnumFix=0A=
     * @param {Function} r  the object to receive the augmentation=0A=
     * @param {Function} s  the object that supplies the properties to =
augment=0A=
     * @static=0A=
     * @private=0A=
     */=0A=
    _IEEnumFix: function(r, s) {=0A=
        if (YAHOO.env.ua.ie) {=0A=
            var add=3D["toString", "valueOf"], i;=0A=
            for (i=3D0;i<add.length;i=3Di+1) {=0A=
                var fname=3Dadd[i],f=3Ds[fname];=0A=
                if (YAHOO.lang.isFunction(f) && =
f!=3DObject.prototype[fname]) {=0A=
                    r[fname]=3Df;=0A=
                }=0A=
            }=0A=
        }=0A=
    },=0A=
       =0A=
    /**=0A=
     * Utility to set up the prototype, constructor and superclass =
properties to=0A=
     * support an inheritance strategy that can chain constructors and =
methods.=0A=
     * Static members will not be inherited.=0A=
     *=0A=
     * @method extend=0A=
     * @static=0A=
     * @param {Function} subc   the object to modify=0A=
     * @param {Function} superc the object to inherit=0A=
     * @param {Object} overrides  additional properties/methods to add =
to the=0A=
     *                              subclass prototype.  These will =
override the=0A=
     *                              matching items obtained from the =
superclass =0A=
     *                              if present.=0A=
     */=0A=
    extend: function(subc, superc, overrides) {=0A=
        if (!superc||!subc) {=0A=
            throw new Error("YAHOO.lang.extend failed, please check that =
" +=0A=
                            "all dependencies are included.");=0A=
        }=0A=
        var F =3D function() {};=0A=
        F.prototype=3Dsuperc.prototype;=0A=
        subc.prototype=3Dnew F();=0A=
        subc.prototype.constructor=3Dsubc;=0A=
        subc.superclass=3Dsuperc.prototype;=0A=
        if (superc.prototype.constructor =3D=3D =
Object.prototype.constructor) {=0A=
            superc.prototype.constructor=3Dsuperc;=0A=
        }=0A=
    =0A=
        if (overrides) {=0A=
            for (var i in overrides) {=0A=
                subc.prototype[i]=3Doverrides[i];=0A=
            }=0A=
=0A=
            YAHOO.lang._IEEnumFix(subc.prototype, overrides);=0A=
        }=0A=
    },=0A=
   =0A=
    /**=0A=
     * Applies all properties in the supplier to the receiver if the=0A=
     * receiver does not have these properties yet.  Optionally, one or =0A=
     * more methods/properties can be specified (as additional =0A=
     * parameters).  This option will overwrite the property if receiver =0A=
     * has it already.  If true is passed as the third parameter, all =0A=
     * properties will be applied and _will_ overwrite properties in =0A=
     * the receiver.=0A=
     *=0A=
     * @method augmentObject=0A=
     * @static=0A=
     * @since 2.3.0=0A=
     * @param {Function} r  the object to receive the augmentation=0A=
     * @param {Function} s  the object that supplies the properties to =
augment=0A=
     * @param {String*|boolean}  arguments zero or more properties =
methods =0A=
     *        to augment the receiver with.  If none specified, =
everything=0A=
     *        in the supplier will be used unless it would=0A=
     *        overwrite an existing property in the receiver. If true=0A=
     *        is specified as the third parameter, all properties will=0A=
     *        be applied and will overwrite an existing property in=0A=
     *        the receiver=0A=
     */=0A=
    augmentObject: function(r, s) {=0A=
        if (!s||!r) {=0A=
            throw new Error("Absorb failed, verify dependencies.");=0A=
        }=0A=
        var a=3Darguments, i, p, override=3Da[2];=0A=
        if (override && override!=3D=3Dtrue) { // only absorb the =
specified properties=0A=
            for (i=3D2; i<a.length; i=3Di+1) {=0A=
                r[a[i]] =3D s[a[i]];=0A=
            }=0A=
        } else { // take everything, overwriting only if the third =
parameter is true=0A=
            for (p in s) { =0A=
                if (override || !r[p]) {=0A=
                    r[p] =3D s[p];=0A=
                }=0A=
            }=0A=
            =0A=
            YAHOO.lang._IEEnumFix(r, s);=0A=
        }=0A=
    },=0A=
 =0A=
    /**=0A=
     * Same as YAHOO.lang.augmentObject, except it only applies =
prototype properties=0A=
     * @see YAHOO.lang.augmentObject=0A=
     * @method augmentProto=0A=
     * @static=0A=
     * @param {Function} r  the object to receive the augmentation=0A=
     * @param {Function} s  the object that supplies the properties to =
augment=0A=
     * @param {String*|boolean}  arguments zero or more properties =
methods =0A=
     *        to augment the receiver with.  If none specified, =
everything =0A=
     *        in the supplier will be used unless it would overwrite an =
existing =0A=
     *        property in the receiver.  if true is specified as the =
third =0A=
     *        parameter, all properties will be applied and will =
overwrite an =0A=
     *        existing property in the receiver=0A=
     */=0A=
    augmentProto: function(r, s) {=0A=
        if (!s||!r) {=0A=
            throw new Error("Augment failed, verify dependencies.");=0A=
        }=0A=
        //var a=3D[].concat(arguments);=0A=
        var a=3D[r.prototype,s.prototype];=0A=
        for (var i=3D2;i<arguments.length;i=3Di+1) {=0A=
            a.push(arguments[i]);=0A=
        }=0A=
        YAHOO.lang.augmentObject.apply(this, a);=0A=
    },=0A=
=0A=
      =0A=
    /**=0A=
     * Returns a simple string representation of the object or array.=0A=
     * Other types of objects will be returned unprocessed.  Arrays=0A=
     * are expected to be indexed.  Use object notation for=0A=
     * associative arrays.=0A=
     * @method dump=0A=
     * @since 2.3.0=0A=
     * @param o {Object} The object to dump=0A=
     * @param d {int} How deep to recurse child objects, default 3=0A=
     * @return {String} the dump result=0A=
     */=0A=
    dump: function(o, d) {=0A=
        var l=3DYAHOO.lang,i,len,s=3D[],OBJ=3D"{...}",FUN=3D"f(){...}",=0A=
            COMMA=3D', ', ARROW=3D' =3D> ';=0A=
=0A=
        // Cast non-objects to string=0A=
        // Skip dates because the std toString is what we want=0A=
        // Skip HTMLElement-like objects because trying to dump =0A=
        // an element will cause an unhandled exception in FF 2.x=0A=
        if (!l.isObject(o)) {=0A=
            return o + "";=0A=
        } else if (o instanceof Date || ("nodeType" in o && "tagName" in =
o)) {=0A=
            return o;=0A=
        } else if  (l.isFunction(o)) {=0A=
            return FUN;=0A=
        }=0A=
=0A=
        // dig into child objects the depth specifed. Default 3=0A=
        d =3D (l.isNumber(d)) ? d : 3;=0A=
=0A=
        // arrays [1, 2, 3]=0A=
        if (l.isArray(o)) {=0A=
            s.push("[");=0A=
            for (i=3D0,len=3Do.length;i<len;i=3Di+1) {=0A=
                if (l.isObject(o[i])) {=0A=
                    s.push((d > 0) ? l.dump(o[i], d-1) : OBJ);=0A=
                } else {=0A=
                    s.push(o[i]);=0A=
                }=0A=
                s.push(COMMA);=0A=
            }=0A=
            if (s.length > 1) {=0A=
                s.pop();=0A=
            }=0A=
            s.push("]");=0A=
        // objects {k1 =3D> v1, k2 =3D> v2}=0A=
        } else {=0A=
            s.push("{");=0A=
            for (i in o) {=0A=
                if (l.hasOwnProperty(o, i)) {=0A=
                    s.push(i + ARROW);=0A=
                    if (l.isObject(o[i])) {=0A=
                        s.push((d > 0) ? l.dump(o[i], d-1) : OBJ);=0A=
                    } else {=0A=
                        s.push(o[i]);=0A=
                    }=0A=
                    s.push(COMMA);=0A=
                }=0A=
            }=0A=
            if (s.length > 1) {=0A=
                s.pop();=0A=
            }=0A=
            s.push("}");=0A=
        }=0A=
=0A=
        return s.join("");=0A=
    },=0A=
=0A=
    /**=0A=
     * Does variable substitution on a string. It scans through the =
string =0A=
     * looking for expressions enclosed in { } braces. If an expression =0A=
     * is found, it is used a key on the object.  If there is a space in=0A=
     * the key, the first word is used for the key and the rest is =
provided=0A=
     * to an optional function to be used to programatically determine =
the=0A=
     * value (the extra information might be used for this decision). If =0A=
     * the value for the key in the object, or what is returned from the=0A=
     * function has a string value, number value, or object value, it is =0A=
     * substituted for the bracket expression and it repeats.  If this=0A=
     * value is an object, it uses the Object's toString() if this has=0A=
     * been overridden, otherwise it does a shallow dump of the key/value=0A=
     * pairs.=0A=
     * @method substitute=0A=
     * @since 2.3.0=0A=
     * @param s {String} The string that will be modified.=0A=
     * @param o {Object} An object containing the replacement values=0A=
     * @param f {Function} An optional function that can be used to=0A=
     *                     process each match.  It receives the key,=0A=
     *                     value, and any extra metadata included with=0A=
     *                     the key inside of the braces.=0A=
     * @return {String} the substituted string=0A=
     */=0A=
    substitute: function (s, o, f) {=0A=
        var i, j, k, key, v, meta, l=3DYAHOO.lang, saved=3D[], token, =0A=
            DUMP=3D'dump', SPACE=3D' ', LBRACE=3D'{', RBRACE=3D'}';=0A=
=0A=
=0A=
        for (;;) {=0A=
            i =3D s.lastIndexOf(LBRACE);=0A=
            if (i < 0) {=0A=
                break;=0A=
            }=0A=
            j =3D s.indexOf(RBRACE, i);=0A=
            if (i + 1 >=3D j) {=0A=
                break;=0A=
            }=0A=
=0A=
            //Extract key and meta info =0A=
            token =3D s.substring(i + 1, j);=0A=
            key =3D token;=0A=
            meta =3D null;=0A=
            k =3D key.indexOf(SPACE);=0A=
            if (k > -1) {=0A=
                meta =3D key.substring(k + 1);=0A=
                key =3D key.substring(0, k);=0A=
            }=0A=
=0A=
            // lookup the value=0A=
            v =3D o[key];=0A=
=0A=
            // if a substitution function was provided, execute it=0A=
            if (f) {=0A=
                v =3D f(key, v, meta);=0A=
            }=0A=
=0A=
            if (l.isObject(v)) {=0A=
                if (l.isArray(v)) {=0A=
                    v =3D l.dump(v, parseInt(meta, 10));=0A=
                } else {=0A=
                    meta =3D meta || "";=0A=
=0A=
                    // look for the keyword 'dump', if found force obj =
dump=0A=
                    var dump =3D meta.indexOf(DUMP);=0A=
                    if (dump > -1) {=0A=
                        meta =3D meta.substring(4);=0A=
                    }=0A=
=0A=
                    // use the toString if it is not the Object toString =0A=
                    // and the 'dump' meta info was not found=0A=
                    if =
(v.toString=3D=3D=3DObject.prototype.toString||dump>-1) {=0A=
                        v =3D l.dump(v, parseInt(meta, 10));=0A=
                    } else {=0A=
                        v =3D v.toString();=0A=
                    }=0A=
                }=0A=
            } else if (!l.isString(v) && !l.isNumber(v)) {=0A=
                // This {block} has no replace string. Save it for later.=0A=
                v =3D "~-" + saved.length + "-~";=0A=
                saved[saved.length] =3D token;=0A=
=0A=
                // break;=0A=
            }=0A=
=0A=
            s =3D s.substring(0, i) + v + s.substring(j + 1);=0A=
=0A=
=0A=
        }=0A=
=0A=
        // restore saved {block}s=0A=
        for (i=3Dsaved.length-1; i>=3D0; i=3Di-1) {=0A=
            s =3D s.replace(new RegExp("~-" + i + "-~"), "{"  + saved[i] =
+ "}", "g");=0A=
        }=0A=
=0A=
        return s;=0A=
    },=0A=
=0A=
=0A=
    /**=0A=
     * Returns a string without any leading or trailing whitespace.  If =0A=
     * the input is not a string, the input will be returned untouched.=0A=
     * @method trim=0A=
     * @since 2.3.0=0A=
     * @param s {string} the string to trim=0A=
     * @return {string} the trimmed string=0A=
     */=0A=
    trim: function(s){=0A=
        try {=0A=
            return s.replace(/^\s+|\s+$/g, "");=0A=
        } catch(e) {=0A=
            return s;=0A=
        }=0A=
    },=0A=
=0A=
    /**=0A=
     * Returns a new object containing all of the properties of=0A=
     * all the supplied objects.  The properties from later objects=0A=
     * will overwrite those in earlier objects.=0A=
     * @method merge=0A=
     * @since 2.3.0=0A=
     * @param arguments {Object*} the objects to merge=0A=
     * @return the new merged object=0A=
     */=0A=
    merge: function() {=0A=
        var o=3D{}, a=3Darguments, i;=0A=
        for (i=3D0; i<a.length; i=3Di+1) {=0A=
            YAHOO.lang.augmentObject(o, a[i], true);=0A=
            /*=0A=
            for (var j in a[i]) {=0A=
                o[j] =3D a[i][j];=0A=
            }=0A=
            */=0A=
        }=0A=
        return o;=0A=
    },=0A=
=0A=
    /**=0A=
     * A convenience method for detecting a legitimate non-null value.=0A=
     * Returns false for null/undefined/NaN, true for other values, =0A=
     * including 0/false/''=0A=
     * @method isValue=0A=
     * @since 2.3.0=0A=
     * @param o {any} the item to test=0A=
     * @return {boolean} true if it is not null/undefined/NaN || false=0A=
     */=0A=
    isValue: function(o) {=0A=
        // return (o || o =3D=3D=3D false || o =3D=3D=3D 0 || o =
=3D=3D=3D ''); // Infinity fails=0A=
        var l =3D YAHOO.lang;=0A=
return (l.isObject(o) || l.isString(o) || l.isNumber(o) || =
l.isBoolean(o));=0A=
    }=0A=
=0A=
};=0A=
=0A=
/*=0A=
 * An alias for <a href=3D"YAHOO.lang.html">YAHOO.lang</a>=0A=
 * @class YAHOO.util.Lang=0A=
 */=0A=
YAHOO.util.Lang =3D YAHOO.lang;=0A=
 =0A=
/**=0A=
 * Same as YAHOO.lang.augmentObject, except it only applies prototype =0A=
 * properties.  This is an alias for augmentProto.=0A=
 * @see YAHOO.lang.augmentObject=0A=
 * @method augment=0A=
 * @static=0A=
 * @param {Function} r  the object to receive the augmentation=0A=
 * @param {Function} s  the object that supplies the properties to =
augment=0A=
 * @param {String*|boolean}  arguments zero or more properties methods =
to =0A=
 *        augment the receiver with.  If none specified, everything=0A=
 *        in the supplier will be used unless it would=0A=
 *        overwrite an existing property in the receiver.  if true=0A=
 *        is specified as the third parameter, all properties will=0A=
 *        be applied and will overwrite an existing property in=0A=
 *        the receiver=0A=
 */=0A=
YAHOO.lang.augment =3D YAHOO.lang.augmentProto;=0A=
=0A=
/**=0A=
 * An alias for <a =
href=3D"YAHOO.lang.html#augment">YAHOO.lang.augment</a>=0A=
 * @for YAHOO=0A=
 * @method augment=0A=
 * @static=0A=
 * @param {Function} r  the object to receive the augmentation=0A=
 * @param {Function} s  the object that supplies the properties to =
augment=0A=
 * @param {String*}  arguments zero or more properties methods to =0A=
 *        augment the receiver with.  If none specified, everything=0A=
 *        in the supplier will be used unless it would=0A=
 *        overwrite an existing property in the receiver=0A=
 */=0A=
YAHOO.augment =3D YAHOO.lang.augmentProto;=0A=
       =0A=
/**=0A=
 * An alias for <a href=3D"YAHOO.lang.html#extend">YAHOO.lang.extend</a>=0A=
 * @method extend=0A=
 * @static=0A=
 * @param {Function} subc   the object to modify=0A=
 * @param {Function} superc the object to inherit=0A=
 * @param {Object} overrides  additional properties/methods to add to the=0A=
 *        subclass prototype.  These will override the=0A=
 *        matching items obtained from the superclass if present.=0A=
 */=0A=
YAHOO.extend =3D YAHOO.lang.extend;=0A=
=0A=
YAHOO.register("yahoo", YAHOO, {version: "2.3.1", build: "541"});=0A=

------=_NextPart_000_0061_01C82292.502B3E40
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.melindaflynn.com/chat/js/event.js

/*=0A=
Copyright (c) 2007, Yahoo! Inc. All rights reserved.=0A=
Code licensed under the BSD License:=0A=
http://developer.yahoo.net/yui/license.txt=0A=
version: 2.3.1=0A=
*/=0A=
=0A=
/**=0A=
 * The CustomEvent class lets you define events for your application=0A=
 * that can be subscribed to by one or more independent component.=0A=
 *=0A=
 * @param {String}  type The type of event, which is passed to the =
callback=0A=
 *                  when the event fires=0A=
 * @param {Object}  oScope The context the event will fire from.  "this" =
will=0A=
 *                  refer to this object in the callback.  Default =
value: =0A=
 *                  the window object.  The listener can override this.=0A=
 * @param {boolean} silent pass true to prevent the event from writing to=0A=
 *                  the debugsystem=0A=
 * @param {int}     signature the signature that the custom event =
subscriber=0A=
 *                  will receive. YAHOO.util.CustomEvent.LIST or =0A=
 *                  YAHOO.util.CustomEvent.FLAT.  The default is=0A=
 *                  YAHOO.util.CustomEvent.LIST.=0A=
 * @namespace YAHOO.util=0A=
 * @class CustomEvent=0A=
 * @constructor=0A=
 */=0A=
YAHOO.util.CustomEvent =3D function(type, oScope, silent, signature) {=0A=
=0A=
    /**=0A=
     * The type of event, returned to subscribers when the event fires=0A=
     * @property type=0A=
     * @type string=0A=
     */=0A=
    this.type =3D type;=0A=
=0A=
    /**=0A=
     * The scope the the event will fire from by default.  Defaults to =
the window =0A=
     * obj=0A=
     * @property scope=0A=
     * @type object=0A=
     */=0A=
    this.scope =3D oScope || window;=0A=
=0A=
    /**=0A=
     * By default all custom events are logged in the debug build, set =
silent=0A=
     * to true to disable debug outpu for this event.=0A=
     * @property silent=0A=
     * @type boolean=0A=
     */=0A=
    this.silent =3D silent;=0A=
=0A=
    /**=0A=
     * Custom events support two styles of arguments provided to the =
event=0A=
     * subscribers.  =0A=
     * <ul>=0A=
     * <li>YAHOO.util.CustomEvent.LIST: =0A=
     *   <ul>=0A=
     *   <li>param1: event name</li>=0A=
     *   <li>param2: array of arguments sent to fire</li>=0A=
     *   <li>param3: <optional> a custom object supplied by the =
subscriber</li>=0A=
     *   </ul>=0A=
     * </li>=0A=
     * <li>YAHOO.util.CustomEvent.FLAT=0A=
     *   <ul>=0A=
     *   <li>param1: the first argument passed to fire.  If you need to=0A=
     *           pass multiple parameters, use and array or object =
literal</li>=0A=
     *   <li>param2: <optional> a custom object supplied by the =
subscriber</li>=0A=
     *   </ul>=0A=
     * </li>=0A=
     * </ul>=0A=
     *   @property signature=0A=
     *   @type int=0A=
     */=0A=
    this.signature =3D signature || YAHOO.util.CustomEvent.LIST;=0A=
=0A=
    /**=0A=
     * The subscribers to this event=0A=
     * @property subscribers=0A=
     * @type Subscriber[]=0A=
     */=0A=
    this.subscribers =3D [];=0A=
=0A=
    if (!this.silent) {=0A=
    }=0A=
=0A=
    var onsubscribeType =3D "_YUICEOnSubscribe";=0A=
=0A=
    // Only add subscribe events for events that are not generated by =0A=
    // CustomEvent=0A=
    if (type !=3D=3D onsubscribeType) {=0A=
=0A=
        /**=0A=
         * Custom events provide a custom event that fires whenever =
there is=0A=
         * a new subscriber to the event.  This provides an opportunity =
to=0A=
         * handle the case where there is a non-repeating event that has=0A=
         * already fired has a new subscriber.  =0A=
         *=0A=
         * @event subscribeEvent=0A=
         * @type YAHOO.util.CustomEvent=0A=
         * @param {Function} fn The function to execute=0A=
         * @param {Object}   obj An object to be passed along when the =
event =0A=
         *                       fires=0A=
         * @param {boolean|Object}  override If true, the obj passed in =
becomes =0A=
         *                                   the execution scope of the =
listener.=0A=
         *                                   if an object, that object =
becomes the=0A=
         *                                   the execution scope.=0A=
         */=0A=
        this.subscribeEvent =3D =0A=
                new YAHOO.util.CustomEvent(onsubscribeType, this, true);=0A=
=0A=
    } =0A=
=0A=
=0A=
    /**=0A=
     * In order to make it possible to execute the rest of the subscriber=0A=
     * stack when one thows an exception, the subscribers exceptions are=0A=
     * caught.  The most recent exception is stored in this property=0A=
     * @property lastError=0A=
     * @type Error=0A=
     */=0A=
    this.lastError =3D null;=0A=
};=0A=
=0A=
/**=0A=
 * Subscriber listener sigature constant.  The LIST type returns three=0A=
 * parameters: the event type, the array of args passed to fire, and=0A=
 * the optional custom object=0A=
 * @property YAHOO.util.CustomEvent.LIST=0A=
 * @static=0A=
 * @type int=0A=
 */=0A=
YAHOO.util.CustomEvent.LIST =3D 0;=0A=
=0A=
/**=0A=
 * Subscriber listener sigature constant.  The FLAT type returns two=0A=
 * parameters: the first argument passed to fire and the optional =0A=
 * custom object=0A=
 * @property YAHOO.util.CustomEvent.FLAT=0A=
 * @static=0A=
 * @type int=0A=
 */=0A=
YAHOO.util.CustomEvent.FLAT =3D 1;=0A=
=0A=
YAHOO.util.CustomEvent.prototype =3D {=0A=
=0A=
    /**=0A=
     * Subscribes the caller to this event=0A=
     * @method subscribe=0A=
     * @param {Function} fn        The function to execute=0A=
     * @param {Object}   obj       An object to be passed along when the =
event =0A=
     *                             fires=0A=
     * @param {boolean|Object}  override If true, the obj passed in =
becomes =0A=
     *                                   the execution scope of the =
listener.=0A=
     *                                   if an object, that object =
becomes the=0A=
     *                                   the execution scope.=0A=
     */=0A=
    subscribe: function(fn, obj, override) {=0A=
=0A=
        if (!fn) {=0A=
throw new Error("Invalid callback for subscriber to '" + this.type + =
"'");=0A=
        }=0A=
=0A=
        if (this.subscribeEvent) {=0A=
            this.subscribeEvent.fire(fn, obj, override);=0A=
        }=0A=
=0A=
        this.subscribers.push( new YAHOO.util.Subscriber(fn, obj, =
override) );=0A=
    },=0A=
=0A=
    /**=0A=
     * Unsubscribes subscribers.=0A=
     * @method unsubscribe=0A=
     * @param {Function} fn  The subscribed function to remove, if not =
supplied=0A=
     *                       all will be removed=0A=
     * @param {Object}   obj  The custom object passed to subscribe.  =
This is=0A=
     *                        optional, but if supplied will be used to=0A=
     *                        disambiguate multiple listeners that are =
the same=0A=
     *                        (e.g., you subscribe many object using a =
function=0A=
     *                        that lives on the prototype)=0A=
     * @return {boolean} True if the subscriber was found and detached.=0A=
     */=0A=
    unsubscribe: function(fn, obj) {=0A=
=0A=
        if (!fn) {=0A=
            return this.unsubscribeAll();=0A=
        }=0A=
=0A=
        var found =3D false;=0A=
        for (var i=3D0, len=3Dthis.subscribers.length; i<len; ++i) {=0A=
            var s =3D this.subscribers[i];=0A=
            if (s && s.contains(fn, obj)) {=0A=
                this._delete(i);=0A=
                found =3D true;=0A=
            }=0A=
        }=0A=
=0A=
        return found;=0A=
    },=0A=
=0A=
    /**=0A=
     * Notifies the subscribers.  The callback functions will be executed=0A=
     * from the scope specified when the event was created, and with the =0A=
     * following parameters:=0A=
     *   <ul>=0A=
     *   <li>The type of event</li>=0A=
     *   <li>All of the arguments fire() was executed with as an =
array</li>=0A=
     *   <li>The custom object (if any) that was passed into the =
subscribe() =0A=
     *       method</li>=0A=
     *   </ul>=0A=
     * @method fire =0A=
     * @param {Object*} arguments an arbitrary set of parameters to pass =
to =0A=
     *                            the handler.=0A=
     * @return {boolean} false if one of the subscribers returned false, =0A=
     *                   true otherwise=0A=
     */=0A=
    fire: function() {=0A=
        var len=3Dthis.subscribers.length;=0A=
        if (!len && this.silent) {=0A=
            return true;=0A=
        }=0A=
=0A=
        var args=3D[], ret=3Dtrue, i, rebuild=3Dfalse;=0A=
=0A=
        for (i=3D0; i<arguments.length; ++i) {=0A=
            args.push(arguments[i]);=0A=
        }=0A=
=0A=
        var argslength =3D args.length;=0A=
=0A=
        if (!this.silent) {=0A=
        }=0A=
=0A=
        for (i=3D0; i<len; ++i) {=0A=
            var s =3D this.subscribers[i];=0A=
            if (!s) {=0A=
                rebuild=3Dtrue;=0A=
            } else {=0A=
                if (!this.silent) {=0A=
                }=0A=
=0A=
                var scope =3D s.getScope(this.scope);=0A=
=0A=
                if (this.signature =3D=3D YAHOO.util.CustomEvent.FLAT) {=0A=
                    var param =3D null;=0A=
                    if (args.length > 0) {=0A=
                        param =3D args[0];=0A=
                    }=0A=
=0A=
                    try {=0A=
                        ret =3D s.fn.call(scope, param, s.obj);=0A=
                    } catch(e) {=0A=
                        this.lastError =3D e;=0A=
                    }=0A=
                } else {=0A=
                    try {=0A=
                        ret =3D s.fn.call(scope, this.type, args, s.obj);=0A=
                    } catch(e) {=0A=
                        this.lastError =3D e;=0A=
                    }=0A=
                }=0A=
                if (false =3D=3D=3D ret) {=0A=
                    if (!this.silent) {=0A=
                    }=0A=
=0A=
                    //break;=0A=
                    return false;=0A=
                }=0A=
            }=0A=
        }=0A=
=0A=
        if (rebuild) {=0A=
            var newlist=3D[],subs=3Dthis.subscribers;=0A=
            for (i=3D0,len=3Dsubs.length; i<len; i=3Di+1) {=0A=
                newlist.push(subs[i]);=0A=
            }=0A=
=0A=
            this.subscribers=3Dnewlist;=0A=
        }=0A=
=0A=
        return true;=0A=
    },=0A=
=0A=
    /**=0A=
     * Removes all listeners=0A=
     * @method unsubscribeAll=0A=
     * @return {int} The number of listeners unsubscribed=0A=
     */=0A=
    unsubscribeAll: function() {=0A=
        for (var i=3D0, len=3Dthis.subscribers.length; i<len; ++i) {=0A=
            this._delete(len - 1 - i);=0A=
        }=0A=
=0A=
        this.subscribers=3D[];=0A=
=0A=
        return i;=0A=
    },=0A=
=0A=
    /**=0A=
     * @method _delete=0A=
     * @private=0A=
     */=0A=
    _delete: function(index) {=0A=
        var s =3D this.subscribers[index];=0A=
        if (s) {=0A=
            delete s.fn;=0A=
            delete s.obj;=0A=
        }=0A=
=0A=
        this.subscribers[index]=3Dnull;=0A=
    },=0A=
=0A=
    /**=0A=
     * @method toString=0A=
     */=0A=
    toString: function() {=0A=
         return "CustomEvent: " + "'" + this.type  + "', " + =0A=
             "scope: " + this.scope;=0A=
=0A=
    }=0A=
};=0A=
=0A=
/////////////////////////////////////////////////////////////////////=0A=
=0A=
/**=0A=
 * Stores the subscriber information to be used when the event fires.=0A=
 * @param {Function} fn       The function to execute=0A=
 * @param {Object}   obj      An object to be passed along when the =
event fires=0A=
 * @param {boolean}  override If true, the obj passed in becomes the =
execution=0A=
 *                            scope of the listener=0A=
 * @class Subscriber=0A=
 * @constructor=0A=
 */=0A=
YAHOO.util.Subscriber =3D function(fn, obj, override) {=0A=
=0A=
    /**=0A=
     * The callback that will be execute when the event fires=0A=
     * @property fn=0A=
     * @type function=0A=
     */=0A=
    this.fn =3D fn;=0A=
=0A=
    /**=0A=
     * An optional custom object that will passed to the callback when=0A=
     * the event fires=0A=
     * @property obj=0A=
     * @type object=0A=
     */=0A=
    this.obj =3D YAHOO.lang.isUndefined(obj) ? null : obj;=0A=
=0A=
    /**=0A=
     * The default execution scope for the event listener is defined =
when the=0A=
     * event is created (usually the object which contains the event).=0A=
     * By setting override to true, the execution scope becomes the =
custom=0A=
     * object passed in by the subscriber.  If override is an object, =
that =0A=
     * object becomes the scope.=0A=
     * @property override=0A=
     * @type boolean|object=0A=
     */=0A=
    this.override =3D override;=0A=
=0A=
};=0A=
=0A=
/**=0A=
 * Returns the execution scope for this listener.  If override was set =
to true=0A=
 * the custom obj will be the scope.  If override is an object, that is =
the=0A=
 * scope, otherwise the default scope will be used.=0A=
 * @method getScope=0A=
 * @param {Object} defaultScope the scope to use if this listener does =
not=0A=
 *                              override it.=0A=
 */=0A=
YAHOO.util.Subscriber.prototype.getScope =3D function(defaultScope) {=0A=
    if (this.override) {=0A=
        if (this.override =3D=3D=3D true) {=0A=
            return this.obj;=0A=
        } else {=0A=
            return this.override;=0A=
        }=0A=
    }=0A=
    return defaultScope;=0A=
};=0A=
=0A=
/**=0A=
 * Returns true if the fn and obj match this objects properties.=0A=
 * Used by the unsubscribe method to match the right subscriber.=0A=
 *=0A=
 * @method contains=0A=
 * @param {Function} fn the function to execute=0A=
 * @param {Object} obj an object to be passed along when the event fires=0A=
 * @return {boolean} true if the supplied arguments match this =0A=
 *                   subscriber's signature.=0A=
 */=0A=
YAHOO.util.Subscriber.prototype.contains =3D function(fn, obj) {=0A=
    if (obj) {=0A=
        return (this.fn =3D=3D fn && this.obj =3D=3D obj);=0A=
    } else {=0A=
        return (this.fn =3D=3D fn);=0A=
    }=0A=
};=0A=
=0A=
/**=0A=
 * @method toString=0A=
 */=0A=
YAHOO.util.Subscriber.prototype.toString =3D function() {=0A=
    return "Subscriber { obj: " + this.obj  + =0A=
           ", override: " +  (this.override || "no") + " }";=0A=
};=0A=
=0A=
/**=0A=
 * The Event Utility provides utilities for managing DOM Events and tools=0A=
 * for building event systems=0A=
 *=0A=
 * @module event=0A=
 * @title Event Utility=0A=
 * @namespace YAHOO.util=0A=
 * @requires yahoo=0A=
 */=0A=
=0A=
// The first instance of Event will win if it is loaded more than once.=0A=
// @TODO this needs to be changed so that only the state data that needs =
to=0A=
// be preserved is kept, while methods are overwritten/added as needed.=0A=
// This means that the module pattern can't be used.=0A=
if (!YAHOO.util.Event) {=0A=
=0A=
/**=0A=
 * The event utility provides functions to add and remove event =
listeners,=0A=
 * event cleansing.  It also tries to automatically remove listeners it=0A=
 * registers during the unload event.=0A=
 *=0A=
 * @class Event=0A=
 * @static=0A=
 */=0A=
    YAHOO.util.Event =3D function() {=0A=
=0A=
        /**=0A=
         * True after the onload event has fired=0A=
         * @property loadComplete=0A=
         * @type boolean=0A=
         * @static=0A=
         * @private=0A=
         */=0A=
        var loadComplete =3D  false;=0A=
=0A=
        /**=0A=
         * True when the document is initially usable=0A=
         * @property DOMReady=0A=
         * @type boolean=0A=
         * @static=0A=
         * @private=0A=
         */=0A=
        var DOMReady =3D false;=0A=
=0A=
        /**=0A=
         * Cache of wrapped listeners=0A=
         * @property listeners=0A=
         * @type array=0A=
         * @static=0A=
         * @private=0A=
         */=0A=
        var listeners =3D [];=0A=
=0A=
        /**=0A=
         * User-defined unload function that will be fired before all =
events=0A=
         * are detached=0A=
         * @property unloadListeners=0A=
         * @type array=0A=
         * @static=0A=
         * @private=0A=
         */=0A=
        var unloadListeners =3D [];=0A=
=0A=
        /**=0A=
         * Cache of DOM0 event handlers to work around issues with DOM2 =
events=0A=
         * in Safari=0A=
         * @property legacyEvents=0A=
         * @static=0A=
         * @private=0A=
         */=0A=
        var legacyEvents =3D [];=0A=
=0A=
        /**=0A=
         * Listener stack for DOM0 events=0A=
         * @property legacyHandlers=0A=
         * @static=0A=
         * @private=0A=
         */=0A=
        var legacyHandlers =3D [];=0A=
=0A=
        /**=0A=
         * The number of times to poll after window.onload.  This number =
is=0A=
         * increased if additional late-bound handlers are requested =
after=0A=
         * the page load.=0A=
         * @property retryCount=0A=
         * @static=0A=
         * @private=0A=
         */=0A=
        var retryCount =3D 0;=0A=
=0A=
        /**=0A=
         * onAvailable listeners=0A=
         * @property onAvailStack=0A=
         * @static=0A=
         * @private=0A=
         */=0A=
        var onAvailStack =3D [];=0A=
=0A=
        /**=0A=
         * Lookup table for legacy events=0A=
         * @property legacyMap=0A=
         * @static=0A=
         * @private=0A=
         */=0A=
        var legacyMap =3D [];=0A=
=0A=
        /**=0A=
         * Counter for auto id generation=0A=
         * @property counter=0A=
         * @static=0A=
         * @private=0A=
         */=0A=
        var counter =3D 0;=0A=
        =0A=
        /**=0A=
         * Normalized keycodes for webkit/safari=0A=
         * @property webkitKeymap=0A=
         * @type {int: int}=0A=
         * @private=0A=
         * @static=0A=
         * @final=0A=
         */=0A=
        var webkitKeymap =3D {=0A=
            63232: 38, // up=0A=
            63233: 40, // down=0A=
            63234: 37, // left=0A=
            63235: 39  // right=0A=
        };=0A=
=0A=
        return {=0A=
=0A=
            /**=0A=
             * The number of times we should look for elements that are =
not=0A=
             * in the DOM at the time the event is requested after the =
document=0A=
             * has been loaded.  The default is 4000@amp;10 ms, so it =
will poll=0A=
             * for 40 seconds or until all outstanding handlers are bound=0A=
             * (whichever comes first).=0A=
             * @property POLL_RETRYS=0A=
             * @type int=0A=
             * @static=0A=
             * @final=0A=
             */=0A=
            POLL_RETRYS: 4000,=0A=
=0A=
            /**=0A=
             * The poll interval in milliseconds=0A=
             * @property POLL_INTERVAL=0A=
             * @type int=0A=
             * @static=0A=
             * @final=0A=
             */=0A=
            POLL_INTERVAL: 10,=0A=
=0A=
            /**=0A=
             * Element to bind, int constant=0A=
             * @property EL=0A=
             * @type int=0A=
             * @static=0A=
             * @final=0A=
             */=0A=
            EL: 0,=0A=
=0A=
            /**=0A=
             * Type of event, int constant=0A=
             * @property TYPE=0A=
             * @type int=0A=
             * @static=0A=
             * @final=0A=
             */=0A=
            TYPE: 1,=0A=
=0A=
            /**=0A=
             * Function to execute, int constant=0A=
             * @property FN=0A=
             * @type int=0A=
             * @static=0A=
             * @final=0A=
             */=0A=
            FN: 2,=0A=
=0A=
            /**=0A=
             * Function wrapped for scope correction and cleanup, int =
constant=0A=
             * @property WFN=0A=
             * @type int=0A=
             * @static=0A=
             * @final=0A=
             */=0A=
            WFN: 3,=0A=
=0A=
            /**=0A=
             * Object passed in by the user that will be returned as a =0A=
             * parameter to the callback, int constant.  Specific to=0A=
             * unload listeners=0A=
             * @property OBJ=0A=
             * @type int=0A=
             * @static=0A=
             * @final=0A=
             */=0A=
            UNLOAD_OBJ: 3,=0A=
=0A=
            /**=0A=
             * Adjusted scope, either the element we are registering the =
event=0A=
             * on or the custom object passed in by the listener, int =
constant=0A=
             * @property ADJ_SCOPE=0A=
             * @type int=0A=
             * @static=0A=
             * @final=0A=
             */=0A=
            ADJ_SCOPE: 4,=0A=
=0A=
            /**=0A=
             * The original obj passed into addListener=0A=
             * @property OBJ=0A=
             * @type int=0A=
             * @static=0A=
             * @final=0A=
             */=0A=
            OBJ: 5,=0A=
=0A=
            /**=0A=
             * The original scope parameter passed into addListener=0A=
             * @property OVERRIDE=0A=
             * @type int=0A=
             * @static=0A=
             * @final=0A=
             */=0A=
            OVERRIDE: 6,=0A=
=0A=
            /**=0A=
             * addListener/removeListener can throw errors in unexpected =
scenarios.=0A=
             * These errors are suppressed, the method returns false, =
and this property=0A=
             * is set=0A=
             * @property lastError=0A=
             * @static=0A=
             * @type Error=0A=
             */=0A=
            lastError: null,=0A=
=0A=
            /**=0A=
             * Safari detection=0A=
             * @property isSafari=0A=
             * @private=0A=
             * @static=0A=
             * @deprecated use YAHOO.env.ua.webkit=0A=
             */=0A=
            isSafari: YAHOO.env.ua.webkit,=0A=
            =0A=
            /**=0A=
             * webkit version=0A=
             * @property webkit=0A=
             * @type string=0A=
             * @private=0A=
             * @static=0A=
             * @deprecated use YAHOO.env.ua.webkit=0A=
             */=0A=
            webkit: YAHOO.env.ua.webkit,=0A=
            =0A=
            /**=0A=
             * IE detection =0A=
             * @property isIE=0A=
             * @private=0A=
             * @static=0A=
             * @deprecated use YAHOO.env.ua.ie=0A=
             */=0A=
            isIE: YAHOO.env.ua.ie,=0A=
=0A=
            /**=0A=
             * poll handle=0A=
             * @property _interval=0A=
             * @static=0A=
             * @private=0A=
             */=0A=
            _interval: null,=0A=
=0A=
            /**=0A=
             * @method startInterval=0A=
             * @static=0A=
             * @private=0A=
             */=0A=
            startInterval: function() {=0A=
                if (!this._interval) {=0A=
                    var self =3D this;=0A=
                    var callback =3D function() { =
self._tryPreloadAttach(); };=0A=
                    this._interval =3D setInterval(callback, =
this.POLL_INTERVAL);=0A=
                }=0A=
            },=0A=
=0A=
            /**=0A=
             * Executes the supplied callback when the item with the =
supplied=0A=
             * id is found.  This is meant to be used to execute =
behavior as=0A=
             * soon as possible as the page loads.  If you use this =
after the=0A=
             * initial page load it will poll for a fixed time for the =
element.=0A=
             * The number of times it will poll and the frequency are=0A=
             * configurable.  By default it will poll for 10 seconds.=0A=
             *=0A=
             * <p>The callback is executed with a single parameter:=0A=
             * the custom object parameter, if provided.</p>=0A=
             *=0A=
             * @method onAvailable=0A=
             *=0A=
             * @param {string}   p_id the id of the element to look for.=0A=
             * @param {function} p_fn what to execute when the element =
is found.=0A=
             * @param {object}   p_obj an optional object to be passed =
back as=0A=
             *                   a parameter to p_fn.=0A=
             * @param {boolean|object}  p_override If set to true, p_fn =
will execute=0A=
             *                   in the scope of p_obj, if set to an =
object it=0A=
             *                   will execute in the scope of that object=0A=
             *=0A=
             * @static=0A=
             */=0A=
            onAvailable: function(p_id, p_fn, p_obj, p_override) {=0A=
                onAvailStack.push( { id:         p_id, =0A=
                                     fn:         p_fn, =0A=
                                     obj:        p_obj, =0A=
                                     override:   p_override, =0A=
                                     checkReady: false    } );=0A=
                retryCount =3D this.POLL_RETRYS;=0A=
                this.startInterval();=0A=
            },=0A=
=0A=
            /**=0A=
             * Executes the supplied callback when the DOM is first =
usable.  This=0A=
             * will execute immediately if called after the DOMReady =
event has=0A=
             * fired.   @todo the DOMContentReady event does not fire =
when the=0A=
             * script is dynamically injected into the page.  This means =
the=0A=
             * DOMReady custom event will never fire in FireFox or Opera =
when the=0A=
             * library is injected.  It _will_ fire in Safari, and the =
IE =0A=
             * implementation would allow for us to fire it if the =
defered script=0A=
             * is not available.  We want this to behave the same in all =
browsers.=0A=
             * Is there a way to identify when the script has been =
injected =0A=
             * instead of included inline?  Is there a way to know =
whether the =0A=
             * window onload event has fired without having had a =
listener attached =0A=
             * to it when it did so?=0A=
             *=0A=
             * <p>The callback is a CustomEvent, so the signature is:</p>=0A=
             * <p>type <string>, args <array>, customobject <object></p>=0A=
             * <p>For DOMReady events, there are no fire argments, so the=0A=
             * signature is:</p>=0A=
             * <p>"DOMReady", [], obj</p>=0A=
             *=0A=
             *=0A=
             * @method onDOMReady=0A=
             *=0A=
             * @param {function} p_fn what to execute when the element =
is found.=0A=
             * @param {object}   p_obj an optional object to be passed =
back as=0A=
             *                   a parameter to p_fn.=0A=
             * @param {boolean|object}  p_scope If set to true, p_fn =
will execute=0A=
             *                   in the scope of p_obj, if set to an =
object it=0A=
             *                   will execute in the scope of that object=0A=
             *=0A=
             * @static=0A=
             */=0A=
            onDOMReady: function(p_fn, p_obj, p_override) {=0A=
                if (DOMReady) {=0A=
                    setTimeout(function() {=0A=
                        var s =3D window;=0A=
                        if (p_override) {=0A=
                            if (p_override =3D=3D=3D true) {=0A=
                                s =3D p_obj;=0A=
                            } else {=0A=
                                s =3D p_override;=0A=
                            }=0A=
                        }=0A=
                        p_fn.call(s, "DOMReady", [], p_obj);=0A=
                    }, 0);=0A=
                } else {=0A=
                    this.DOMReadyEvent.subscribe(p_fn, p_obj, =
p_override);=0A=
                }=0A=
            },=0A=
=0A=
            /**=0A=
             * Works the same way as onAvailable, but additionally =
checks the=0A=
             * state of sibling elements to determine if the content of =
the=0A=
             * available element is safe to modify.=0A=
             *=0A=
             * <p>The callback is executed with a single parameter:=0A=
             * the custom object parameter, if provided.</p>=0A=
             *=0A=
             * @method onContentReady=0A=
             *=0A=
             * @param {string}   p_id the id of the element to look for.=0A=
             * @param {function} p_fn what to execute when the element =
is ready.=0A=
             * @param {object}   p_obj an optional object to be passed =
back as=0A=
             *                   a parameter to p_fn.=0A=
             * @param {boolean|object}  p_override If set to true, p_fn =
will execute=0A=
             *                   in the scope of p_obj.  If an object, =
p_fn will=0A=
             *                   exectute in the scope of that object=0A=
             *=0A=
             * @static=0A=
             */=0A=
            onContentReady: function(p_id, p_fn, p_obj, p_override) {=0A=
                onAvailStack.push( { id:         p_id, =0A=
                                     fn:         p_fn, =0A=
                                     obj:        p_obj, =0A=
                                     override:   p_override,=0A=
                                     checkReady: true      } );=0A=
=0A=
                retryCount =3D this.POLL_RETRYS;=0A=
                this.startInterval();=0A=
            },=0A=
=0A=
            /**=0A=
             * Appends an event handler=0A=
             *=0A=
             * @method addListener=0A=
             *=0A=
             * @param {String|HTMLElement|Array|NodeList} el An id, an =
element =0A=
             *  reference, or a collection of ids and/or elements to =
assign the =0A=
             *  listener to.=0A=
             * @param {String}   sType     The type of event to append=0A=
             * @param {Function} fn        The method the event invokes=0A=
             * @param {Object}   obj    An arbitrary object that will be =0A=
             *                             passed as a parameter to the =
handler=0A=
             * @param {Boolean|object}  override  If true, the obj =
passed in becomes=0A=
             *                             the execution scope of the =
listener. If an=0A=
             *                             object, this object becomes =
the execution=0A=
             *                             scope.=0A=
             * @return {Boolean} True if the action was successful or =
defered,=0A=
             *                        false if one or more of the =
elements =0A=
             *                        could not have the listener =
attached,=0A=
             *                        or if the operation throws an =
exception.=0A=
             * @static=0A=
             */=0A=
            addListener: function(el, sType, fn, obj, override) {=0A=
=0A=
                if (!fn || !fn.call) {=0A=
// throw new TypeError(sType + " addListener call failed, callback =
undefined");=0A=
                    return false;=0A=
                }=0A=
=0A=
                // The el argument can be an array of elements or =
element ids.=0A=
                if ( this._isValidCollection(el)) {=0A=
                    var ok =3D true;=0A=
                    for (var i=3D0,len=3Del.length; i<len; ++i) {=0A=
                        ok =3D this.on(el[i], =0A=
                                       sType, =0A=
                                       fn, =0A=
                                       obj, =0A=
                                       override) && ok;=0A=
                    }=0A=
                    return ok;=0A=
=0A=
                } else if (YAHOO.lang.isString(el)) {=0A=
                    var oEl =3D this.getEl(el);=0A=
                    // If the el argument is a string, we assume it is =0A=
                    // actually the id of the element.  If the page is =
loaded=0A=
                    // we convert el to the actual element, otherwise we =0A=
                    // defer attaching the event until onload event fires=0A=
=0A=
                    // check to see if we need to delay hooking up the =
event =0A=
                    // until after the page loads.=0A=
                    if (oEl) {=0A=
                        el =3D oEl;=0A=
                    } else {=0A=
                        // defer adding the event until the element is =
available=0A=
                        this.onAvailable(el, function() {=0A=
                           YAHOO.util.Event.on(el, sType, fn, obj, =
override);=0A=
                        });=0A=
=0A=
                        return true;=0A=
                    }=0A=
                }=0A=
=0A=
                // Element should be an html element or an array if we =
get =0A=
                // here.=0A=
                if (!el) {=0A=
                    return false;=0A=
                }=0A=
=0A=
                // we need to make sure we fire registered unload events =0A=
                // prior to automatically unhooking them.  So we hang on =
to =0A=
                // these instead of attaching them to the window and =
fire the=0A=
                // handles explicitly during our one unload event.=0A=
                if ("unload" =3D=3D sType && obj !=3D=3D this) {=0A=
                    unloadListeners[unloadListeners.length] =3D=0A=
                            [el, sType, fn, obj, override];=0A=
                    return true;=0A=
                }=0A=
=0A=
=0A=
                // if the user chooses to override the scope, we use the =
custom=0A=
                // object passed in, otherwise the executing scope will =
be the=0A=
                // HTML element that the event is registered on=0A=
                var scope =3D el;=0A=
                if (override) {=0A=
                    if (override =3D=3D=3D true) {=0A=
                        scope =3D obj;=0A=
                    } else {=0A=
                        scope =3D override;=0A=
                    }=0A=
                }=0A=
=0A=
                // wrap the function so we can return the obj object when=0A=
                // the event fires;=0A=
                var wrappedFn =3D function(e) {=0A=
                        return fn.call(scope, =
YAHOO.util.Event.getEvent(e, el), =0A=
                                obj);=0A=
                    };=0A=
=0A=
                var li =3D [el, sType, fn, wrappedFn, scope, obj, =
override];=0A=
                var index =3D listeners.length;=0A=
                // cache the listener so we can try to automatically =
unload=0A=
                listeners[index] =3D li;=0A=
=0A=
                if (this.useLegacyEvent(el, sType)) {=0A=
                    var legacyIndex =3D this.getLegacyIndex(el, sType);=0A=
=0A=
                    // Add a new dom0 wrapper if one is not detected for =
this=0A=
                    // element=0A=
                    if ( legacyIndex =3D=3D -1 || =0A=
                                el !=3D legacyEvents[legacyIndex][0] ) {=0A=
=0A=
                        legacyIndex =3D legacyEvents.length;=0A=
                        legacyMap[el.id + sType] =3D legacyIndex;=0A=
=0A=
                        // cache the signature for the DOM0 event, and =0A=
                        // include the existing handler for the event, =
if any=0A=
                        legacyEvents[legacyIndex] =3D =0A=
                            [el, sType, el["on" + sType]];=0A=
                        legacyHandlers[legacyIndex] =3D [];=0A=
=0A=
                        el["on" + sType] =3D =0A=
                            function(e) {=0A=
                                YAHOO.util.Event.fireLegacyEvent(=0A=
                                    YAHOO.util.Event.getEvent(e), =
legacyIndex);=0A=
                            };=0A=
                    }=0A=
=0A=
                    // add a reference to the wrapped listener to our =
custom=0A=
                    // stack of events=0A=
                    //legacyHandlers[legacyIndex].push(index);=0A=
                    legacyHandlers[legacyIndex].push(li);=0A=
=0A=
                } else {=0A=
                    try {=0A=
                        this._simpleAdd(el, sType, wrappedFn, false);=0A=
                    } catch(ex) {=0A=
                        // handle an error trying to attach an event.  =
If it fails=0A=
                        // we need to clean up the cache=0A=
                        this.lastError =3D ex;=0A=
                        this.removeListener(el, sType, fn);=0A=
                        return false;=0A=
                    }=0A=
                }=0A=
=0A=
                return true;=0A=
                =0A=
            },=0A=
=0A=
            /**=0A=
             * When using legacy events, the handler is routed to this =
object=0A=
             * so we can fire our custom listener stack.=0A=
             * @method fireLegacyEvent=0A=
             * @static=0A=
             * @private=0A=
             */=0A=
            fireLegacyEvent: function(e, legacyIndex) {=0A=
                var ok=3Dtrue,le,lh,li,scope,ret;=0A=
                =0A=
                lh =3D legacyHandlers[legacyIndex];=0A=
                for (var i=3D0,len=3Dlh.length; i<len; ++i) {=0A=
                    li =3D lh[i];=0A=
                    if ( li && li[this.WFN] ) {=0A=
                        scope =3D li[this.ADJ_SCOPE];=0A=
                        ret =3D li[this.WFN].call(scope, e);=0A=
                        ok =3D (ok && ret);=0A=
                    }=0A=
                }=0A=
=0A=
                // Fire the original handler if we replaced one.  We =
fire this=0A=
                // after the other events to keep =
stopPropagation/preventDefault=0A=
                // that happened in the DOM0 handler from touching our =
DOM2=0A=
                // substitute=0A=
                le =3D legacyEvents[legacyIndex];=0A=
                if (le && le[2]) {=0A=
                    le[2](e);=0A=
                }=0A=
                =0A=
                return ok;=0A=
            },=0A=
=0A=
            /**=0A=
             * Returns the legacy event index that matches the supplied =0A=
             * signature=0A=
             * @method getLegacyIndex=0A=
             * @static=0A=
             * @private=0A=
             */=0A=
            getLegacyIndex: function(el, sType) {=0A=
                var key =3D this.generateId(el) + sType;=0A=
                if (typeof legacyMap[key] =3D=3D "undefined") { =0A=
                    return -1;=0A=
                } else {=0A=
                    return legacyMap[key];=0A=
                }=0A=
            },=0A=
=0A=
            /**=0A=
             * Logic that determines when we should automatically use =
legacy=0A=
             * events instead of DOM2 events.  Currently this is limited =
to old=0A=
             * Safari browsers with a broken preventDefault=0A=
             * @method useLegacyEvent=0A=
             * @static=0A=
             * @private=0A=
             */=0A=
            useLegacyEvent: function(el, sType) {=0A=
                if (this.webkit && ("click"=3D=3DsType || =
"dblclick"=3D=3DsType)) {=0A=
                    var v =3D parseInt(this.webkit, 10);=0A=
                    if (!isNaN(v) && v<418) {=0A=
                        return true;=0A=
                    }=0A=
                }=0A=
                return false;=0A=
            },=0A=
                    =0A=
            /**=0A=
             * Removes an event listener=0A=
             *=0A=
             * @method removeListener=0A=
             *=0A=
             * @param {String|HTMLElement|Array|NodeList} el An id, an =
element =0A=
             *  reference, or a collection of ids and/or elements to =
remove=0A=
             *  the listener from.=0A=
             * @param {String} sType the type of event to remove.=0A=
             * @param {Function} fn the method the event invokes.  If fn =
is=0A=
             *  undefined, then all event handlers for the type of event =
are =0A=
             *  removed.=0A=
             * @return {boolean} true if the unbind was successful, =
false =0A=
             *  otherwise.=0A=
             * @static=0A=
             */=0A=
            removeListener: function(el, sType, fn) {=0A=
                var i, len, li;=0A=
=0A=
                // The el argument can be a string=0A=
                if (typeof el =3D=3D "string") {=0A=
                    el =3D this.getEl(el);=0A=
                // The el argument can be an array of elements or =
element ids.=0A=
                } else if ( this._isValidCollection(el)) {=0A=
                    var ok =3D true;=0A=
                    for (i=3D0,len=3Del.length; i<len; ++i) {=0A=
                        ok =3D ( this.removeListener(el[i], sType, fn) =
&& ok );=0A=
                    }=0A=
                    return ok;=0A=
                }=0A=
=0A=
                if (!fn || !fn.call) {=0A=
                    //return false;=0A=
                    return this.purgeElement(el, false, sType);=0A=
                }=0A=
=0A=
                if ("unload" =3D=3D sType) {=0A=
=0A=
                    for (i=3D0, len=3DunloadListeners.length; i<len; =
i++) {=0A=
                        li =3D unloadListeners[i];=0A=
                        if (li && =0A=
                            li[0] =3D=3D el && =0A=
                            li[1] =3D=3D sType && =0A=
                            li[2] =3D=3D fn) {=0A=
                                //unloadListeners.splice(i, 1);=0A=
                                unloadListeners[i]=3Dnull;=0A=
                                return true;=0A=
                        }=0A=
                    }=0A=
=0A=
                    return false;=0A=
                }=0A=
=0A=
                var cacheItem =3D null;=0A=
=0A=
                // The index is a hidden parameter; needed to remove it =
from=0A=
                // the method signature because it was tempting users to=0A=
                // try and take advantage of it, which is not possible.=0A=
                var index =3D arguments[3];=0A=
  =0A=
                if ("undefined" =3D=3D=3D typeof index) {=0A=
                    index =3D this._getCacheIndex(el, sType, fn);=0A=
                }=0A=
=0A=
                if (index >=3D 0) {=0A=
                    cacheItem =3D listeners[index];=0A=
                }=0A=
=0A=
                if (!el || !cacheItem) {=0A=
                    return false;=0A=
                }=0A=
=0A=
=0A=
                if (this.useLegacyEvent(el, sType)) {=0A=
                    var legacyIndex =3D this.getLegacyIndex(el, sType);=0A=
                    var llist =3D legacyHandlers[legacyIndex];=0A=
                    if (llist) {=0A=
                        for (i=3D0, len=3Dllist.length; i<len; ++i) {=0A=
                            li =3D llist[i];=0A=
                            if (li && =0A=
                                li[this.EL] =3D=3D el && =0A=
                                li[this.TYPE] =3D=3D sType && =0A=
                                li[this.FN] =3D=3D fn) {=0A=
                                    //llist.splice(i, 1);=0A=
                                    llist[i]=3Dnull;=0A=
                                    break;=0A=
                            }=0A=
                        }=0A=
                    }=0A=
=0A=
                } else {=0A=
                    try {=0A=
                        this._simpleRemove(el, sType, =
cacheItem[this.WFN], false);=0A=
                    } catch(ex) {=0A=
                        this.lastError =3D ex;=0A=
                        return false;=0A=
                    }=0A=
                }=0A=
=0A=
                // removed the wrapped handler=0A=
                delete listeners[index][this.WFN];=0A=
                delete listeners[index][this.FN];=0A=
                //listeners.splice(index, 1);=0A=
                listeners[index]=3Dnull;=0A=
=0A=
                return true;=0A=
=0A=
            },=0A=
=0A=
            /**=0A=
             * Returns the event's target element.  Safari sometimes =
provides=0A=
             * a text node, and this is automatically resolved to the =
text=0A=
             * node's parent so that it behaves like other browsers.=0A=
             * @method getTarget=0A=
             * @param {Event} ev the event=0A=
             * @param {boolean} resolveTextNode when set to true the =
target's=0A=
             *                  parent will be returned if the target is =
a =0A=
             *                  text node.  @deprecated, the text node is=0A=
             *                  now resolved automatically=0A=
             * @return {HTMLElement} the event's target=0A=
             * @static=0A=
             */=0A=
            getTarget: function(ev, resolveTextNode) {=0A=
                var t =3D ev.target || ev.srcElement;=0A=
                return this.resolveTextNode(t);=0A=
            },=0A=
=0A=
            /**=0A=
             * In some cases, some browsers will return a text node =
inside=0A=
             * the actual element that was targeted.  This normalizes the=0A=
             * return value for getTarget and getRelatedTarget.=0A=
             * @method resolveTextNode=0A=
             * @param {HTMLElement} node node to resolve=0A=
             * @return {HTMLElement} the normized node=0A=
             * @static=0A=
             */=0A=
            resolveTextNode: function(node) {=0A=
                if (node && 3 =3D=3D node.nodeType) {=0A=
                    return node.parentNode;=0A=
                } else {=0A=
                    return node;=0A=
                }=0A=
            },=0A=
=0A=
            /**=0A=
             * Returns the event's pageX=0A=
             * @method getPageX=0A=
             * @param {Event} ev the event=0A=
             * @return {int} the event's pageX=0A=
             * @static=0A=
             */=0A=
            getPageX: function(ev) {=0A=
                var x =3D ev.pageX;=0A=
                if (!x && 0 !=3D=3D x) {=0A=
                    x =3D ev.clientX || 0;=0A=
=0A=
                    if ( this.isIE ) {=0A=
                        x +=3D this._getScrollLeft();=0A=
                    }=0A=
                }=0A=
=0A=
                return x;=0A=
            },=0A=
=0A=
            /**=0A=
             * Returns the event's pageY=0A=
             * @method getPageY=0A=
             * @param {Event} ev the event=0A=
             * @return {int} the event's pageY=0A=
             * @static=0A=
             */=0A=
            getPageY: function(ev) {=0A=
                var y =3D ev.pageY;=0A=
                if (!y && 0 !=3D=3D y) {=0A=
                    y =3D ev.clientY || 0;=0A=
=0A=
                    if ( this.isIE ) {=0A=
                        y +=3D this._getScrollTop();=0A=
                    }=0A=
                }=0A=
=0A=
=0A=
                return y;=0A=
            },=0A=
=0A=
            /**=0A=
             * Returns the pageX and pageY properties as an indexed =
array.=0A=
             * @method getXY=0A=
             * @param {Event} ev the event=0A=
             * @return {[x, y]} the pageX and pageY properties of the =
event=0A=
             * @static=0A=
             */=0A=
            getXY: function(ev) {=0A=
                return [this.getPageX(ev), this.getPageY(ev)];=0A=
            },=0A=
=0A=
            /**=0A=
             * Returns the event's related target =0A=
             * @method getRelatedTarget=0A=
             * @param {Event} ev the event=0A=
             * @return {HTMLElement} the event's relatedTarget=0A=
             * @static=0A=
             */=0A=
            getRelatedTarget: function(ev) {=0A=
                var t =3D ev.relatedTarget;=0A=
                if (!t) {=0A=
                    if (ev.type =3D=3D "mouseout") {=0A=
                        t =3D ev.toElement;=0A=
                    } else if (ev.type =3D=3D "mouseover") {=0A=
                        t =3D ev.fromElement;=0A=
                    }=0A=
                }=0A=
=0A=
                return this.resolveTextNode(t);=0A=
            },=0A=
=0A=
            /**=0A=
             * Returns the time of the event.  If the time is not =
included, the=0A=
             * event is modified using the current time.=0A=
             * @method getTime=0A=
             * @param {Event} ev the event=0A=
             * @return {Date} the time of the event=0A=
             * @static=0A=
             */=0A=
            getTime: function(ev) {=0A=
                if (!ev.time) {=0A=
                    var t =3D new Date().getTime();=0A=
                    try {=0A=
                        ev.time =3D t;=0A=
                    } catch(ex) { =0A=
                        this.lastError =3D ex;=0A=
                        return t;=0A=
                    }=0A=
                }=0A=
=0A=
                return ev.time;=0A=
            },=0A=
=0A=
            /**=0A=
             * Convenience method for stopPropagation + preventDefault=0A=
             * @method stopEvent=0A=
             * @param {Event} ev the event=0A=
             * @static=0A=
             */=0A=
            stopEvent: function(ev) {=0A=
                this.stopPropagation(ev);=0A=
                this.preventDefault(ev);=0A=
            },=0A=
=0A=
            /**=0A=
             * Stops event propagation=0A=
             * @method stopPropagation=0A=
             * @param {Event} ev the event=0A=
             * @static=0A=
             */=0A=
            stopPropagation: function(ev) {=0A=
                if (ev.stopPropagation) {=0A=
                    ev.stopPropagation();=0A=
                } else {=0A=
                    ev.cancelBubble =3D true;=0A=
                }=0A=
            },=0A=
=0A=
            /**=0A=
             * Prevents the default behavior of the event=0A=
             * @method preventDefault=0A=
             * @param {Event} ev the event=0A=
             * @static=0A=
             */=0A=
            preventDefault: function(ev) {=0A=
                if (ev.preventDefault) {=0A=
                    ev.preventDefault();=0A=
                } else {=0A=
                    ev.returnValue =3D false;=0A=
                }=0A=
            },=0A=
             =0A=
            /**=0A=
             * Finds the event in the window object, the caller's =
arguments, or=0A=
             * in the arguments of another method in the callstack.  =
This is=0A=
             * executed automatically for events registered through the =
event=0A=
             * manager, so the implementer should not normally need to =
execute=0A=
             * this function at all.=0A=
             * @method getEvent=0A=
             * @param {Event} e the event parameter from the handler=0A=
             * @param {HTMLElement} boundEl the element the listener is =
attached to=0A=
             * @return {Event} the event =0A=
             * @static=0A=
             */=0A=
            getEvent: function(e, boundEl) {=0A=
                var ev =3D e || window.event;=0A=
=0A=
                if (!ev) {=0A=
                    var c =3D this.getEvent.caller;=0A=
                    while (c) {=0A=
                        ev =3D c.arguments[0];=0A=
                        if (ev && Event =3D=3D ev.constructor) {=0A=
                            break;=0A=
                        }=0A=
                        c =3D c.caller;=0A=
                    }=0A=
                }=0A=
=0A=
                // IE events that target non-browser objects (e.g., VML=0A=
                // canvas) will sometimes throw errors when you try to=0A=
                // inspect the properties of the event target.  We try to=0A=
                // detect this condition, and provide a dummy target =
(the bound=0A=
                // element) to eliminate spurious errors.  =0A=
                if (ev && this.isIE) {=0A=
=0A=
                    try {=0A=
=0A=
                        var el =3D ev.srcElement;=0A=
                        if (el) {=0A=
                            var type =3D el.type;=0A=
                        }=0A=
=0A=
                    } catch(ex) {=0A=
=0A=
                         =0A=
                        ev.target =3D boundEl;=0A=
                    }=0A=
=0A=
                }=0A=
=0A=
                return ev;=0A=
            },=0A=
=0A=
            /**=0A=
             * Returns the charcode for an event=0A=
             * @method getCharCode=0A=
             * @param {Event} ev the event=0A=
             * @return {int} the event's charCode=0A=
             * @static=0A=
             */=0A=
            getCharCode: function(ev) {=0A=
                var code =3D ev.keyCode || ev.charCode || 0;=0A=
=0A=
                // webkit normalization=0A=
                if (YAHOO.env.ua.webkit && (code in webkitKeymap)) {=0A=
                    code =3D webkitKeymap[code];=0A=
                }=0A=
                return code;=0A=
            },=0A=
=0A=
            /**=0A=
             * Locating the saved event handler data by function ref=0A=
             *=0A=
             * @method _getCacheIndex=0A=
             * @static=0A=
             * @private=0A=
             */=0A=
            _getCacheIndex: function(el, sType, fn) {=0A=
                for (var i=3D0,len=3Dlisteners.length; i<len; ++i) {=0A=
                    var li =3D listeners[i];=0A=
                    if ( li                 && =0A=
                         li[this.FN] =3D=3D fn  && =0A=
                         li[this.EL] =3D=3D el  && =0A=
                         li[this.TYPE] =3D=3D sType ) {=0A=
                        return i;=0A=
                    }=0A=
                }=0A=
=0A=
                return -1;=0A=
            },=0A=
=0A=
            /**=0A=
             * Generates an unique ID for the element if it does not =
already =0A=
             * have one.=0A=
             * @method generateId=0A=
             * @param el the element to create the id for=0A=
             * @return {string} the resulting id of the element=0A=
             * @static=0A=
             */=0A=
            generateId: function(el) {=0A=
                var id =3D el.id;=0A=
=0A=
                if (!id) {=0A=
                    id =3D "yuievtautoid-" + counter;=0A=
                    ++counter;=0A=
                    el.id =3D id;=0A=
                }=0A=
=0A=
                return id;=0A=
            },=0A=
=0A=
=0A=
            /**=0A=
             * We want to be able to use getElementsByTagName as a =
collection=0A=
             * to attach a group of events to.  Unfortunately, different =0A=
             * browsers return different types of collections.  This =
function=0A=
             * tests to determine if the object is array-like.  It will =
also =0A=
             * fail if the object is an array, but is empty.=0A=
             * @method _isValidCollection=0A=
             * @param o the object to test=0A=
             * @return {boolean} true if the object is array-like and =
populated=0A=
             * @static=0A=
             * @private=0A=
             */=0A=
            _isValidCollection: function(o) {=0A=
                try {=0A=
                    return ( typeof o !=3D=3D "string" && // o is not a =
string=0A=
                             o.length              && // o is indexed=0A=
                             !o.tagName            && // o is not an =
HTML element=0A=
                             !o.alert              && // o is not a =
window=0A=
                             typeof o[0] !=3D=3D "undefined" );=0A=
                } catch(e) {=0A=
                    return false;=0A=
                }=0A=
=0A=
            },=0A=
=0A=
            /**=0A=
             * @private=0A=
             * @property elCache=0A=
             * DOM element cache=0A=
             * @static=0A=
             * @deprecated Elements are not cached due to issues that =
arise when=0A=
             * elements are removed and re-added=0A=
             */=0A=
            elCache: {},=0A=
=0A=
            /**=0A=
             * We cache elements bound by id because when the unload =
event =0A=
             * fires, we can no longer use document.getElementById=0A=
             * @method getEl=0A=
             * @static=0A=
             * @private=0A=
             * @deprecated Elements are not cached any longer=0A=
             */=0A=
            getEl: function(id) {=0A=
                return (typeof id =3D=3D=3D "string") ? =
document.getElementById(id) : id;=0A=
            },=0A=
=0A=
            /**=0A=
             * Clears the element cache=0A=
             * @deprecated Elements are not cached any longer=0A=
             * @method clearCache=0A=
             * @static=0A=
             * @private=0A=
             */=0A=
            clearCache: function() { },=0A=
=0A=
            /**=0A=
             * Custom event the fires when the dom is initially usable=0A=
             * @event DOMReadyEvent=0A=
             */=0A=
            DOMReadyEvent: new YAHOO.util.CustomEvent("DOMReady", this),=0A=
=0A=
            /**=0A=
             * hook up any deferred listeners=0A=
             * @method _load=0A=
             * @static=0A=
             * @private=0A=
             */=0A=
            _load: function(e) {=0A=
=0A=
                if (!loadComplete) {=0A=
                    loadComplete =3D true;=0A=
                    var EU =3D YAHOO.util.Event;=0A=
=0A=
                    // Just in case DOMReady did not go off for some =
reason=0A=
                    EU._ready();=0A=
=0A=
                    // Available elements may not have been detected =
before the=0A=
                    // window load event fires. Try to find them now so =
that the=0A=
                    // the user is more likely to get the onAvailable =
notifications=0A=
                    // before the window load notification=0A=
                    EU._tryPreloadAttach();=0A=
=0A=
                    // Remove the listener to assist with the IE memory =
issue, but not=0A=
                    // for other browsers because FF 1.0x does not like =
it.=0A=
                    //if (this.isIE) {=0A=
                        //EU._simpleRemove(window, "load", EU._load);=0A=
                    //}=0A=
                }=0A=
            },=0A=
=0A=
            /**=0A=
             * Fires the DOMReady event listeners the first time the =
document is=0A=
             * usable.=0A=
             * @method _ready=0A=
             * @static=0A=
             * @private=0A=
             */=0A=
            _ready: function(e) {=0A=
                if (!DOMReady) {=0A=
                    DOMReady=3Dtrue;=0A=
                    var EU =3D YAHOO.util.Event;=0A=
=0A=
                    // Fire the content ready custom event=0A=
                    EU.DOMReadyEvent.fire();=0A=
=0A=
                    // Remove the DOMContentLoaded (FF/Opera)=0A=
                    EU._simpleRemove(document, "DOMContentLoaded", =
EU._ready);=0A=
                }=0A=
            },=0A=
=0A=
            /**=0A=
             * Polling function that runs before the onload event fires, =0A=
             * attempting to attach to DOM Nodes as soon as they are =0A=
             * available=0A=
             * @method _tryPreloadAttach=0A=
             * @static=0A=
             * @private=0A=
             */=0A=
            _tryPreloadAttach: function() {=0A=
=0A=
                if (this.locked) {=0A=
                    return false;=0A=
                }=0A=
=0A=
                if (this.isIE) {=0A=
                    // Hold off if DOMReady has not fired and check =
current=0A=
                    // readyState to protect against the IE operation =
aborted=0A=
                    // issue.=0A=
                    //if (!DOMReady || "complete" !=3D=3D =
document.readyState) {=0A=
                    if (!DOMReady) {=0A=
                        this.startInterval();=0A=
                        return false;=0A=
                    }=0A=
                }=0A=
=0A=
                this.locked =3D true;=0A=
=0A=
=0A=
                // keep trying until after the page is loaded.  We need =
to =0A=
                // check the page load state prior to trying to bind the =0A=
                // elements so that we can be certain all elements have =
been =0A=
                // tested appropriately=0A=
                var tryAgain =3D !loadComplete;=0A=
                if (!tryAgain) {=0A=
                    tryAgain =3D (retryCount > 0);=0A=
                }=0A=
=0A=
                // onAvailable=0A=
                var notAvail =3D [];=0A=
=0A=
                var executeItem =3D function (el, item) {=0A=
                    var scope =3D el;=0A=
                    if (item.override) {=0A=
                        if (item.override =3D=3D=3D true) {=0A=
                            scope =3D item.obj;=0A=
                        } else {=0A=
                            scope =3D item.override;=0A=
                        }=0A=
                    }=0A=
                    item.fn.call(scope, item.obj);=0A=
                };=0A=
=0A=
                var i,len,item,el;=0A=
=0A=
                // onAvailable=0A=
                for (i=3D0,len=3DonAvailStack.length; i<len; ++i) {=0A=
                    item =3D onAvailStack[i];=0A=
                    if (item && !item.checkReady) {=0A=
                        el =3D this.getEl(item.id);=0A=
                        if (el) {=0A=
                            executeItem(el, item);=0A=
                            onAvailStack[i] =3D null;=0A=
                        } else {=0A=
                            notAvail.push(item);=0A=
                        }=0A=
                    }=0A=
                }=0A=
=0A=
                // onContentReady=0A=
                for (i=3D0,len=3DonAvailStack.length; i<len; ++i) {=0A=
                    item =3D onAvailStack[i];=0A=
                    if (item && item.checkReady) {=0A=
                        el =3D this.getEl(item.id);=0A=
=0A=
                        if (el) {=0A=
                            // The element is available, but not =
necessarily ready=0A=
                            // @todo should we test =
parentNode.nextSibling?=0A=
                            if (loadComplete || el.nextSibling) {=0A=
                                executeItem(el, item);=0A=
                                onAvailStack[i] =3D null;=0A=
                            }=0A=
                        } else {=0A=
                            notAvail.push(item);=0A=
                        }=0A=
                    }=0A=
                }=0A=
=0A=
                retryCount =3D (notAvail.length =3D=3D=3D 0) ? 0 : =
retryCount - 1;=0A=
=0A=
                if (tryAgain) {=0A=
                    // we may need to strip the nulled out items here=0A=
                    this.startInterval();=0A=
                } else {=0A=
                    clearInterval(this._interval);=0A=
                    this._interval =3D null;=0A=
                }=0A=
=0A=
                this.locked =3D false;=0A=
=0A=
                return true;=0A=
=0A=
            },=0A=
=0A=
            /**=0A=
             * Removes all listeners attached to the given element via =
addListener.=0A=
             * Optionally, the node's children can also be purged.=0A=
             * Optionally, you can specify a specific type of event to =
remove.=0A=
             * @method purgeElement=0A=
             * @param {HTMLElement} el the element to purge=0A=
             * @param {boolean} recurse recursively purge this element's =
children=0A=
             * as well.  Use with caution.=0A=
             * @param {string} sType optional type of listener to purge. =
If=0A=
             * left out, all listeners will be removed=0A=
             * @static=0A=
             */=0A=
            purgeElement: function(el, recurse, sType) {=0A=
                var elListeners =3D this.getListeners(el, sType), i, len;=0A=
                if (elListeners) {=0A=
                    for (i=3D0,len=3DelListeners.length; i<len ; ++i) {=0A=
                        var l =3D elListeners[i];=0A=
                        // can't use the index on the changing collection=0A=
                        this.removeListener(el, l.type, l.fn, l.index);=0A=
                        //this.removeListener(el, l.type, l.fn);=0A=
                    }=0A=
                }=0A=
=0A=
                if (recurse && el && el.childNodes) {=0A=
                    for (i=3D0,len=3Del.childNodes.length; i<len ; ++i) {=0A=
                        this.purgeElement(el.childNodes[i], recurse, =
sType);=0A=
                    }=0A=
                }=0A=
            },=0A=
=0A=
            /**=0A=
             * Returns all listeners attached to the given element via =
addListener.=0A=
             * Optionally, you can specify a specific type of event to =
return.=0A=
             * @method getListeners=0A=
             * @param el {HTMLElement} the element to inspect =0A=
             * @param sType {string} optional type of listener to =
return. If=0A=
             * left out, all listeners will be returned=0A=
             * @return {Object} the listener. Contains the following =
fields:=0A=
             * &nbsp;&nbsp;type:   (string)   the type of event=0A=
             * &nbsp;&nbsp;fn:     (function) the callback supplied to =
addListener=0A=
             * &nbsp;&nbsp;obj:    (object)   the custom object supplied =
to addListener=0A=
             * &nbsp;&nbsp;adjust: (boolean|object)  whether or not to =
adjust the default scope=0A=
             * &nbsp;&nbsp;scope: (boolean)  the derived scope based on =
the adjust parameter=0A=
             * &nbsp;&nbsp;index:  (int)      its position in the Event =
util listener cache=0A=
             * @static=0A=
             */           =0A=
            getListeners: function(el, sType) {=0A=
                var results=3D[], searchLists;=0A=
                if (!sType) {=0A=
                    searchLists =3D [listeners, unloadListeners];=0A=
                } else if (sType =3D=3D "unload") {=0A=
                    searchLists =3D [unloadListeners];=0A=
                } else {=0A=
                    searchLists =3D [listeners];=0A=
                }=0A=
=0A=
                for (var j=3D0;j<searchLists.length; j=3Dj+1) {=0A=
                    var searchList =3D searchLists[j];=0A=
                    if (searchList && searchList.length > 0) {=0A=
                        for (var i=3D0,len=3DsearchList.length; i<len ; =
++i) {=0A=
                            var l =3D searchList[i];=0A=
                            if ( l  && l[this.EL] =3D=3D=3D el && =0A=
                                    (!sType || sType =3D=3D=3D =
l[this.TYPE]) ) {=0A=
                                results.push({=0A=
                                    type:   l[this.TYPE],=0A=
                                    fn:     l[this.FN],=0A=
                                    obj:    l[this.OBJ],=0A=
                                    adjust: l[this.OVERRIDE],=0A=
                                    scope:  l[this.ADJ_SCOPE],=0A=
                                    index:  i=0A=
                                });=0A=
                            }=0A=
                        }=0A=
                    }=0A=
                }=0A=
=0A=
                return (results.length) ? results : null;=0A=
            },=0A=
=0A=
            /**=0A=
             * Removes all listeners registered by pe.event.  Called =0A=
             * automatically during the unload event.=0A=
             * @method _unload=0A=
             * @static=0A=
             * @private=0A=
             */=0A=
            _unload: function(e) {=0A=
=0A=
                var EU =3D YAHOO.util.Event, i, j, l, len, index;=0A=
=0A=
                for (i=3D0,len=3DunloadListeners.length; i<len; ++i) {=0A=
                    l =3D unloadListeners[i];=0A=
                    if (l) {=0A=
                        var scope =3D window;=0A=
                        if (l[EU.ADJ_SCOPE]) {=0A=
                            if (l[EU.ADJ_SCOPE] =3D=3D=3D true) {=0A=
                                scope =3D l[EU.UNLOAD_OBJ];=0A=
                            } else {=0A=
                                scope =3D l[EU.ADJ_SCOPE];=0A=
                            }=0A=
                        }=0A=
                        l[EU.FN].call(scope, EU.getEvent(e, l[EU.EL]), =
l[EU.UNLOAD_OBJ] );=0A=
                        unloadListeners[i] =3D null;=0A=
                        l=3Dnull;=0A=
                        scope=3Dnull;=0A=
                    }=0A=
                }=0A=
=0A=
                unloadListeners =3D null;=0A=
=0A=
                if (listeners && listeners.length > 0) {=0A=
                    j =3D listeners.length;=0A=
                    while (j) {=0A=
                        index =3D j-1;=0A=
                        l =3D listeners[index];=0A=
                        if (l) {=0A=
                            EU.removeListener(l[EU.EL], l[EU.TYPE], =
l[EU.FN], index);=0A=
                        } =0A=
                        j =3D j - 1;=0A=
                    }=0A=
                    l=3Dnull;=0A=
=0A=
                    EU.clearCache();=0A=
                }=0A=
=0A=
                for (i=3D0,len=3DlegacyEvents.length; i<len; ++i) {=0A=
                    // dereference the element=0A=
                    //delete legacyEvents[i][0];=0A=
                    legacyEvents[i][0] =3D null;=0A=
=0A=
                    // delete the array item=0A=
                    //delete legacyEvents[i];=0A=
                    legacyEvents[i] =3D null;=0A=
                }=0A=
=0A=
                legacyEvents =3D null;=0A=
=0A=
                EU._simpleRemove(window, "unload", EU._unload);=0A=
=0A=
            },=0A=
=0A=
            /**=0A=
             * Returns scrollLeft=0A=
             * @method _getScrollLeft=0A=
             * @static=0A=
             * @private=0A=
             */=0A=
            _getScrollLeft: function() {=0A=
                return this._getScroll()[1];=0A=
            },=0A=
=0A=
            /**=0A=
             * Returns scrollTop=0A=
             * @method _getScrollTop=0A=
             * @static=0A=
             * @private=0A=
             */=0A=
            _getScrollTop: function() {=0A=
                return this._getScroll()[0];=0A=
            },=0A=
=0A=
            /**=0A=
             * Returns the scrollTop and scrollLeft.  Used to calculate =
the =0A=
             * pageX and pageY in Internet Explorer=0A=
             * @method _getScroll=0A=
             * @static=0A=
             * @private=0A=
             */=0A=
            _getScroll: function() {=0A=
                var dd =3D document.documentElement, db =3D =
document.body;=0A=
                if (dd && (dd.scrollTop || dd.scrollLeft)) {=0A=
                    return [dd.scrollTop, dd.scrollLeft];=0A=
                } else if (db) {=0A=
                    return [db.scrollTop, db.scrollLeft];=0A=
                } else {=0A=
                    return [0, 0];=0A=
                }=0A=
            },=0A=
            =0A=
            /**=0A=
             * Used by old versions of CustomEvent, restored for =
backwards=0A=
             * compatibility=0A=
             * @method regCE=0A=
             * @private=0A=
             * @static=0A=
             * @deprecated still here for backwards compatibility=0A=
             */=0A=
            regCE: function() {=0A=
                // does nothing=0A=
            },=0A=
=0A=
            /**=0A=
             * Adds a DOM event directly without the caching, cleanup, =
scope adj, etc=0A=
             *=0A=
             * @method _simpleAdd=0A=
             * @param {HTMLElement} el      the element to bind the =
handler to=0A=
             * @param {string}      sType   the type of event handler=0A=
             * @param {function}    fn      the callback to invoke=0A=
             * @param {boolen}      capture capture or bubble phase=0A=
             * @static=0A=
             * @private=0A=
             */=0A=
            _simpleAdd: function () {=0A=
                if (window.addEventListener) {=0A=
                    return function(el, sType, fn, capture) {=0A=
                        el.addEventListener(sType, fn, (capture));=0A=
                    };=0A=
                } else if (window.attachEvent) {=0A=
                    return function(el, sType, fn, capture) {=0A=
                        el.attachEvent("on" + sType, fn);=0A=
                    };=0A=
                } else {=0A=
                    return function(){};=0A=
                }=0A=
            }(),=0A=
=0A=
            /**=0A=
             * Basic remove listener=0A=
             *=0A=
             * @method _simpleRemove=0A=
             * @param {HTMLElement} el      the element to bind the =
handler to=0A=
             * @param {string}      sType   the type of event handler=0A=
             * @param {function}    fn      the callback to invoke=0A=
             * @param {boolen}      capture capture or bubble phase=0A=
             * @static=0A=
             * @private=0A=
             */=0A=
            _simpleRemove: function() {=0A=
                if (window.removeEventListener) {=0A=
                    return function (el, sType, fn, capture) {=0A=
                        el.removeEventListener(sType, fn, (capture));=0A=
                    };=0A=
                } else if (window.detachEvent) {=0A=
                    return function (el, sType, fn) {=0A=
                        el.detachEvent("on" + sType, fn);=0A=
                    };=0A=
                } else {=0A=
                    return function(){};=0A=
                }=0A=
            }()=0A=
        };=0A=
=0A=
    }();=0A=
=0A=
    (function() {=0A=
        var EU =3D YAHOO.util.Event;=0A=
=0A=
        /**=0A=
         * YAHOO.util.Event.on is an alias for addListener=0A=
         * @method on=0A=
         * @see addListener=0A=
         * @static=0A=
         */=0A=
        EU.on =3D EU.addListener;=0A=
=0A=
        /////////////////////////////////////////////////////////////=0A=
        // DOMReady=0A=
        // based on work by: Dean Edwards/John Resig/Matthias Miller =0A=
=0A=
        // Internet Explorer: use the readyState of a defered script.=0A=
        // This isolates what appears to be a safe moment to manipulate=0A=
        // the DOM prior to when the document's readyState suggests=0A=
        // it is safe to do so.=0A=
        if (EU.isIE) {=0A=
=0A=
            // Process onAvailable/onContentReady items when when the =0A=
            // DOM is ready.=0A=
            YAHOO.util.Event.onDOMReady(=0A=
                    YAHOO.util.Event._tryPreloadAttach,=0A=
                    YAHOO.util.Event, true);=0A=
=0A=
=0A=
            var el, d=3Ddocument, b=3Dd.body;=0A=
=0A=
            // If the library is being injected after window.onload, it=0A=
            // is not safe to document.write the script tag.  Detecting=0A=
            // this state doesn't appear possible, so we expect a flag=0A=
            // in YAHOO_config to be set if the library is being =
injected.=0A=
            if (("undefined" !=3D=3D typeof YAHOO_config) && =
YAHOO_config.injecting) {=0A=
=0A=
                el =3D document.createElement("script");=0A=
                var p=3Dd.getElementsByTagName("head")[0] || b;=0A=
                p.insertBefore(el, p.firstChild);=0A=
=0A=
            } else {=0A=
    d.write('<scr'+'ipt id=3D"_yui_eu_dr" defer=3D"true" =
src=3D"//:"><'+'/script>');=0A=
                el=3Ddocument.getElementById("_yui_eu_dr");=0A=
            }=0A=
            =0A=
=0A=
            if (el) {=0A=
                el.onreadystatechange =3D function() {=0A=
                    if ("complete" =3D=3D=3D this.readyState) {=0A=
                        this.parentNode.removeChild(this);=0A=
                        YAHOO.util.Event._ready();=0A=
                    }=0A=
                };=0A=
            } else {=0A=
                // The library was likely injected into the page=0A=
                // rendering onDOMReady unreliable=0A=
                // YAHOO.util.Event._ready();=0A=
            }=0A=
=0A=
            el=3Dnull;=0A=
=0A=
        =0A=
        // Safari: The document's readyState in Safari currently will=0A=
        // change to loaded/complete before images are loaded.=0A=
        //} else if (EU.webkit) {=0A=
        } else if (EU.webkit) {=0A=
=0A=
            EU._drwatch =3D setInterval(function(){=0A=
                var rs=3Ddocument.readyState;=0A=
                if ("loaded" =3D=3D rs || "complete" =3D=3D rs) {=0A=
                    clearInterval(EU._drwatch);=0A=
                    EU._drwatch =3D null;=0A=
                    EU._ready();=0A=
                }=0A=
            }, EU.POLL_INTERVAL); =0A=
=0A=
        // FireFox and Opera: These browsers provide a event for this=0A=
        // moment.=0A=
        } else {=0A=
=0A=
            // @todo will this fire when the library is injected?=0A=
=0A=
            EU._simpleAdd(document, "DOMContentLoaded", EU._ready);=0A=
=0A=
        }=0A=
        /////////////////////////////////////////////////////////////=0A=
=0A=
=0A=
        EU._simpleAdd(window, "load", EU._load);=0A=
        EU._simpleAdd(window, "unload", EU._unload);=0A=
        EU._tryPreloadAttach();=0A=
    })();=0A=
=0A=
}=0A=
/**=0A=
 * EventProvider is designed to be used with YAHOO.augment to wrap =0A=
 * CustomEvents in an interface that allows events to be subscribed to =0A=
 * and fired by name.  This makes it possible for implementing code to=0A=
 * subscribe to an event that either has not been created yet, or will=0A=
 * not be created at all.=0A=
 *=0A=
 * @Class EventProvider=0A=
 */=0A=
YAHOO.util.EventProvider =3D function() { };=0A=
=0A=
YAHOO.util.EventProvider.prototype =3D {=0A=
=0A=
    /**=0A=
     * Private storage of custom events=0A=
     * @property __yui_events=0A=
     * @type Object[]=0A=
     * @private=0A=
     */=0A=
    __yui_events: null,=0A=
=0A=
    /**=0A=
     * Private storage of custom event subscribers=0A=
     * @property __yui_subscribers=0A=
     * @type Object[]=0A=
     * @private=0A=
     */=0A=
    __yui_subscribers: null,=0A=
    =0A=
    /**=0A=
     * Subscribe to a CustomEvent by event type=0A=
     *=0A=
     * @method subscribe=0A=
     * @param p_type     {string}   the type, or name of the event=0A=
     * @param p_fn       {function} the function to exectute when the =
event fires=0A=
     * @param p_obj      {Object}   An object to be passed along when =
the event =0A=
     *                              fires=0A=
     * @param p_override {boolean}  If true, the obj passed in becomes =
the =0A=
     *                              execution scope of the listener=0A=
     */=0A=
    subscribe: function(p_type, p_fn, p_obj, p_override) {=0A=
=0A=
        this.__yui_events =3D this.__yui_events || {};=0A=
        var ce =3D this.__yui_events[p_type];=0A=
=0A=
        if (ce) {=0A=
            ce.subscribe(p_fn, p_obj, p_override);=0A=
        } else {=0A=
            this.__yui_subscribers =3D this.__yui_subscribers || {};=0A=
            var subs =3D this.__yui_subscribers;=0A=
            if (!subs[p_type]) {=0A=
                subs[p_type] =3D [];=0A=
            }=0A=
            subs[p_type].push(=0A=
                { fn: p_fn, obj: p_obj, override: p_override } );=0A=
        }=0A=
    },=0A=
=0A=
    /**=0A=
     * Unsubscribes one or more listeners the from the specified event=0A=
     * @method unsubscribe=0A=
     * @param p_type {string}   The type, or name of the event.  If the =
type=0A=
     *                          is not specified, it will attempt to =
remove=0A=
     *                          the listener from all hosted events.=0A=
     * @param p_fn   {Function} The subscribed function to unsubscribe, =
if not=0A=
     *                          supplied, all subscribers will be =
removed.=0A=
     * @param p_obj  {Object}   The custom object passed to subscribe.  =
This is=0A=
     *                        optional, but if supplied will be used to=0A=
     *                        disambiguate multiple listeners that are =
the same=0A=
     *                        (e.g., you subscribe many object using a =
function=0A=
     *                        that lives on the prototype)=0A=
     * @return {boolean} true if the subscriber was found and detached.=0A=
     */=0A=
    unsubscribe: function(p_type, p_fn, p_obj) {=0A=
        this.__yui_events =3D this.__yui_events || {};=0A=
        var evts =3D this.__yui_events;=0A=
        if (p_type) {=0A=
            var ce =3D evts[p_type];=0A=
            if (ce) {=0A=
                return ce.unsubscribe(p_fn, p_obj);=0A=
            }=0A=
        } else {=0A=
            var ret =3D true;=0A=
            for (var i in evts) {=0A=
                if (YAHOO.lang.hasOwnProperty(evts, i)) {=0A=
                    ret =3D ret && evts[i].unsubscribe(p_fn, p_obj);=0A=
                }=0A=
            }=0A=
            return ret;=0A=
        }=0A=
=0A=
        return false;=0A=
    },=0A=
    =0A=
    /**=0A=
     * Removes all listeners from the specified event.  If the event type=0A=
     * is not specified, all listeners from all hosted custom events will=0A=
     * be removed.=0A=
     * @method unsubscribeAll=0A=
     * @param p_type {string}   The type, or name of the event=0A=
     */=0A=
    unsubscribeAll: function(p_type) {=0A=
        return this.unsubscribe(p_type);=0A=
    },=0A=
=0A=
    /**=0A=
     * Creates a new custom event of the specified type.  If a custom =
event=0A=
     * by that name already exists, it will not be re-created.  In either=0A=
     * case the custom event is returned. =0A=
     *=0A=
     * @method createEvent=0A=
     *=0A=
     * @param p_type {string} the type, or name of the event=0A=
     * @param p_config {object} optional config params.  Valid =
properties are:=0A=
     *=0A=
     *  <ul>=0A=
     *    <li>=0A=
     *      scope: defines the default execution scope.  If not defined=0A=
     *      the default scope will be this instance.=0A=
     *    </li>=0A=
     *    <li>=0A=
     *      silent: if true, the custom event will not generate log =
messages.=0A=
     *      This is false by default.=0A=
     *    </li>=0A=
     *    <li>=0A=
     *      onSubscribeCallback: specifies a callback to execute when the=0A=
     *      event has a new subscriber.  This will fire immediately for=0A=
     *      each queued subscriber if any exist prior to the creation of=0A=
     *      the event.=0A=
     *    </li>=0A=
     *  </ul>=0A=
     *=0A=
     *  @return {CustomEvent} the custom event=0A=
     *=0A=
     */=0A=
    createEvent: function(p_type, p_config) {=0A=
=0A=
        this.__yui_events =3D this.__yui_events || {};=0A=
        var opts =3D p_config || {};=0A=
        var events =3D this.__yui_events;=0A=
=0A=
        if (events[p_type]) {=0A=
        } else {=0A=
=0A=
            var scope  =3D opts.scope  || this;=0A=
            var silent =3D (opts.silent);=0A=
=0A=
            var ce =3D new YAHOO.util.CustomEvent(p_type, scope, silent,=0A=
                    YAHOO.util.CustomEvent.FLAT);=0A=
            events[p_type] =3D ce;=0A=
=0A=
            if (opts.onSubscribeCallback) {=0A=
                ce.subscribeEvent.subscribe(opts.onSubscribeCallback);=0A=
            }=0A=
=0A=
            this.__yui_subscribers =3D this.__yui_subscribers || {};=0A=
            var qs =3D this.__yui_subscribers[p_type];=0A=
=0A=
            if (qs) {=0A=
                for (var i=3D0; i<qs.length; ++i) {=0A=
                    ce.subscribe(qs[i].fn, qs[i].obj, qs[i].override);=0A=
                }=0A=
            }=0A=
        }=0A=
=0A=
        return events[p_type];=0A=
    },=0A=
=0A=
=0A=
   /**=0A=
     * Fire a custom event by name.  The callback functions will be =
executed=0A=
     * from the scope specified when the event was created, and with the =0A=
     * following parameters:=0A=
     *   <ul>=0A=
     *   <li>The first argument fire() was executed with</li>=0A=
     *   <li>The custom object (if any) that was passed into the =
subscribe() =0A=
     *       method</li>=0A=
     *   </ul>=0A=
     * If the custom event has not been explicitly created, it will be=0A=
     * created now with the default config, scoped to the host object=0A=
     * @method fireEvent=0A=
     * @param p_type    {string}  the type, or name of the event=0A=
     * @param arguments {Object*} an arbitrary set of parameters to pass =
to =0A=
     *                            the handler.=0A=
     * @return {boolean} the return value from CustomEvent.fire=0A=
     *                   =0A=
     */=0A=
    fireEvent: function(p_type, arg1, arg2, etc) {=0A=
=0A=
        this.__yui_events =3D this.__yui_events || {};=0A=
        var ce =3D this.__yui_events[p_type];=0A=
=0A=
        if (!ce) {=0A=
            return null;=0A=
        }=0A=
=0A=
        var args =3D [];=0A=
        for (var i=3D1; i<arguments.length; ++i) {=0A=
            args.push(arguments[i]);=0A=
        }=0A=
        return ce.fire.apply(ce, args);=0A=
    },=0A=
=0A=
    /**=0A=
     * Returns true if the custom event of the provided type has been =
created=0A=
     * with createEvent.=0A=
     * @method hasEvent=0A=
     * @param type {string} the type, or name of the event=0A=
     */=0A=
    hasEvent: function(type) {=0A=
        if (this.__yui_events) {=0A=
            if (this.__yui_events[type]) {=0A=
                return true;=0A=
            }=0A=
        }=0A=
        return false;=0A=
    }=0A=
=0A=
};=0A=
=0A=
/**=0A=
* KeyListener is a utility that provides an easy interface for listening =
for=0A=
* keydown/keyup events fired against DOM elements.=0A=
* @namespace YAHOO.util=0A=
* @class KeyListener=0A=
* @constructor=0A=
* @param {HTMLElement} attachTo The element or element ID to which the =
key =0A=
*                               event should be attached=0A=
* @param {String}      attachTo The element or element ID to which the =
key=0A=
*                               event should be attached=0A=
* @param {Object}      keyData  The object literal representing the =
key(s) =0A=
*                               to detect. Possible attributes are =0A=
*                               shift(boolean), alt(boolean), =
ctrl(boolean) =0A=
*                               and keys(either an int or an array of =
ints =0A=
*                               representing keycodes).=0A=
* @param {Function}    handler  The CustomEvent handler to fire when the =0A=
*                               key event is detected=0A=
* @param {Object}      handler  An object literal representing the =
handler. =0A=
* @param {String}      event    Optional. The event (keydown or keyup) =
to =0A=
*                               listen for. Defaults automatically to =
keydown.=0A=
*=0A=
* @knownissue the "keypress" event is completely broken in Safari 2.x =
and below.=0A=
*             the workaround is use "keydown" for key listening.  =
However, if=0A=
*             it is desired to prevent the default behavior of the =
keystroke,=0A=
*             that can only be done on the keypress event.  This makes =
key=0A=
*             handling quite ugly.=0A=
* @knownissue keydown is also broken in Safari 2.x and below for the ESC =
key.=0A=
*             There currently is no workaround other than choosing =
another=0A=
*             key to listen for.=0A=
*/=0A=
YAHOO.util.KeyListener =3D function(attachTo, keyData, handler, event) {=0A=
    if (!attachTo) {=0A=
    } else if (!keyData) {=0A=
    } else if (!handler) {=0A=
    } =0A=
    =0A=
    if (!event) {=0A=
        event =3D YAHOO.util.KeyListener.KEYDOWN;=0A=
    }=0A=
=0A=
    /**=0A=
    * The CustomEvent fired internally when a key is pressed=0A=
    * @event keyEvent=0A=
    * @private=0A=
    * @param {Object} keyData The object literal representing the key(s) =
to =0A=
    *                         detect. Possible attributes are =
shift(boolean), =0A=
    *                         alt(boolean), ctrl(boolean) and =
keys(either an =0A=
    *                         int or an array of ints representing =
keycodes).=0A=
    */=0A=
    var keyEvent =3D new YAHOO.util.CustomEvent("keyPressed");=0A=
    =0A=
    /**=0A=
    * The CustomEvent fired when the KeyListener is enabled via the =
enable() =0A=
    * function=0A=
    * @event enabledEvent=0A=
    * @param {Object} keyData The object literal representing the key(s) =
to =0A=
    *                         detect. Possible attributes are =
shift(boolean), =0A=
    *                         alt(boolean), ctrl(boolean) and =
keys(either an =0A=
    *                         int or an array of ints representing =
keycodes).=0A=
    */=0A=
    this.enabledEvent =3D new YAHOO.util.CustomEvent("enabled");=0A=
=0A=
    /**=0A=
    * The CustomEvent fired when the KeyListener is disabled via the =0A=
    * disable() function=0A=
    * @event disabledEvent=0A=
    * @param {Object} keyData The object literal representing the key(s) =
to =0A=
    *                         detect. Possible attributes are =
shift(boolean), =0A=
    *                         alt(boolean), ctrl(boolean) and =
keys(either an =0A=
    *                         int or an array of ints representing =
keycodes).=0A=
    */=0A=
    this.disabledEvent =3D new YAHOO.util.CustomEvent("disabled");=0A=
=0A=
    if (typeof attachTo =3D=3D 'string') {=0A=
        attachTo =3D document.getElementById(attachTo);=0A=
    }=0A=
=0A=
    if (typeof handler =3D=3D 'function') {=0A=
        keyEvent.subscribe(handler);=0A=
    } else {=0A=
        keyEvent.subscribe(handler.fn, handler.scope, =
handler.correctScope);=0A=
    }=0A=
=0A=
    /**=0A=
    * Handles the key event when a key is pressed.=0A=
    * @method handleKeyPress=0A=
    * @param {DOMEvent} e   The keypress DOM event=0A=
    * @param {Object}   obj The DOM event scope object=0A=
    * @private=0A=
    */=0A=
    function handleKeyPress(e, obj) {=0A=
        if (! keyData.shift) {  =0A=
            keyData.shift =3D false; =0A=
        }=0A=
        if (! keyData.alt) {    =0A=
            keyData.alt =3D false;=0A=
        }=0A=
        if (! keyData.ctrl) {=0A=
            keyData.ctrl =3D false;=0A=
        }=0A=
=0A=
        // check held down modifying keys first=0A=
        if (e.shiftKey =3D=3D keyData.shift && =0A=
            e.altKey   =3D=3D keyData.alt &&=0A=
            e.ctrlKey  =3D=3D keyData.ctrl) { // if we pass this, all =
modifiers match=0A=
            =0A=
            var dataItem;=0A=
            var keyPressed;=0A=
=0A=
            if (keyData.keys instanceof Array) {=0A=
                for (var i=3D0;i<keyData.keys.length;i++) {=0A=
                    dataItem =3D keyData.keys[i];=0A=
=0A=
                    if (dataItem =3D=3D e.charCode ) {=0A=
                        keyEvent.fire(e.charCode, e);=0A=
                        break;=0A=
                    } else if (dataItem =3D=3D e.keyCode) {=0A=
                        keyEvent.fire(e.keyCode, e);=0A=
                        break;=0A=
                    }=0A=
                }=0A=
            } else {=0A=
                dataItem =3D keyData.keys;=0A=
                if (dataItem =3D=3D e.charCode ) {=0A=
                    keyEvent.fire(e.charCode, e);=0A=
                } else if (dataItem =3D=3D e.keyCode) {=0A=
                    keyEvent.fire(e.keyCode, e);=0A=
                }=0A=
            }=0A=
        }=0A=
    }=0A=
=0A=
    /**=0A=
    * Enables the KeyListener by attaching the DOM event listeners to =
the =0A=
    * target DOM element=0A=
    * @method enable=0A=
    */=0A=
    this.enable =3D function() {=0A=
        if (! this.enabled) {=0A=
            YAHOO.util.Event.addListener(attachTo, event, =
handleKeyPress);=0A=
            this.enabledEvent.fire(keyData);=0A=
        }=0A=
        /**=0A=
        * Boolean indicating the enabled/disabled state of the Tooltip=0A=
        * @property enabled=0A=
        * @type Boolean=0A=
        */=0A=
        this.enabled =3D true;=0A=
    };=0A=
=0A=
    /**=0A=
    * Disables the KeyListener by removing the DOM event listeners from =
the =0A=
    * target DOM element=0A=
    * @method disable=0A=
    */=0A=
    this.disable =3D function() {=0A=
        if (this.enabled) {=0A=
            YAHOO.util.Event.removeListener(attachTo, event, =
handleKeyPress);=0A=
            this.disabledEvent.fire(keyData);=0A=
        }=0A=
        this.enabled =3D false;=0A=
    };=0A=
=0A=
    /**=0A=
    * Returns a String representation of the object.=0A=
    * @method toString=0A=
    * @return {String}  The string representation of the KeyListener=0A=
    */ =0A=
    this.toString =3D function() {=0A=
        return "KeyListener [" + keyData.keys + "] " + attachTo.tagName =
+ =0A=
                (attachTo.id ? "[" + attachTo.id + "]" : "");=0A=
    };=0A=
=0A=
};=0A=
=0A=
/**=0A=
* Constant representing the DOM "keydown" event.=0A=
* @property YAHOO.util.KeyListener.KEYDOWN=0A=
* @static=0A=
* @final=0A=
* @type String=0A=
*/=0A=
YAHOO.util.KeyListener.KEYDOWN =3D "keydown";=0A=
=0A=
/**=0A=
* Constant representing the DOM "keyup" event.=0A=
* @property YAHOO.util.KeyListener.KEYUP=0A=
* @static=0A=
* @final=0A=
* @type String=0A=
*/=0A=
YAHOO.util.KeyListener.KEYUP =3D "keyup";=0A=
YAHOO.register("event", YAHOO.util.Event, {version: "2.3.1", build: =
"541"});=0A=

------=_NextPart_000_0061_01C82292.502B3E40
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.melindaflynn.com/chat/js/connection.js

/*
Copyright (c) 2007, Yahoo! Inc. All rights reserved.
Code licensed under the BSD License:
http://developer.yahoo.net/yui/license.txt
version: 2.3.1
*/
/**
 * The Connection Manager provides a simplified interface to the =
XMLHttpRequest
 * object.  It handles cross-browser instantiantion of XMLHttpRequest, =
negotiates the
 * interactive states and server response, returning the results to a =
pre-defined
 * callback you create.
 *
 * @namespace YAHOO.util
 * @module connection
 * @requires yahoo
 * @requires event
 */

/**
 * The Connection Manager singleton provides methods for creating and =
managing
 * asynchronous transactions.
 *
 * @class Connect
 */

YAHOO.util.Connect =3D
{
  /**
   * @description Array of MSFT ActiveX ids for XMLHttpRequest.
   * @property _msxml_progid
   * @private
   * @static
   * @type array
   */
	_msxml_progid:[
		'Microsoft.XMLHTTP',
		'MSXML2.XMLHTTP.3.0',
		'MSXML2.XMLHTTP'
		],

  /**
   * @description Object literal of HTTP header(s)
   * @property _http_header
   * @private
   * @static
   * @type object
   */
	_http_headers:{},

  /**
   * @description Determines if HTTP headers are set.
   * @property _has_http_headers
   * @private
   * @static
   * @type boolean
   */
	_has_http_headers:false,

 /**
  * @description Determines if a default header of
  * Content-Type of 'application/x-www-form-urlencoded'
  * will be added to any client HTTP headers sent for POST
  * transactions.
  * @property _use_default_post_header
  * @private
  * @static
  * @type boolean
  */
    _use_default_post_header:true,

 /**
  * @description The default header used for POST transactions.
  * @property _default_post_header
  * @private
  * @static
  * @type boolean
  */
    _default_post_header:'application/x-www-form-urlencoded; =
charset=3DUTF-8',

 /**
  * @description The default header used for transactions involving the
  * use of HTML forms.
  * @property _default_form_header
  * @private
  * @static
  * @type boolean
  */
    _default_form_header:'application/x-www-form-urlencoded',

 /**
  * @description Determines if a default header of
  * 'X-Requested-With: XMLHttpRequest'
  * will be added to each transaction.
  * @property _use_default_xhr_header
  * @private
  * @static
  * @type boolean
  */
    _use_default_xhr_header:true,

 /**
  * @description The default header value for the label
  * "X-Requested-With".  This is sent with each
  * transaction, by default, to identify the
  * request as being made by YUI Connection Manager.
  * @property _default_xhr_header
  * @private
  * @static
  * @type boolean
  */
    _default_xhr_header:'XMLHttpRequest',

 /**
  * @description Determines if custom, default headers
  * are set for each transaction.
  * @property _has_default_header
  * @private
  * @static
  * @type boolean
  */
    _has_default_headers:true,

 /**
  * @description Determines if custom, default headers
  * are set for each transaction.
  * @property _has_default_header
  * @private
  * @static
  * @type boolean
  */
    _default_headers:{},

 /**
  * @description Property modified by setForm() to determine if the data
  * should be submitted as an HTML form.
  * @property _isFormSubmit
  * @private
  * @static
  * @type boolean
  */
    _isFormSubmit:false,

 /**
  * @description Property modified by setForm() to determine if a =
file(s)
  * upload is expected.
  * @property _isFileUpload
  * @private
  * @static
  * @type boolean
  */
    _isFileUpload:false,

 /**
  * @description Property modified by setForm() to set a reference to =
the HTML
  * form node if the desired action is file upload.
  * @property _formNode
  * @private
  * @static
  * @type object
  */
    _formNode:null,

 /**
  * @description Property modified by setForm() to set the HTML form =
data
  * for each transaction.
  * @property _sFormData
  * @private
  * @static
  * @type string
  */
    _sFormData:null,

 /**
  * @description Collection of polling references to the polling =
mechanism in handleReadyState.
  * @property _poll
  * @private
  * @static
  * @type object
  */
    _poll:[],

 /**
  * @description Queue of timeout values for each transaction callback =
with a defined timeout value.
  * @property _timeOut
  * @private
  * @static
  * @type object
  */
    _timeOut:[],

  /**
   * @description The polling frequency, in milliseconds, for =
HandleReadyState.
   * when attempting to determine a transaction's XHR readyState.
   * The default is 50 milliseconds.
   * @property _polling_interval
   * @private
   * @static
   * @type int
   */
     _polling_interval:50,

  /**
   * @description A transaction counter that increments the transaction =
id for each transaction.
   * @property _transaction_id
   * @private
   * @static
   * @type int
   */
     _transaction_id:0,

  /**
   * @description Tracks the name-value pair of the "clicked" submit =
button if multiple submit
   * buttons are present in an HTML form; and, if YAHOO.util.Event is =
available.
   * @property _submitElementValue
   * @private
   * @static
   * @type string
   */
	 _submitElementValue:null,

  /**
   * @description Determines whether YAHOO.util.Event is available and =
returns true or false.
   * If true, an event listener is bound at the document level to trap =
click events that
   * resolve to a target type of "Submit".  This listener will enable =
setForm() to determine
   * the clicked "Submit" value in a multi-Submit button, HTML form.
   * @property _hasSubmitListener
   * @private
   * @static
   */
	 _hasSubmitListener:(function()
	 {
		if(YAHOO.util.Event){
			YAHOO.util.Event.addListener(
				document,
				'click',
				function(e){
					try
					{
						var obj =3D YAHOO.util.Event.getTarget(e);
						if(obj.type.toLowerCase() =3D=3D 'submit'){
							YAHOO.util.Connect._submitElementValue =3D =
encodeURIComponent(obj.name) + "=3D" + encodeURIComponent(obj.value);
						}
					}
					catch(e){}
				});
			return true;
	    }
	    return false;
	 })(),

  /**
   * @description Custom event that fires at the start of a transaction
   * @property startEvent
   * @private
   * @static
   * @type CustomEvent
   */
	startEvent: new YAHOO.util.CustomEvent('start'),

  /**
   * @description Custom event that fires when a transaction response =
has completed.
   * @property completeEvent
   * @private
   * @static
   * @type CustomEvent
   */
	completeEvent: new YAHOO.util.CustomEvent('complete'),

  /**
   * @description Custom event that fires when =
handleTransactionResponse() determines a
   * response in the HTTP 2xx range.
   * @property successEvent
   * @private
   * @static
   * @type CustomEvent
   */
	successEvent: new YAHOO.util.CustomEvent('success'),

  /**
   * @description Custom event that fires when =
handleTransactionResponse() determines a
   * response in the HTTP 4xx/5xx range.
   * @property failureEvent
   * @private
   * @static
   * @type CustomEvent
   */
	failureEvent: new YAHOO.util.CustomEvent('failure'),

  /**
   * @description Custom event that fires when =
handleTransactionResponse() determines a
   * response in the HTTP 4xx/5xx range.
   * @property failureEvent
   * @private
   * @static
   * @type CustomEvent
   */
	uploadEvent: new YAHOO.util.CustomEvent('upload'),

  /**
   * @description Custom event that fires when a transaction is =
successfully aborted.
   * @property abortEvent
   * @private
   * @static
   * @type CustomEvent
   */
	abortEvent: new YAHOO.util.CustomEvent('abort'),

  /**
   * @description A reference table that maps callback custom events =
members to its specific
   * event name.
   * @property _customEvents
   * @private
   * @static
   * @type object
   */
	_customEvents:
	{
		onStart:['startEvent', 'start'],
		onComplete:['completeEvent', 'complete'],
		onSuccess:['successEvent', 'success'],
		onFailure:['failureEvent', 'failure'],
		onUpload:['uploadEvent', 'upload'],
		onAbort:['abortEvent', 'abort']
	},

  /**
   * @description Member to add an ActiveX id to the existing xml_progid =
array.
   * In the event(unlikely) a new ActiveX id is introduced, it can be =
added
   * without internal code modifications.
   * @method setProgId
   * @public
   * @static
   * @param {string} id The ActiveX id to be added to initialize the XHR =
object.
   * @return void
   */
	setProgId:function(id)
	{
		this._msxml_progid.unshift(id);
	},

  /**
   * @description Member to override the default POST header.
   * @method setDefaultPostHeader
   * @public
   * @static
   * @param {boolean} b Set and use default header - true or false .
   * @return void
   */
	setDefaultPostHeader:function(b)
	{
		if(typeof b =3D=3D 'string'){
			this._default_post_header =3D b;
		}
		else if(typeof b =3D=3D 'boolean'){
			this._use_default_post_header =3D b;
		}
	},

  /**
   * @description Member to override the default transaction header..
   * @method setDefaultXhrHeader
   * @public
   * @static
   * @param {boolean} b Set and use default header - true or false .
   * @return void
   */
	setDefaultXhrHeader:function(b)
	{
		if(typeof b =3D=3D 'string'){
			this._default_xhr_header =3D b;
		}
		else{
			this._use_default_xhr_header =3D b;
		}
	},

  /**
   * @description Member to modify the default polling interval.
   * @method setPollingInterval
   * @public
   * @static
   * @param {int} i The polling interval in milliseconds.
   * @return void
   */
	setPollingInterval:function(i)
	{
		if(typeof i =3D=3D 'number' && isFinite(i)){
			this._polling_interval =3D i;
		}
	},

  /**
   * @description Instantiates a XMLHttpRequest object and returns an =
object with two properties:
   * the XMLHttpRequest instance and the transaction id.
   * @method createXhrObject
   * @private
   * @static
   * @param {int} transactionId Property containing the transaction id =
for this transaction.
   * @return object
   */
	createXhrObject:function(transactionId)
	{
		var obj,http;
		try
		{
			// Instantiates XMLHttpRequest in non-IE browsers and assigns to =
http.
			http =3D new XMLHttpRequest();
			//  Object literal with http and tId properties
			obj =3D { conn:http, tId:transactionId };
		}
		catch(e)
		{
			for(var i=3D0; i<this._msxml_progid.length; ++i){
				try
				{
					// Instantiates XMLHttpRequest for IE and assign to http
					http =3D new ActiveXObject(this._msxml_progid[i]);
					//  Object literal with conn and tId properties
					obj =3D { conn:http, tId:transactionId };
					break;
				}
				catch(e){}
			}
		}
		finally
		{
			return obj;
		}
	},

  /**
   * @description This method is called by asyncRequest to create a
   * valid connection object for the transaction.  It also passes a
   * transaction id and increments the transaction id counter.
   * @method getConnectionObject
   * @private
   * @static
   * @return {object}
   */
	getConnectionObject:function(isFileUpload)
	{
		var o;
		var tId =3D this._transaction_id;

		try
		{
			if(!isFileUpload){
				o =3D this.createXhrObject(tId);
			}
			else{
				o =3D {};
				o.tId =3D tId;
				o.isUpload =3D true;
			}

			if(o){
				this._transaction_id++;
			}
		}
		catch(e){}
		finally
		{
			return o;
		}
	},

  /**
   * @description Method for initiating an asynchronous request via the =
XHR object.
   * @method asyncRequest
   * @public
   * @static
   * @param {string} method HTTP transaction method
   * @param {string} uri Fully qualified path of resource
   * @param {callback} callback User-defined callback function or object
   * @param {string} postData POST body
   * @return {object} Returns the connection object
   */
	asyncRequest:function(method, uri, callback, postData)
	{
		var o =3D =
(this._isFileUpload)?this.getConnectionObject(true):this.getConnectionObj=
ect();

		if(!o){
			return null;
		}
		else{

			// Intialize any transaction-specific custom events, if provided.
			if(callback && callback.customevents){
				this.initCustomEvents(o, callback);
			}

			if(this._isFormSubmit){
				if(this._isFileUpload){
					this.uploadFile(o, callback, uri, postData);
					return o;
				}

				// If the specified HTTP method is GET, setForm() will return an
				// encoded string that is concatenated to the uri to
				// create a querystring.
				if(method.toUpperCase() =3D=3D 'GET'){
					if(this._sFormData.length !=3D=3D 0){
						// If the URI already contains a querystring, append an ampersand
						// and then concatenate _sFormData to the URI.
						uri +=3D ((uri.indexOf('?') =3D=3D -1)?'?':'&') + this._sFormData;
					}
					else{
						uri +=3D "?" + this._sFormData;
					}
				}
				else if(method.toUpperCase() =3D=3D 'POST'){
					// If POST data exist in addition to the HTML form data,
					// it will be concatenated to the form data.
					postData =3D postData?this._sFormData + "&" + =
postData:this._sFormData;
				}
			}

			o.conn.open(method, uri, true);

			// Each transaction will automatically include a custom header of
			// "X-Requested-With: XMLHttpRequest" to identify the request as
			// having originated from Connection Manager.
			if(this._use_default_xhr_header){
				if(!this._default_headers['X-Requested-With']){
					this.initHeader('X-Requested-With', this._default_xhr_header, =
true);
				}
			}

			if(this._isFormSubmit =3D=3D false && this._use_default_post_header){
				this.initHeader('Content-Type', this._default_post_header);
			}

			if(this._has_default_headers || this._has_http_headers){
				this.setHeader(o);
			}

			o.conn.send(postData || null);
			this.handleReadyState(o, callback);
		=09
			// Fire global custom event -- startEvent
			this.startEvent.fire(o);

			if(o.startEvent){
				// Fire transaction custom event -- startEvent
				o.startEvent.fire(o);
			}

			return o;
		}
	},

  /**
   * @description This method creates and subscribes custom events,
   * specific to each transaction
   * @method initCustomEvents
   * @private
   * @static
   * @param {object} o The connection object
   * @param {callback} callback The user-defined callback object
   * @return {void}
   */
	initCustomEvents:function(o, callback)
	{
		// Enumerate through callback.customevents members and bind/subscribe
		// events that match in the _customEvents table.
		for(var prop in callback.customevents){
			if(this._customEvents[prop][0]){
				// Create the custom event
				o[this._customEvents[prop][0]] =3D new =
YAHOO.util.CustomEvent(this._customEvents[prop][1], =
(callback.scope)?callback.scope:null);

				// Subscribe the custom event
				=
o[this._customEvents[prop][0]].subscribe(callback.customevents[prop]);
			}
		}
	},

  /**
   * @description This method serves as a timer that polls the XHR =
object's readyState
   * property during a transaction, instead of binding a callback to the
   * onreadystatechange event.  Upon readyState 4, =
handleTransactionResponse
   * will process the response, and the timer will be cleared.
   * @method handleReadyState
   * @private
   * @static
   * @param {object} o The connection object
   * @param {callback} callback The user-defined callback object
   * @return {void}
   */

    handleReadyState:function(o, callback)
    {
		var oConn =3D this;

		if(callback && callback.timeout){
			this._timeOut[o.tId] =3D window.setTimeout(function(){ oConn.abort(o, =
callback, true); }, callback.timeout);
		}

		this._poll[o.tId] =3D window.setInterval(
			function(){
				if(o.conn && o.conn.readyState =3D=3D 4){
					// Clear the polling interval for the transaction
					// and remove the reference from _poll.
					window.clearInterval(oConn._poll[o.tId]);
					delete oConn._poll[o.tId];
					oConn._poll.splice(o.tId, 1);

					if(callback && callback.timeout){
						window.clearTimeout(oConn._timeOut[o.tId]);
						delete oConn._timeOut[o.tId];
						oConn._timeOut.splice(o.tId, 1);
					}

					// Fire global custom event -- completeEvent
					oConn.completeEvent.fire(o);

					if(o.completeEvent){
						// Fire transaction custom event -- completeEvent
						o.completeEvent.fire(o);
					}

					oConn.handleTransactionResponse(o, callback);
				}
			}
		,this._polling_interval);
    },

  /**
   * @description This method attempts to interpret the server response =
and
   * determine whether the transaction was successful, or if an error or
   * exception was encountered.
   * @method handleTransactionResponse
   * @private
   * @static
   * @param {object} o The connection object
   * @param {object} callback The user-defined callback object
   * @param {boolean} isAbort Determines if the transaction was =
terminated via abort().
   * @return {void}
   */
    handleTransactionResponse:function(o, callback, isAbort)
    {

		var httpStatus, responseObject;

		try
		{
			if(o.conn.status !=3D=3D undefined && o.conn.status !=3D=3D 0){
				httpStatus =3D o.conn.status;
			}
			else{
				httpStatus =3D 13030;
			}
		}
		catch(e){

			 // 13030 is a custom code to indicate the condition -- in Mozilla/FF =
--
			 // when the XHR object's status and statusText properties are
			 // unavailable, and a query attempt throws an exception.
			httpStatus =3D 13030;
		}

		if(httpStatus >=3D 200 && httpStatus < 300 || httpStatus =3D=3D=3D =
1223){
			responseObject =3D this.createResponseObject(o, (callback && =
callback.argument)?callback.argument:undefined);
			if(callback){
				if(callback.success){
					if(!callback.scope){
						callback.success(responseObject);
					}
					else{
						// If a scope property is defined, the callback will be fired from
						// the context of the object.
						callback.success.apply(callback.scope, [responseObject]);
					}
				}
			}

			// Fire global custom event -- successEvent
			this.successEvent.fire(responseObject);

			if(o.successEvent){
				// Fire transaction custom event -- successEvent
				o.successEvent.fire(responseObject);
			}
		}
		else{
			switch(httpStatus){
				// The following cases are wininet.dll error codes that may be =
encountered.
				case 12002: // Server timeout
				case 12029: // 12029 to 12031 correspond to dropped connections.
				case 12030:
				case 12031:
				case 12152: // Connection closed by server.
				case 13030: // See above comments for variable status.
					responseObject =3D this.createExceptionObject(o.tId, (callback && =
callback.argument)?callback.argument:undefined, =
(isAbort?isAbort:false));
					if(callback){
						if(callback.failure){
							if(!callback.scope){
								callback.failure(responseObject);
							}
							else{
								callback.failure.apply(callback.scope, [responseObject]);
							}
						}
					}

					break;
				default:
					responseObject =3D this.createResponseObject(o, (callback && =
callback.argument)?callback.argument:undefined);
					if(callback){
						if(callback.failure){
							if(!callback.scope){
								callback.failure(responseObject);
							}
							else{
								callback.failure.apply(callback.scope, [responseObject]);
							}
						}
					}
			}

			// Fire global custom event -- failureEvent
			this.failureEvent.fire(responseObject);

			if(o.failureEvent){
				// Fire transaction custom event -- failureEvent
				o.failureEvent.fire(responseObject);
			}

		}

		this.releaseObject(o);
		responseObject =3D null;
	=09
		if (typeof CollectGarbage !=3D 'undefined') CollectGarbage();
    },

  /**
   * @description This method evaluates the server response, creates and =
returns the results via
   * its properties.  Success and failure cases will differ in the =
response
   * object's property values.
   * @method createResponseObject
   * @private
   * @static
   * @param {object} o The connection object
   * @param {callbackArg} callbackArg The user-defined argument or =
arguments to be passed to the callback
   * @return {object}
   */
    createResponseObject:function(o, callbackArg)
    {
		var obj =3D {};
		var headerObj =3D {};

		try
		{
			var headerStr =3D o.conn.getAllResponseHeaders();
			var header =3D headerStr.split('\n');
			for(var i=3D0; i<header.length; i++){
				var delimitPos =3D header[i].indexOf(':');
				if(delimitPos !=3D -1){
					headerObj[header[i].substring(0,delimitPos)] =3D =
header[i].substring(delimitPos+2);
				}
			}
		}
		catch(e){}

		obj.tId =3D o.tId;
		// Normalize IE's response to HTTP 204 when Win error 1223.
		obj.status =3D (o.conn.status =3D=3D 1223)?204:o.conn.status;
		// Normalize IE's statusText to "No Content" instead of "Unknown".
		obj.statusText =3D (o.conn.status =3D=3D 1223)?"No =
Content":o.conn.statusText;
		obj.getResponseHeader =3D headerObj;
		obj.getAllResponseHeaders =3D headerStr;
		obj.responseText =3D o.conn.responseText;
		obj.responseXML =3D o.conn.responseXML;

		if(typeof callbackArg !=3D=3D undefined){
			obj.argument =3D callbackArg;
		}

		return obj;
    },

  /**
   * @description If a transaction cannot be completed due to dropped or =
closed connections,
   * there may be not be enough information to build a full response =
object.
   * The failure callback will be fired and this specific condition can =
be identified
   * by a status property value of 0.
   *
   * If an abort was successful, the status property will report a value =
of -1.
   *
   * @method createExceptionObject
   * @private
   * @static
   * @param {int} tId The Transaction Id
   * @param {callbackArg} callbackArg The user-defined argument or =
arguments to be passed to the callback
   * @param {boolean} isAbort Determines if the exception case is caused =
by a transaction abort
   * @return {object}
   */
    createExceptionObject:function(tId, callbackArg, isAbort)
    {
		var COMM_CODE =3D 0;
		var COMM_ERROR =3D 'communication failure';
		var ABORT_CODE =3D -1;
		var ABORT_ERROR =3D 'transaction aborted';

		var obj =3D {};

		obj.tId =3D tId;
		if(isAbort){
			obj.status =3D ABORT_CODE;
			obj.statusText =3D ABORT_ERROR;
		}
		else{
			obj.status =3D COMM_CODE;
			obj.statusText =3D COMM_ERROR;
		}

		if(callbackArg){
			obj.argument =3D callbackArg;
		}

		return obj;
    },

  /**
   * @description Method that initializes the custom HTTP headers for =
the each transaction.
   * @method initHeader
   * @public
   * @static
   * @param {string} label The HTTP header label
   * @param {string} value The HTTP header value
   * @param {string} isDefault Determines if the specific header is a =
default header
   * automatically sent with each transaction.
   * @return {void}
   */
	initHeader:function(label, value, isDefault)
	{
		var headerObj =3D =
(isDefault)?this._default_headers:this._http_headers;
		headerObj[label] =3D value;

		if(isDefault){
			this._has_default_headers =3D true;
		}
		else{
			this._has_http_headers =3D true;
		}
	},


  /**
   * @description Accessor that sets the HTTP headers for each =
transaction.
   * @method setHeader
   * @private
   * @static
   * @param {object} o The connection object for the transaction.
   * @return {void}
   */
	setHeader:function(o)
	{
		if(this._has_default_headers){
			for(var prop in this._default_headers){
				if(YAHOO.lang.hasOwnProperty(this._default_headers, prop)){
					o.conn.setRequestHeader(prop, this._default_headers[prop]);
				}
			}
		}

		if(this._has_http_headers){
			for(var prop in this._http_headers){
				if(YAHOO.lang.hasOwnProperty(this._http_headers, prop)){
					o.conn.setRequestHeader(prop, this._http_headers[prop]);
				}
			}
			delete this._http_headers;

			this._http_headers =3D {};
			this._has_http_headers =3D false;
		}
	},

  /**
   * @description Resets the default HTTP headers object
   * @method resetDefaultHeaders
   * @public
   * @static
   * @return {void}
   */
	resetDefaultHeaders:function(){
		delete this._default_headers;
		this._default_headers =3D {};
		this._has_default_headers =3D false;
	},

  /**
   * @description This method assembles the form label and value pairs =
and
   * constructs an encoded string.
   * asyncRequest() will automatically initialize the transaction with a
   * a HTTP header Content-Type of application/x-www-form-urlencoded.
   * @method setForm
   * @public
   * @static
   * @param {string || object} form id or name attribute, or form =
object.
   * @param {boolean} optional enable file upload.
   * @param {boolean} optional enable file upload over SSL in IE only.
   * @return {string} string of the HTML form field name and value =
pairs..
   */
	setForm:function(formId, isUpload, secureUri)
	{
		this.resetFormState();

		var oForm;
		if(typeof formId =3D=3D 'string'){
			// Determine if the argument is a form id or a form name.
			// Note form name usage is deprecated by supported
			// here for legacy reasons.
			oForm =3D (document.getElementById(formId) || =
document.forms[formId]);
		}
		else if(typeof formId =3D=3D 'object'){
			// Treat argument as an HTML form object.
			oForm =3D formId;
		}
		else{
			return;
		}

		// If the isUpload argument is true, setForm will call createFrame to =
initialize
		// an iframe as the form target.
		//
		// The argument secureURI is also required by IE in SSL environments
		// where the secureURI string is a fully qualified HTTP path, used to =
set the source
		// of the iframe, to a stub resource in the same domain.
		if(isUpload){

			// Create iframe in preparation for file upload.
			var io =3D this.createFrame(secureUri?secureUri:null);
			// Set form reference and file upload properties to true.
			this._isFormSubmit =3D true;
			this._isFileUpload =3D true;
			this._formNode =3D oForm;

			return;

		}

		var oElement, oName, oValue, oDisabled;
		var hasSubmit =3D false;

		// Iterate over the form elements collection to construct the
		// label-value pairs.
		for (var i=3D0; i<oForm.elements.length; i++){
			oElement =3D oForm.elements[i];
			oDisabled =3D oForm.elements[i].disabled;
			oName =3D oForm.elements[i].name;
			oValue =3D oForm.elements[i].value;

			// Do not submit fields that are disabled or
			// do not have a name attribute value.
			if(!oDisabled && oName)
			{
				switch(oElement.type)
				{
					case 'select-one':
					case 'select-multiple':
						for(var j=3D0; j<oElement.options.length; j++){
							if(oElement.options[j].selected){
								if(window.ActiveXObject){
									this._sFormData +=3D encodeURIComponent(oName) + '=3D' + =
encodeURIComponent(oElement.options[j].attributes['value'].specified?oEle=
ment.options[j].value:oElement.options[j].text) + '&';
								}
								else{
									this._sFormData +=3D encodeURIComponent(oName) + '=3D' + =
encodeURIComponent(oElement.options[j].hasAttribute('value')?oElement.opt=
ions[j].value:oElement.options[j].text) + '&';
								}
							}
						}
						break;
					case 'radio':
					case 'checkbox':
						if(oElement.checked){
							this._sFormData +=3D encodeURIComponent(oName) + '=3D' + =
encodeURIComponent(oValue) + '&';
						}
						break;
					case 'file':
						// stub case as XMLHttpRequest will only send the file path as a =
string.
					case undefined:
						// stub case for fieldset element which returns undefined.
					case 'reset':
						// stub case for input type reset button.
					case 'button':
						// stub case for input type button elements.
						break;
					case 'submit':
						if(hasSubmit =3D=3D=3D false){
							if(this._hasSubmitListener && this._submitElementValue){
								this._sFormData +=3D this._submitElementValue + '&';
							}
							else{
								this._sFormData +=3D encodeURIComponent(oName) + '=3D' + =
encodeURIComponent(oValue) + '&';
							}

							hasSubmit =3D true;
						}
						break;
					default:
						this._sFormData +=3D encodeURIComponent(oName) + '=3D' + =
encodeURIComponent(oValue) + '&';
				}
			}
		}

		this._isFormSubmit =3D true;
		this._sFormData =3D this._sFormData.substr(0, this._sFormData.length - =
1);


		this.initHeader('Content-Type', this._default_form_header);

		return this._sFormData;
	},

  /**
   * @description Resets HTML form properties when an HTML form or HTML =
form
   * with file upload transaction is sent.
   * @method resetFormState
   * @private
   * @static
   * @return {void}
   */
	resetFormState:function(){
		this._isFormSubmit =3D false;
		this._isFileUpload =3D false;
		this._formNode =3D null;
		this._sFormData =3D "";
	},

  /**
   * @description Creates an iframe to be used for form file uploads.  =
It is remove from the
   * document upon completion of the upload transaction.
   * @method createFrame
   * @private
   * @static
   * @param {string} optional qualified path of iframe resource for SSL =
in IE.
   * @return {void}
   */
	createFrame:function(secureUri){

		// IE does not allow the setting of id and name attributes as object
		// properties via createElement().  A different iframe creation
		// pattern is required for IE.
		var frameId =3D 'yuiIO' + this._transaction_id;
		var io;
		if(window.ActiveXObject){
			io =3D document.createElement('<iframe id=3D"' + frameId + '" =
name=3D"' + frameId + '" />');

			// IE will throw a security exception in an SSL environment if the
			// iframe source is undefined.
			if(typeof secureUri =3D=3D 'boolean'){
				io.src =3D 'javascript:false';
			}
			else if(typeof secureURI =3D=3D 'string'){
				// Deprecated
				io.src =3D secureUri;
			}
		}
		else{
			io =3D document.createElement('iframe');
			io.id =3D frameId;
			io.name =3D frameId;
		}

		io.style.position =3D 'absolute';
		io.style.top =3D '-1000px';
		io.style.left =3D '-1000px';

		document.body.appendChild(io);
	},

  /**
   * @description Parses the POST data and creates hidden form elements
   * for each key-value, and appends them to the HTML form object.
   * @method appendPostData
   * @private
   * @static
   * @param {string} postData The HTTP POST data
   * @return {array} formElements Collection of hidden fields.
   */
	appendPostData:function(postData)
	{
		var formElements =3D [];
		var postMessage =3D postData.split('&');
		for(var i=3D0; i < postMessage.length; i++){
			var delimitPos =3D postMessage[i].indexOf('=3D');
			if(delimitPos !=3D -1){
				formElements[i] =3D document.createElement('input');
				formElements[i].type =3D 'hidden';
				formElements[i].name =3D postMessage[i].substring(0,delimitPos);
				formElements[i].value =3D postMessage[i].substring(delimitPos+1);
				this._formNode.appendChild(formElements[i]);
			}
		}

		return formElements;
	},

  /**
   * @description Uploads HTML form, inclusive of files/attachments, =
using the
   * iframe created in createFrame to facilitate the transaction.
   * @method uploadFile
   * @private
   * @static
   * @param {int} id The transaction id.
   * @param {object} callback User-defined callback object.
   * @param {string} uri Fully qualified path of resource.
   * @param {string} postData POST data to be submitted in addition to =
HTML form.
   * @return {void}
   */
	uploadFile:function(o, callback, uri, postData){

		// Each iframe has an id prefix of "yuiIO" followed
		// by the unique transaction id.
		var frameId =3D 'yuiIO' + o.tId;
		var uploadEncoding =3D 'multipart/form-data';
		var io =3D document.getElementById(frameId);
		var oConn =3D this;

		// Track original HTML form attribute values.
		var rawFormAttributes =3D
		{
			action:this._formNode.getAttribute('action'),
			method:this._formNode.getAttribute('method'),
			target:this._formNode.getAttribute('target')
		};

		// Initialize the HTML form properties in case they are
		// not defined in the HTML form.
		this._formNode.setAttribute('action', uri);
		this._formNode.setAttribute('method', 'POST');
		this._formNode.setAttribute('target', frameId);

		if(this._formNode.encoding){
			// IE does not respect property enctype for HTML forms.
			// Instead it uses the property - "encoding".
			this._formNode.setAttribute('encoding', uploadEncoding);
		}
		else{
			this._formNode.setAttribute('enctype', uploadEncoding);
		}

		if(postData){
			var oElements =3D this.appendPostData(postData);
		}

		// Start file upload.
		this._formNode.submit();

		// Fire global custom event -- startEvent
		this.startEvent.fire(o);

		if(o.startEvent){
			// Fire transaction custom event -- startEvent
			o.startEvent.fire(o);
		}

		// Start polling if a callback is present and the timeout
		// property has been defined.
		if(callback && callback.timeout){
			this._timeOut[o.tId] =3D window.setTimeout(function(){ oConn.abort(o, =
callback, true); }, callback.timeout);
		}

		// Remove HTML elements created by appendPostData
		if(oElements && oElements.length > 0){
			for(var i=3D0; i < oElements.length; i++){
				this._formNode.removeChild(oElements[i]);
			}
		}

		// Restore HTML form attributes to their original
		// values prior to file upload.
		for(var prop in rawFormAttributes){
			if(YAHOO.lang.hasOwnProperty(rawFormAttributes, prop)){
				if(rawFormAttributes[prop]){
					this._formNode.setAttribute(prop, rawFormAttributes[prop]);
				}
				else{
					this._formNode.removeAttribute(prop);
				}
			}
		}

		// Reset HTML form state properties.
		this.resetFormState();

		// Create the upload callback handler that fires when the iframe
		// receives the load event.  Subsequently, the event handler is =
detached
		// and the iframe removed from the document.
		var uploadCallback =3D function()
		{
			if(callback && callback.timeout){
				window.clearTimeout(oConn._timeOut[o.tId]);
				delete oConn._timeOut[o.tId];
			}

			// Fire global custom event -- completeEvent
			oConn.completeEvent.fire(o);

			if(o.completeEvent){
				// Fire transaction custom event -- completeEvent
				o.completeEvent.fire(o);
			}

			var obj =3D {};
			obj.tId =3D o.tId;
			obj.argument =3D callback.argument;

			try
			{
				// responseText and responseXML will be populated with the same data =
from the iframe.
				// Since the HTTP headers cannot be read from the iframe
				obj.responseText =3D =
io.contentWindow.document.body?io.contentWindow.document.body.innerHTML:i=
o.contentWindow.document.documentElement.textContent;
				obj.responseXML =3D =
io.contentWindow.document.XMLDocument?io.contentWindow.document.XMLDocume=
nt:io.contentWindow.document;
			}
			catch(e){}

			if(callback && callback.upload){
				if(!callback.scope){
					callback.upload(obj);
				}
				else{
					callback.upload.apply(callback.scope, [obj]);
				}
			}

			// Fire global custom event -- uploadEvent
			oConn.uploadEvent.fire(obj);

			if(o.uploadEvent){
				// Fire transaction custom event -- uploadEvent
				o.uploadEvent.fire(obj);
			}

			YAHOO.util.Event.removeListener(io, "load", uploadCallback);

			setTimeout(
				function(){
					document.body.removeChild(io);
					oConn.releaseObject(o);
				}, 100);
		};

		// Bind the onload handler to the iframe to detect the file upload =
response.
		YAHOO.util.Event.addListener(io, "load", uploadCallback);
	},

  /**
   * @description Method to terminate a transaction, if it has not =
reached readyState 4.
   * @method abort
   * @public
   * @static
   * @param {object} o The connection object returned by asyncRequest.
   * @param {object} callback  User-defined callback object.
   * @param {string} isTimeout boolean to indicate if abort resulted =
from a callback timeout.
   * @return {boolean}
   */
	abort:function(o, callback, isTimeout)
	{
		var abortStatus;

		if(o.conn){
			if(this.isCallInProgress(o)){=09
				// Issue abort request=09
				o.conn.abort();
					=09
				window.clearInterval(this._poll[o.tId]);
				delete this._poll[o.tId];
				this._poll.splice(o.tId, 1);

				if(isTimeout){
					window.clearTimeout(this._timeOut[o.tId]);
					delete this._timeOut[o.tId];
					this._timeOut.splice(o.tId, 1);
				}

				abortStatus =3D true;	=09
			}
		}
		else if(o.isUpload =3D=3D=3D true){
			var frameId =3D 'yuiIO' + o.tId;
			var io =3D document.getElementById(frameId);

			if(io){
				// Remove the event listener from the iframe.
				YAHOO.util.Event.removeListener(io, "load", uploadCallback);
				// Destroy the iframe facilitating the transaction.
				document.body.removeChild(io);

				if(isTimeout){
					window.clearTimeout(this._timeOut[o.tId]);
					delete this._timeOut[o.tId];
				}

				abortStatus =3D true;
			}
		}
		else{
			abortStatus =3D false;
		}

		if(abortStatus =3D=3D=3D true){
			// Fire global custom event -- abortEvent
			this.abortEvent.fire(o);

			if(o.abortEvent){
				// Fire transaction custom event -- abortEvent
				o.abortEvent.fire(o);
			}=09

			this.handleTransactionResponse(o, callback, true);
		}

		return abortStatus;
	},

  /**
   * @description Determines if the transaction is still being =
processed.
   * @method isCallInProgress
   * @public
   * @static
   * @param {object} o The connection object returned by asyncRequest
   * @return {boolean}
   */
	isCallInProgress:function(o)
	{
		// if the XHR object assigned to the transaction has not been =
dereferenced,
		// then check its readyState status.  Otherwise, return false.
		if(o && o.conn){
			return o.conn.readyState !=3D=3D 4 && o.conn.readyState !=3D=3D 0;
		}
		else if(o && o.isUpload =3D=3D=3D true){
			var frameId =3D 'yuiIO' + o.tId;
			return document.getElementById(frameId)?true:false;
		}
		else{
			return false;
		}
	},

  /**
   * @description Dereference the XHR instance and the connection object =
after the transaction is completed.
   * @method releaseObject
   * @private
   * @static
   * @param {object} o The connection object
   * @return {void}
   */
	releaseObject:function(o)
	{
		//dereference the XHR instance.
		if(o.conn){
			o.conn =3D null;
		}
		//dereference the connection object.
		o =3D null;
	}
};

YAHOO.register("connection", YAHOO.util.Connect, {version: "2.3.1", =
build: "541"});
------=_NextPart_000_0061_01C82292.502B3E40
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.melindaflynn.com/scripts/flashobject_fp8.js

/**=0A=
 * FlashObject v1.2.3: Flash detection and embed - =
http://blog.deconcept.com/flashobject/=0A=
 *=0A=
 * FlashObject is (c) 2005 Geoff Stearns and is released under the MIT =
License:=0A=
 * http://www.opensource.org/licenses/mit-license.php=0A=
 *=0A=
 */=0A=
if(typeof com =3D=3D "undefined") var com =3D new Object();=0A=
if(typeof com.deconcept =3D=3D "undefined") com.deconcept =3D new =
Object();=0A=
if(typeof com.deconcept.util =3D=3D "undefined") com.deconcept.util =3D =
new Object();=0A=
if(typeof com.deconcept.FlashObjectUtil =3D=3D "undefined") =
com.deconcept.FlashObjectUtil =3D new Object();=0A=
com.deconcept.FlashObject =3D function(swf, id, w, h, ver, c, =
useExpressInstall, quality, redirectUrl, detectKey){=0A=
   this.DETECT_KEY =3D detectKey ? detectKey : 'detectflash';=0A=
   this.skipDetect =3D =
com.deconcept.util.getRequestParameter(this.DETECT_KEY);=0A=
   this.params =3D new Object();=0A=
   this.variables =3D new Object();=0A=
   this.attributes =3D new Array();=0A=
=0A=
   if(swf) this.setAttribute('swf', swf);=0A=
   if(id) this.setAttribute('id', id);=0A=
   if(w) this.setAttribute('width', w);=0A=
   if(h) this.setAttribute('height', h);=0A=
   if(ver) this.setAttribute('version', new =
com.deconcept.PlayerVersion(ver.toString().split(".")));=0A=
   if(c) this.addParam('bgcolor', c);=0A=
   var q =3D quality ? quality : 'high';=0A=
   this.addParam('quality', q);=0A=
   this.setAttribute('redirectUrl', '');=0A=
   if(redirectUrl) this.setAttribute('redirectUrl', redirectUrl);=0A=
   if(useExpressInstall) {=0A=
   // check to see if we need to do an express install=0A=
   var expressInstallReqVer =3D new =
com.deconcept.PlayerVersion([6,0,65]);=0A=
   var installedVer =3D com.deconcept.FlashObjectUtil.getPlayerVersion();=0A=
      if (installedVer.versionIsValid(expressInstallReqVer) && =
!installedVer.versionIsValid(this.getAttribute('version'))) {=0A=
         this.setAttribute('doExpressInstall', true);=0A=
      }=0A=
   } else {=0A=
      this.setAttribute('doExpressInstall', false);=0A=
   }=0A=
}=0A=
com.deconcept.FlashObject.prototype.setAttribute =3D function(name, =
value){=0A=
	this.attributes[name] =3D value;=0A=
}=0A=
com.deconcept.FlashObject.prototype.getAttribute =3D function(name){=0A=
	return this.attributes[name];=0A=
}=0A=
com.deconcept.FlashObject.prototype.getAttributes =3D function(){=0A=
	return this.attributes;=0A=
}=0A=
com.deconcept.FlashObject.prototype.addParam =3D function(name, value){=0A=
	this.params[name] =3D value;=0A=
}=0A=
com.deconcept.FlashObject.prototype.getParams =3D function(){=0A=
	return this.params;=0A=
}=0A=
com.deconcept.FlashObject.prototype.getParam =3D function(name){=0A=
	return this.params[name];=0A=
}=0A=
com.deconcept.FlashObject.prototype.addVariable =3D function(name, =
value){=0A=
	this.variables[name] =3D value;=0A=
}=0A=
com.deconcept.FlashObject.prototype.getVariable =3D function(name){=0A=
	return this.variables[name];=0A=
}=0A=
com.deconcept.FlashObject.prototype.getVariables =3D function(){=0A=
	return this.variables;=0A=
}=0A=
com.deconcept.FlashObject.prototype.getParamTags =3D function(){=0A=
   var paramTags =3D ""; var key; var params =3D this.getParams();=0A=
   for(key in params) {=0A=
        paramTags +=3D '<param name=3D"' + key + '" value=3D"' + =
params[key] + '" />';=0A=
    }=0A=
   return paramTags;=0A=
}=0A=
com.deconcept.FlashObject.prototype.getVariablePairs =3D function(){=0A=
	var variablePairs =3D new Array();=0A=
	var key;=0A=
	var variables =3D this.getVariables();=0A=
	for(key in variables){=0A=
		variablePairs.push(key +"=3D"+ variables[key]);=0A=
	}=0A=
	return variablePairs;=0A=
}=0A=
com.deconcept.FlashObject.prototype.getHTML =3D function() {=0A=
    var flashHTML =3D "";=0A=
    if (navigator.plugins && navigator.mimeTypes && =
navigator.mimeTypes.length) { // netscape plugin architecture=0A=
        if (this.getAttribute("doExpressInstall")) { =
this.addVariable("MMplayerType", "PlugIn"); }=0A=
        flashHTML +=3D '<embed type=3D"application/x-shockwave-flash" =
src=3D"'+ this.getAttribute('swf') +'" width=3D"'+ =
this.getAttribute('width') +'" height=3D"'+ this.getAttribute('height') =
+'" id=3D"'+ this.getAttribute('id') + '" name=3D"'+ =
this.getAttribute('id') +'"';=0A=
		var params =3D this.getParams();=0A=
        for(var key in params){ flashHTML +=3D ' '+ key +'=3D"'+ =
params[key] +'"'; }=0A=
		pairs =3D this.getVariablePairs().join("&");=0A=
        if (pairs.length > 0){ flashHTML +=3D ' flashvars=3D"'+ pairs =
+'"'; }=0A=
        flashHTML +=3D '></embed>';=0A=
    } else { // PC IE=0A=
        if (this.getAttribute("doExpressInstall")) { =
this.addVariable("MMplayerType", "ActiveX"); }=0A=
        flashHTML +=3D '<object =
classid=3D"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width=3D"'+ =
this.getAttribute('width') +'" height=3D"'+ this.getAttribute('height') =
+'" id=3D"'+ this.getAttribute('id') +'">';=0A=
        flashHTML +=3D '<param name=3D"movie" value=3D"' + =
this.getAttribute('swf') + '" />';=0A=
		var tags =3D this.getParamTags();=0A=
        if(tags.length > 0){ flashHTML +=3D tags; }=0A=
		var pairs =3D this.getVariablePairs().join("&");=0A=
        if(pairs.length > 0){ flashHTML +=3D '<param name=3D"flashvars" =
value=3D"'+ pairs +'" />'; }=0A=
        flashHTML +=3D '</object>';=0A=
    }=0A=
    return flashHTML;=0A=
}=0A=
com.deconcept.FlashObject.prototype.write =3D function(elementId){=0A=
	if(this.skipDetect || this.getAttribute('doExpressInstall') || =
com.deconcept.FlashObjectUtil.getPlayerVersion().versionIsValid(this.getA=
ttribute('version'))){=0A=
		if(document.getElementById){=0A=
		   if (this.getAttribute('doExpressInstall')) {=0A=
		      this.addVariable("MMredirectURL", escape(window.location));=0A=
		      document.title =3D document.title.slice(0, 47) + " - Flash =
Player Installation";=0A=
		      this.addVariable("MMdoctitle", document.title);=0A=
		   }=0A=
			document.getElementById(elementId).innerHTML =3D this.getHTML();=0A=
		}=0A=
	}else{=0A=
		if(this.getAttribute('redirectUrl') !=3D "") {=0A=
			document.location.replace(this.getAttribute('redirectUrl'));=0A=
		}=0A=
	}=0A=
}=0A=
/* ---- detection functions ---- */=0A=
com.deconcept.FlashObjectUtil.getPlayerVersion =3D function(){=0A=
   var PlayerVersion =3D new com.deconcept.PlayerVersion(0,0,0);=0A=
	if(navigator.plugins && navigator.mimeTypes.length){=0A=
		var x =3D navigator.plugins["Shockwave Flash"];=0A=
		if(x && x.description) {=0A=
			PlayerVersion =3D new =
com.deconcept.PlayerVersion(x.description.replace(/([a-z]|[A-Z]|\s)+/, =
"").replace(/(\s+r|\s+b[0-9]+)/, ".").split("."));=0A=
		}=0A=
	}else if (window.ActiveXObject){=0A=
	   try {=0A=
   	   var axo =3D new ActiveXObject("ShockwaveFlash.ShockwaveFlash");=0A=
   		PlayerVersion =3D new =
com.deconcept.PlayerVersion(axo.GetVariable("$version").split(" =
")[1].split(","));=0A=
	   } catch (e) {}=0A=
	}=0A=
	return PlayerVersion;=0A=
}=0A=
com.deconcept.PlayerVersion =3D function(arrVersion){=0A=
	this.major =3D parseInt(arrVersion[0]) || 0;=0A=
	this.minor =3D parseInt(arrVersion[1]) || 0;=0A=
	this.rev =3D parseInt(arrVersion[2]) || 0;=0A=
}=0A=
com.deconcept.PlayerVersion.prototype.versionIsValid =3D function(fv){=0A=
	if(this.major < fv.major) return false;=0A=
	if(this.major > fv.major) return true;=0A=
	if(this.minor < fv.minor) return false;=0A=
	if(this.minor > fv.minor) return true;=0A=
	if(this.rev < fv.rev) return false;=0A=
	return true;=0A=
}=0A=
/* ---- get value of query string param ---- */=0A=
com.deconcept.util.getRequestParameter =3D function(param){=0A=
	var q =3D document.location.search || document.location.href.hash;=0A=
	if(q){=0A=
		var startIndex =3D q.indexOf(param +"=3D");=0A=
		var endIndex =3D (q.indexOf("&", startIndex) > -1) ? q.indexOf("&", =
startIndex) : q.length;=0A=
		if (q.length > 1 && startIndex > -1) {=0A=
			return q.substring(q.indexOf("=3D", startIndex)+1, endIndex);=0A=
		}=0A=
	}=0A=
	return "";=0A=
}=0A=
=0A=
/* add Array.push if needed (ie5) */=0A=
if (Array.prototype.push =3D=3D null) { Array.prototype.push =3D =
function(item) { this[this.length] =3D item; return this.length; }}=0A=
=0A=
/* add some aliases for ease of use / backwards compatibility */=0A=
var getQueryParamValue =3D com.deconcept.util.getRequestParameter;=0A=
var FlashObject =3D com.deconcept.FlashObject;=0A=

------=_NextPart_000_0061_01C82292.502B3E40--

