var ms = { events: {}, ui: { actor: {} }, methods: { validate: {} } }; // Setup Namespaces
ms.config = {
    //"storefront": "https://account-ite2.nascar.com/storefront",
    "storefront": "https://account.nascar.com/storefront",
    "raceView": "/checkOfferStep2.do?offerID=104",
    "pitCommand": "/checkOfferStep2.do?offerID=6",
    "scanner": "/checkOfferStep2.do?offerID=1",
    //"api": "http://aud-ite.nascar.com/services/nascar/api",
    "api": "https://secure.audience.nascar.com/services/nascar/api",
    //"memberServices": "http://aud-ite.nascar.com/services/nascar",
    "memberServices": "https://secure.audience.nascar.com/services/nascar/",
    "blank": "/.element/iframe/2.1/sect/emkt/empty.html"
};
html = '';
html += '<!--START HELPERS-->';
html += '<div id="nscrEmktHelpers">';
html += '	<div id="nscrEmktSuccess" class="nscrEmktSuccess"></div>';
html += '	<div id="nscrEmktError" class="nscrEmktRoundBox nscrEmktError">			';
html += '		<span></span>		';
html += '		<div class="nscrEmktCorner nscrEmktBoxTopLeft"></div>';
html += '		<div class="nscrEmktCorner nscrEmktBoxTopRight"></div>';
html += '		<div class="nscrEmktCorner nscrEmktBoxBotLeft"></div>';
html += '		<div class="nscrEmktCorner nscrEmktBoxBotRight"></div>';
html += '		<div class="nscrEmktBoxArrow"></div>';
html += '	</div>';
html += '	<div id="nscrEmktTip" class="nscrEmktRoundBox nscrEmktTip">		';
html += '		<span></span>	';
html += '		<div class="nscrEmktCorner nscrEmktBoxTopLeft"></div>';
html += '		<div class="nscrEmktCorner nscrEmktBoxTopRight"></div>';
html += '		<div class="nscrEmktCorner nscrEmktBoxBotLeft"></div>';
html += '		<div class="nscrEmktCorner nscrEmktBoxBotRight"></div>';
html += '		<div class="nscrEmktBoxArrow"></div>';
html += '	</div>';
html += '</div>			';
html += '<!--END HELPERS-->';
html += '<div id="nscrEmktOverlay" style="display:none;">';
html += '	<div id="nscrEmktOvlyBg">';
html += '		<div id="nscrEmktOvlyOut">';
html += '			<div id="nscrEmktHdrProg" class="nscrEmktHdrProgNMS">';
html += '				<div id="nscrEmktProgLogo" class="nscrEmktProgLogoNMS"></div>';
html += '				<a id="nscrEmktOverlayClose" href="javascript:void(0)" alt="Close" title="Close"></a>';
html += '			</div>';
html += '			<h2 id="nscrEmktTopMsg">Thanks for choosing TrackPass RaceView.</h2>';
html += '			<!--START LOGIN-->';
html += '			<div id="nscrEmktLogin" class="nscrEmktRoundBox nscrEmktBoxGrayBdr">';
html += '				<h2>Log in to NASCAR.COM</h2>';
html += '				<!--Populate below with any global errors-->';
html += '				<p class="nscrEmktGError">&nbsp;</p>';
html += '				<form id="nscrEmktFormLogin" action="#" method="post" onsubmit="return false;">';
html += '					<input id="nscrEmktLoginEmail" type="text" class="nscrEmktInEmail nscrEmktInDefault nscrEmktGlobalInput" name="loginId" />';
html += '					<input id="nscrEmktLoginPassword" type="password" maxlength="30" class="nscrEmktInPwd nscrEmktInDefault nscrEmktGlobalInput" name="password" />';
html += '					<a id="nscrEmktForgotPassword" href="javascript:void(0)" class="nscrEmktInFgtPwd">Forgot password?</a>';
html += '					<input type="checkbox" id="nscrEmktLoginCbox" class="nscrEmktInCbox" />';
html += '					<input type="submit" style="visibility:hidden;" />';
html += '					<label>Remember my email address on this computer.</label>';
html += '					<div id="nscrEmktSubmitO1" class="nscrEmktRoundBox nscrEmktSubmitButton">';
html += '						LOGIN';
html += '						<div class="nscrEmktCorner nscrEmktBoxTopLeft"></div>';
html += '						<div class="nscrEmktCorner nscrEmktBoxTopRight"></div>';
html += '						<div class="nscrEmktCorner nscrEmktBoxBotLeft"></div>';
html += '						<div class="nscrEmktCorner nscrEmktBoxBotRight"></div>';
html += '					</div>';
html += '				</form>';
html += '				<div class="nscrEmktCorner nscrEmktBoxTopLeft"></div>';
html += '				<div class="nscrEmktCorner nscrEmktBoxTopRight"></div>';
html += '				<div class="nscrEmktCorner nscrEmktBoxBotLeft"></div>';
html += '				<div class="nscrEmktCorner nscrEmktBoxBotRight"></div>';
html += '			</div>';
html += '			<!--END LOGIN-->';
html += '			<!--START FORGOT PASSWORD PART 1-->';
html += '			<div id="nscrEmktFPwd1" class="nscrEmktRoundBox nscrEmktBoxGrayBdr">';
html += '				<h2>Oops.  Forgot Your Password?</h2>';
html += '				<!--Populate below with any global errors-->';
html += '				<p class="nscrEmktGError">&nbsp;</p>';
html += '				<p>Enter your e-mail address below and we will send you an e-mail with a link and reset code to reset your password.</p>';
html += '				<form id="nscrEmktFormFpwd1" action="#" method="post" onsubmit="return false;">';
html += '					<input type="text" id="nscrEmktFpwdEmail" class="nscrEmktInEmail nscrEmktInDefault nscrEmktGlobalInput" name="email" value="" />';
html += '					<a href="javascript:void(0)" id="nscrEmktResetCode" class="nscrEmktResetCode">Continue if you already have the reset code.</a>';
html += '					<div id="nscrEmktSubmitO3Back" class="nscrEmktRoundBox nscrEmktSubmitButtonAlt" onclick="">';
html += '						CANCEL';
html += '						<div class="nscrEmktCorner nscrEmktBoxTopLeft"></div>';
html += '						<div class="nscrEmktCorner nscrEmktBoxTopRight"></div>';
html += '						<div class="nscrEmktCorner nscrEmktBoxBotLeft"></div>';
html += '						<div class="nscrEmktCorner nscrEmktBoxBotRight"></div>';
html += '					</div>					';
html += '					<div id="nscrEmktSubmitO3" class="nscrEmktRoundBox nscrEmktSubmitButton">						';
html += '						SUBMIT';
html += '						<div class="nscrEmktCorner nscrEmktBoxTopLeft"></div>';
html += '						<div class="nscrEmktCorner nscrEmktBoxTopRight"></div>';
html += '						<div class="nscrEmktCorner nscrEmktBoxBotLeft"></div>';
html += '						<div class="nscrEmktCorner nscrEmktBoxBotRight"></div>';
html += '					</div>';
html += '				</form>';
html += '				<div class="nscrEmktCorner nscrEmktBoxTopLeft"></div>';
html += '				<div class="nscrEmktCorner nscrEmktBoxTopRight"></div>';
html += '				<div class="nscrEmktCorner nscrEmktBoxBotLeft"></div>';
html += '				<div class="nscrEmktCorner nscrEmktBoxBotRight"></div>';
html += '			</div>';
html += '			<!--END FORGOT PASSWORD PART 1-->';
html += '			<!--START FORGOT PASSWORD PART 2-->';
html += '			<div id="nscrEmktFPwd2" class="nscrEmktRoundBox nscrEmktBoxGrayBdr">';
html += '				<h2>Password Selection</h2>';
html += '				<!--Populate below with any global errors-->';
html += '				<p class="nscrEmktGError">&nbsp;</p>';
html += '				<form id="nscrEmktFormFpwd2">';
html += '					<input type="text" id="nscrEmktFpwd2Email" class="nscrEmktInEmail nscrEmktInDefault nscrEmktGlobalInput" name="email" value="" />';
html += '					<input type="text" id="nscrEmktFpwd2RCode" class="nscrEmktResetCode nscrEmktInDefault nscrEmktGlobalInput" name="resetCode" value="" />';
html += '					<input type="password" id="nscrEmktFpwd2Pwd" class="nscrEmktInPwd nscrEmktInDefault nscrEmktGlobalInput" name="email" value="" />';
html += '					<input type="password" id="nscrEmktFpwd2Cpwd" class="nscrEmktInCpwd nscrEmktInDefault nscrEmktGlobalInput" name="email" value="" />';
html += '					<div id="nscrEmktSubmitO4Back" class="nscrEmktRoundBox nscrEmktSubmitButtonAlt" onclick="">';
html += '						CANCEL';
html += '						<div class="nscrEmktCorner nscrEmktBoxTopLeft"></div>';
html += '						<div class="nscrEmktCorner nscrEmktBoxTopRight"></div>';
html += '						<div class="nscrEmktCorner nscrEmktBoxBotLeft"></div>';
html += '						<div class="nscrEmktCorner nscrEmktBoxBotRight"></div>';
html += '					</div>					';
html += '					<div id="nscrEmktSubmitO4" class="nscrEmktRoundBox nscrEmktSubmitButton" style="">						';
html += '						SUBMIT';
html += '						<div class="nscrEmktCorner nscrEmktBoxTopLeft"></div>';
html += '						<div class="nscrEmktCorner nscrEmktBoxTopRight"></div>';
html += '						<div class="nscrEmktCorner nscrEmktBoxBotLeft"></div>';
html += '						<div class="nscrEmktCorner nscrEmktBoxBotRight"></div>';
html += '					</div>';
html += '				</form>';
html += '				<div class="nscrEmktCorner nscrEmktBoxTopLeft"></div>';
html += '				<div class="nscrEmktCorner nscrEmktBoxTopRight"></div>';
html += '				<div class="nscrEmktCorner nscrEmktBoxBotLeft"></div>';
html += '				<div class="nscrEmktCorner nscrEmktBoxBotRight"></div>';
html += '			</div>';
html += '			<!--END FORGOT PASSWORD PART 2-->';
html += '			<div id="nscrEmktOrCol"></div>';
html += '			<!--START SIGNUP-->';
html += '			<div id="nscrEmktSignUp" class="nscrEmktRoundBox nscrEmktBoxGrayBdr">';
html += '				<h2>I am new to NASCAR.COM. Sign me up!</h2>';
html += '				<!--Populate below with any global errors-->';
html += '				<p class="nscrEmktGError">&nbsp;</p>';
html += '				<form id="nscrEmktFormSignUp">';
html += '					<input type="text" id="nscrEmktSupFname" class="nscrEmktFname nscrEmktInDefault nscrEmktGlobalInput" name="firstname" value="" />';
html += '					<input type="text" id="nscrEmktSupLname" class="nscrEmktLname nscrEmktInDefault nscrEmktGlobalInput" name="lastname" value="" />';
html += '					<input type="text" id="nscrEmktSupDname" class="nscrEmktDname nscrEmktInDefault nscrEmktGlobalInput" name="displayName" value="" maxlength="12" />';
html += '					<input type="text" id="nscrEmktSupEmail" class="nscrEmktInEmail nscrEmktInDefault nscrEmktGlobalInput" name="email" value="" />';
html += '					<input type="password" id="nscrEmktSupPwd" maxlength="30" class="nscrEmktInPwd nscrEmktInDefault nscrEmktGlobalInput" name="password" value="" onkeyup="runPassword(this.value, \'mypassword\');" />';
html += '					<div id="nscrEmktpwdMeter">Strength:</div>';
html += '					<div id="nscrEmktpwdMeterBar"><div id="mypassword_bar"></div></div>';
html += '					<div id="mypassword_text"></div>';
html += '					<input type="password" id="nscrEmktSupCPwd" maxlength="30" class="nscrEmktInCpwd nscrEmktInDefault nscrEmktGlobalInput" name="passwordConfirmation" value="" />';
html += '					<h5>Your Birthday:</h5>';
html += '					<select name="monthOfBirth" id="nscrEmktDobM">';
html += '						<option selected="selected" value="">Month</option><option value="January"> January </option><option value="February"> February </option><option value="March"> March </option><option value="April"> April </option><option value="May"> May </option><option value="June"> June </option><option value="July"> July </option><option value="August"> August </option><option value="September"> September </option><option value="October"> October </option><option value="November"> November </option><option value="December"> December </option>';
html += '					</select>';
html += '					<select name="dayOfBirth" id="nscrEmktDobD">';
html += '						<option selected="selected" value="">Day</option><option value="1"> 1 </option><option value="2"> 2 </option><option value="3"> 3 </option><option value="4"> 4 </option><option value="5"> 5 </option><option value="6"> 6 </option><option value="7"> 7 </option><option value="8"> 8 </option><option value="9"> 9 </option><option value="10"> 10 </option><option value="11"> 11 </option><option value="12"> 12 </option><option value="13"> 13 </option><option value="14"> 14 </option><option value="15"> 15 </option><option value="16"> 16 </option><option value="17"> 17 </option><option value="18"> 18 </option><option value="19"> 19 </option><option value="20"> 20 </option><option value="21"> 21 </option><option value="22"> 22 </option><option value="23"> 23 </option><option value="24"> 24 </option><option value="25"> 25 </option><option value="26"> 26 </option><option value="27"> 27 </option><option value="28"> 28 </option><option value="29"> 29 </option><option value="30"> 30 </option><option value="31"> 31 </option>';
html += '					</select>';
html += '					<select name="yearOfBirth" id="nscrEmktDobY">';
html += '						<option selected="selected" value="">Year</option><option value="1996"> 1996 </option><option value="1995"> 1995 </option><option value="1994"> 1994 </option><option value="1993"> 1993 </option><option value="1992"> 1992 </option><option value="1991"> 1991 </option><option value="1990"> 1990 </option><option value="1989"> 1989 </option><option value="1988"> 1988 </option><option value="1987"> 1987 </option><option value="1986"> 1986 </option><option value="1985"> 1985 </option><option value="1984"> 1984 </option><option value="1983"> 1983 </option><option value="1982"> 1982 </option><option value="1981"> 1981 </option><option value="1980"> 1980 </option><option value="1979"> 1979 </option><option value="1978"> 1978 </option><option value="1977"> 1977 </option><option value="1976"> 1976 </option><option value="1975"> 1975 </option><option value="1974"> 1974 </option><option value="1973"> 1973 </option><option value="1972"> 1972 </option><option value="1971"> 1971 </option><option value="1970"> 1970 </option><option value="1969"> 1969 </option><option value="1968"> 1968 </option><option value="1967"> 1967 </option><option value="1966"> 1966 </option><option value="1965"> 1965 </option><option value="1964"> 1964 </option><option value="1963"> 1963 </option><option value="1962"> 1962 </option><option value="1961"> 1961 </option><option value="1960"> 1960 </option><option value="1959"> 1959 </option><option value="1958"> 1958 </option><option value="1957"> 1957 </option><option value="1956"> 1956 </option><option value="1955"> 1955 </option><option value="1954"> 1954 </option><option value="1953"> 1953 </option><option value="1952"> 1952 </option><option value="1951"> 1951 </option><option value="1950"> 1950 </option><option value="1949"> 1949 </option><option value="1948"> 1948 </option><option value="1947"> 1947 </option><option value="1946"> 1946 </option><option value="1945"> 1945 </option><option value="1944"> 1944 </option><option value="1943"> 1943 </option><option value="1942"> 1942 </option><option value="1941"> 1941 </option><option value="1940"> 1940 </option><option value="1939"> 1939 </option><option value="1938"> 1938 </option><option value="1937"> 1937 </option><option value="1936"> 1936 </option><option value="1935"> 1935 </option><option value="1934"> 1934 </option><option value="1933"> 1933 </option><option value="1932"> 1932 </option><option value="1931"> 1931 </option><option value="1930"> 1930 </option><option value="1929"> 1929 </option><option value="1928"> 1928 </option><option value="1927"> 1927 </option><option value="1926"> 1926 </option><option value="1925"> 1925 </option><option value="1924"> 1924 </option><option value="1923"> 1923 </option><option value="1922"> 1922 </option><option value="1921"> 1921 </option><option value="1920"> 1920 </option><option value="1919"> 1919 </option><option value="1918"> 1918 </option><option value="1917"> 1917 </option><option value="1916"> 1916 </option><option value="1915"> 1915 </option><option value="1914"> 1914 </option><option value="1913"> 1913 </option><option value="1912"> 1912 </option><option value="1911"> 1911 </option><option value="1910"> 1910 </option><option value="1909"> 1909 </option><option value="1908"> 1908 </option><option value="1907"> 1907 </option><option value="1906"> 1906 </option><option value="1905"> 1905 </option><option value="1904"> 1904 </option><option value="1903"> 1903 </option><option value="1902"> 1902 </option><option value="1901"> 1901 </option><option value="1900"> 1900 </option>';
html += '					</select>';
html += '					<select name="favoriteDriver" id="nscrEmktFdriver">';
html += '						<option selected="selected" value="">Favorite Driver</option><option value="Allmendinger, A.J."> Allmendinger, A.J. </option><option value="Ambrose, Marcos"> Ambrose, Marcos </option><option value="Andretti, John"> Andretti, John </option><option value="Benson, Johnny"> Benson, Johnny </option><option value="Biffle, Greg"> Biffle, Greg </option><option value="Bires, Kelly"> Bires, Kelly </option><option value="Blaney, Dave"> Blaney, Dave </option><option value="Bliss, Mike"> Bliss, Mike </option><option value="Bodine, Todd"> Bodine, Todd </option><option value="Bowyer, Clint"> Bowyer, Clint </option><option value="Burton, Jeff"> Burton, Jeff </option><option value="Burton, Ward"> Burton, Ward </option><option value="Busch, Kurt"> Busch, Kurt </option><option value="Busch, Kyle"> Busch, Kyle </option><option value="Cook, Terry"> Cook, Terry </option><option value="Crawford, Rick"> Crawford, Rick </option><option value="Earnhardt Jr., Dale"> Earnhardt Jr., Dale </option><option value="Edwards, Carl"> Edwards, Carl </option><option value="Elliott, Bill"> Elliott, Bill </option><option value="Gilliland, David"> Gilliland, David </option><option value="Gordon, Jeff"> Gordon, Jeff </option><option value="Gordon, Robby"> Gordon, Robby </option><option value="Green, David"> Green, David </option><option value="Green, Jeff"> Green, Jeff </option><option value="Hamilton Jr., Bobby"> Hamilton Jr., Bobby </option><option value="Hamlin, Denny"> Hamlin, Denny </option><option value="Harvick, Kevin"> Harvick, Kevin </option><option value="Hornaday, Ron"> Hornaday, Ron </option><option value="Hornish Jr., Sam"> Hornish Jr., Sam </option><option value="Jarrett, Dale"> Jarrett, Dale </option><option value="Johnson, Jimmie"> Johnson, Jimmie </option><option value="Kahne, Kasey"> Kahne, Kasey </option><option value="Keselowski, Brad"> Keselowski, Brad </option><option value="Kenseth, Matt"> Kenseth, Matt </option><option value="Kvapil, Travis"> Kvapil, Travis </option><option value="Labonte, Bobby"> Labonte, Bobby </option><option value="Lepage, Kevin"> Lepage, Kevin </option><option value="Logano, Joey"> Logano, joey </option><option value="Marlin, Sterling"> Marlin, Sterling </option><option value="Martin, Mark"> Martin, Mark </option><option value="Mayfield, Jeremy"> Jeremy Mayfield</option><option value="McMurray, Jamie"> McMurray, Jamie </option><option value="Mears, Casey"> Mears, Casey </option><option value="Menard, Paul"> Menard, Paul </option><option value="Montoya, Juan"> Montoya, Juan </option><option value="Nemechek, Joe"> Nemechek, Joe </option><option value="Newman, Ryan"> Newman, Ryan </option><option value="Petty, Kyle"> Petty, Kyle </option><option value="Ragan, David"> Ragan, David </option><option value="Reutimann, David"> Reutimann, David </option><option value="Riggs, Scott"> Riggs, Scott </option><option value="Rudd, Ricky"> Rudd, Ricky </option><option value="Sadler, Elliott"> Sadler, Elliott </option><option value="Said, Boris"> Said, Boris </option><option value="Sauter, Johnny"> Sauter, Johnny </option><option value="Schrader, Ken"> Schrader, Ken </option><option value="Shepherd, Morgan"> Shepherd, Morgan </option><option value="Skinner, Mike"> Skinner, Mike </option><option value="Smith, Regan"> Smith, Regan </option><option value="Sorenson, Reed"> Sorenson, Reed </option><option value="Starr, David"> Starr, David </option><option value="Stewart, Tony"> Stewart, Tony </option><option value="Stremme, David"> Stremme, David </option><option value="Truex Jr., Martin"> Truex Jr., Martin </option><option value="Vickers, Brian"> Vickers, Brian </option><option value="Wallace, Kenny"> Wallace, Kenny </option><option value="Wallace, Mike"> Wallace, Mike </option><option value="Waltrip, Michael"> Waltrip, Michael </option><option value="Wimmer, Scott"> Wimmer, Scott </option><option value="Yeley, J.J."> Yeley, J.J. </option><option value="No Preference"> No Preference </option><option value="Other"> Other </option>';
html += '					</select>';
html += '					<input name="legal" value="domestic_version" type="checkbox" id="nscrEmktSupCboxPP" class="nscrEmktInCbox nscrEmktInCboxPP" />';
html += '					<label for="legal" class="nscrEmktInCboxPP" >I have read and agree with the NASCAR.COM <a href="http://nascar.com/guides/privacy/"  target="_blank">Privacy Policy</a></label>';
html += '					<input type="checkbox" id="nscrEmktSupCboxProm" class="nscrEmktInCbox nscrEmktInCboxProm" checked="checked" name="newsletter" value="nascar_ms_optin_checked"/>';
html += '					<label class="nscrEmktInCboxProm">Yes, I want to receive information from NASCAR.COM regarding future promotions, products or services.</label>';
html += '					<input type="checkbox" id="nscrEmktSupCboxPart" class="nscrEmktInCbox nscrEmktInCboxPart" checked="checked" name="newsletter" value="marketing-nascar-nmr_checked"/>';
html += '					<label class="nscrEmktInCboxPart" >Yes, I want to receive information from NASCAR.COM about partner offers.</label>';
html += '					<input type="submit" style="visibility:hidden;" />';
html += '					<div id="nscrEmktSubmitO2" class="nscrEmktRoundBox nscrEmktSubmitButton">';
html += '						SUBMIT';
html += '						<div class="nscrEmktCorner nscrEmktBoxTopLeft"></div>';
html += '						<div class="nscrEmktCorner nscrEmktBoxTopRight"></div>';
html += '						<div class="nscrEmktCorner nscrEmktBoxBotLeft"></div>';
html += '						<div class="nscrEmktCorner nscrEmktBoxBotRight"></div>';
html += '					</div>';
html += '					<a href="http://www.nascar.com/guides/terms/" class="nscrEmktBtnLnk" target="_blank">Terms of Use</a>';
html += '					<div id="nscrEmktTipPopDob">&nbsp;</div>';
html += '					<div id="nscrEmktTipPopFdriver"></div>';
html += '				</form>';
html += '				<div class="nscrEmktCorner nscrEmktBoxTopLeft"></div>';
html += '				<div class="nscrEmktCorner nscrEmktBoxTopRight"></div>';
html += '				<div class="nscrEmktCorner nscrEmktBoxBotLeft"></div>';
html += '				<div class="nscrEmktCorner nscrEmktBoxBotRight"></div>';
html += '			</div>';
html += '			<!--END SIGNUP-->';
html += '			<!--START PROMOTIONS COLUMN-->';
html += '			<div id="nscrEmktPromoCol">';
html += '				<div id="nscrEmktDriverPromo"></div>';
html += '				<div id="nscrEmktBulletsRaceView" class="nscrEmktRoundBox nscrEmktBoxGrayBdr nscrEmktRvFeatures" style="display:none;">';
html += '					<h2>RaceView Features</h2>';
html += '					<ul>';
html += '						<li>Watch your favorite driver LIVE with 3 virtual camera angles</li>';
html += '						<li>Listen to all 43 drivers, radio broadcast, and NASCAR Officials</li>';
html += '						<li>Get real-time race stats, points, speeds, and times</li>';
html += '						<li>Includes PitCommand and Scanner FREE</li>';
html += '					</ul>';
html += '					<div class="nscrEmktCorner nscrEmktBoxTopLeft"></div>';
html += '					<div class="nscrEmktCorner nscrEmktBoxTopRight"></div>';
html += '					<div class="nscrEmktCorner nscrEmktBoxBotLeft"></div>';
html += '					<div class="nscrEmktCorner nscrEmktBoxBotRight"></div>';
html += '				</div>';
html += '				<div id="nscrEmktBulletsPitCommand" class="nscrEmktRoundBox nscrEmktBoxGrayBdr nscrEmktPcFeatures" style="display:none;">';
html += '					<h2>PitCommand Features</h2>';
html += '					<ul>';
html += '						<li>Follow NASCAR Sprint Cup races and qualifying</li>';
html += '						<li>Listen to all 43 drivers, radio broadcast, and NASCAR Officials</li>';
html += '						<li>Get real-time race stats, points, speed, and timing</li>';
html += '						<li>Includes Scanner FREE</li>';
html += '					</ul>';
html += '					<div class="nscrEmktCorner nscrEmktBoxTopLeft"></div>';
html += '					<div class="nscrEmktCorner nscrEmktBoxTopRight"></div>';
html += '					<div class="nscrEmktCorner nscrEmktBoxBotLeft"></div>';
html += '					<div class="nscrEmktCorner nscrEmktBoxBotRight"></div>';
html += '				</div>';
html += '				<div id="nscrEmktBulletsScanner" class="nscrEmktRoundBox nscrEmktBoxGrayBdr nscrEmktScFeatures">';
html += '					<h2>Scanner Features</h2>';
html += '					<ul>';
html += '						<li>Listen to all 43 drivers in-car audio</li>';
html += '						<li>Listen to the NASCAR Officials</li>';
html += '						<li>Hear teams discuss strategy and performance</li>';
html += '					</ul>';
html += '					<div class="nscrEmktCorner nscrEmktBoxTopLeft"></div>';
html += '					<div class="nscrEmktCorner nscrEmktBoxTopRight"></div>';
html += '					<div class="nscrEmktCorner nscrEmktBoxBotLeft"></div>';
html += '					<div class="nscrEmktCorner nscrEmktBoxBotRight"></div>';
html += '				</div>';
html += '				<div id="nscrEmktBulletsCommunity" class="nscrEmktRoundBox nscrEmktBoxGrayBdr nscrEmktComFeatures" style="display:none;">';
html += '					<h2>Community Features</h2>';
html += '					<ul>';
html += '						<li>Listen to all 43 drivers in-car audio</li>';
html += '						<li>Listen to the NASCAR Officials</li>';
html += '						<li>Hear teams discuss strategy and performance</li>';
html += '					</ul>';
html += '					<div class="nscrEmktCorner nscrEmktBoxTopLeft"></div>';
html += '					<div class="nscrEmktCorner nscrEmktBoxTopRight"></div>';
html += '					<div class="nscrEmktCorner nscrEmktBoxBotLeft"></div>';
html += '					<div class="nscrEmktCorner nscrEmktBoxBotRight"></div>';
html += '				</div>';
html += '			</div>';
html += '			<!--END PROMOTIONS COLUMN-->';
html += '		</div><!--END nscrEmktOvlyOut-->';
html += '	</div><!--END nscrEmktOvlyBg-->';
html += '</div><!--END nscrEmktOverlay-->';
document.write(html);
delete html;
/*
 * jQuery JavaScript Library v1.3.2
 * http://jquery.com/
 *
 * Copyright (c) 2009 John Resig
 * Dual licensed under the MIT and GPL licenses.
 * http://docs.jquery.com/License
 *
 * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
 * Revision: 6246
 */
(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F<J;F++){var G=M[F];if(G.selected){K=o(G).val();if(H){return K}L.push(K)}}return L}return(E.value||"").replace(/\r/g,"")}return g}if(typeof K==="number"){K+=""}return this.each(function(){if(this.nodeType!=1){return}if(o.isArray(K)&&/radio|checkbox/.test(this.type)){this.checked=(o.inArray(this.value,K)>=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G<E;G++){L.call(K(this[G],H),this.length>1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H<I;H++){if((G=arguments[H])!=null){for(var F in G){var K=J[F],L=G[F];if(J===L){continue}if(E&&L&&typeof L==="object"&&!L.nodeType){J[F]=o.extend(E,K||(L.length!=null?[]:{}),L)}else{if(L!==g){J[F]=L}}}}}return J};var b=/z-?index|font-?weight|opacity|zoom|line-?height/i,q=document.defaultView||{},s=Object.prototype.toString;o.extend({noConflict:function(E){l.$=p;if(E){l.jQuery=y}return o},isFunction:function(E){return s.call(E)==="[object Function]"},isArray:function(E){return s.call(E)==="[object Array]"},isXMLDoc:function(E){return E.nodeType===9&&E.documentElement.nodeName!=="HTML"||!!E.ownerDocument&&o.isXMLDoc(E.ownerDocument)},globalEval:function(G){if(G&&/\S/.test(G)){var F=document.getElementsByTagName("head")[0]||document.documentElement,E=document.createElement("script");E.type="text/javascript";if(o.support.scriptEval){E.appendChild(document.createTextNode(G))}else{E.text=G}F.insertBefore(E,F.firstChild);F.removeChild(E)}},nodeName:function(F,E){return F.nodeName&&F.nodeName.toUpperCase()==E.toUpperCase()},each:function(G,K,F){var E,H=0,I=G.length;if(F){if(I===g){for(E in G){if(K.apply(G[E],F)===false){break}}}else{for(;H<I;){if(K.apply(G[H++],F)===false){break}}}}else{if(I===g){for(E in G){if(K.call(G[E],E,G[E])===false){break}}}else{for(var J=G[0];H<I&&K.call(J,H,J)!==false;J=G[++H]){}}}return G},prop:function(H,I,G,F,E){if(o.isFunction(I)){I=I.call(H,F)}return typeof I==="number"&&G=="curCSS"&&!b.test(E)?I+"px":I},className:{add:function(E,F){o.each((F||"").split(/\s+/),function(G,H){if(E.nodeType==1&&!o.className.has(E.className,H)){E.className+=(E.className?" ":"")+H}})},remove:function(E,F){if(E.nodeType==1){E.className=F!==g?o.grep(E.className.split(/\s+/),function(G){return !o.className.has(F,G)}).join(" "):""}},has:function(F,E){return F&&o.inArray(E,(F.className||F).toString().split(/\s+/))>-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+"></"+T+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!O.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!O.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!O.indexOf("<td")||!O.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!O.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||!o.support.htmlSerialize&&[1,"div<div>","</div>"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/<tbody/i.test(S),N=!O.indexOf("<table")&&!R?L.firstChild&&L.firstChild.childNodes:Q[1]=="<table>"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E<F;E++){if(H[E]===G){return E}}return -1},merge:function(H,E){var F=0,G,I=H.length;if(!o.support.getAll){while((G=E[F++])!=null){if(G.nodeType!=8){H[I++]=G}}}else{while((G=E[F++])!=null){H[I++]=G}}return H},unique:function(K){var F=[],E={};try{for(var G=0,H=K.length;G<H;G++){var J=o.data(K[G]);if(!E[J]){E[J]=true;F.push(K[G])}}}catch(I){F=K}return F},grep:function(F,J,E){var G=[];for(var H=0,I=F.length;H<I;H++){if(!E!=!J(F[H],H)){G.push(F[H])}}return G},map:function(E,J){var F=[];for(var G=0,H=E.length;G<H;G++){var I=J(E[G],G);if(I!=null){F[F.length]=I}}return F.concat.apply([],F)}});var C=navigator.userAgent.toLowerCase();o.browser={version:(C.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,"0"])[1],safari:/webkit/.test(C),opera:/opera/.test(C),msie:/msie/.test(C)&&!/opera/.test(C),mozilla:/mozilla/.test(C)&&!/(compatible|webkit)/.test(C)};o.each({parent:function(E){return E.parentNode},parents:function(E){return o.dir(E,"parentNode")},next:function(E){return o.nth(E,2,"nextSibling")},prev:function(E){return o.nth(E,2,"previousSibling")},nextAll:function(E){return o.dir(E,"nextSibling")},prevAll:function(E){return o.dir(E,"previousSibling")},siblings:function(E){return o.sibling(E.parentNode.firstChild,E)},children:function(E){return o.sibling(E.firstChild)},contents:function(E){return o.nodeName(E,"iframe")?E.contentDocument||E.contentWindow.document:o.makeArray(E.childNodes)}},function(E,F){o.fn[E]=function(G){var H=o.map(this,F);if(G&&typeof G=="string"){H=o.multiFilter(G,H)}return this.pushStack(o.unique(H),E,G)}});o.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(E,F){o.fn[E]=function(G){var J=[],L=o(G);for(var K=0,H=L.length;K<H;K++){var I=(K>0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}});
/*
 * Sizzle CSS Selector Engine - v0.9.3
 *  Copyright 2009, The Dojo Foundation
 *  Released under the MIT, BSD, and GPL Licenses.
 *  More information: http://sizzlejs.com/
 */
(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa<ab.length;aa++){if(ab[aa]===ab[aa-1]){ab.splice(aa--,1)}}}}}return ab};F.matches=function(T,U){return F(T,null,null,U)};F.find=function(aa,T,ab){var Z,X;if(!aa){return[]}for(var W=0,V=I.order.length;W<V;W++){var Y=I.order[W],X;if((X=I.match[Y].exec(aa))){var U=RegExp.leftContext;if(U.substr(U.length-1)!=="\\"){X[1]=(X[1]||"").replace(/\\/g,"");Z=I.find[Y](X,T,ab);if(Z!=null){aa=aa.replace(I.match[Y],"");break}}}}if(!Z){Z=T.getElementsByTagName("*")}return{set:Z,expr:aa}};F.filter=function(ad,ac,ag,W){var V=ad,ai=[],aa=ac,Y,T,Z=ac&&ac[0]&&Q(ac[0]);while(ad&&ac.length){for(var ab in I.filter){if((Y=I.match[ab].exec(ad))!=null){var U=I.filter[ab],ah,af;T=false;if(aa==ai){ai=[]}if(I.preFilter[ab]){Y=I.preFilter[ab](Y,aa,ag,ai,W,Z);if(!Y){T=ah=true}else{if(Y===true){continue}}}if(Y){for(var X=0;(af=aa[X])!=null;X++){if(af){ah=U(af,Y,X,aa);var ae=W^!!ah;if(ag&&ah!=null){if(ae){T=true}else{aa[X]=false}}else{if(ae){ai.push(af);T=true}}}}}if(ah!==g){if(!ag){aa=ai}ad=ad.replace(I.match[ab],"");if(!T){return[]}break}}}if(ad==V){if(T==null){throw"Syntax error, unrecognized expression: "+ad}else{break}}V=ad}return aa};var I=F.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(T){return T.getAttribute("href")}},relative:{"+":function(aa,T,Z){var X=typeof T==="string",ab=X&&!/\W/.test(T),Y=X&&!ab;if(ab&&!Z){T=T.toUpperCase()}for(var W=0,V=aa.length,U;W<V;W++){if((U=aa[W])){while((U=U.previousSibling)&&U.nodeType!==1){}aa[W]=Y||U&&U.nodeName===T?U||false:U===T}}if(Y){F.filter(T,aa,true)}},">":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){var W=Y.parentNode;Z[V]=W.nodeName===U?W:false}}}else{for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){Z[V]=X?Y.parentNode:Y.parentNode===U}}if(X){F.filter(U,Z,true)}}},"":function(W,U,Y){var V=L++,T=S;if(!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("parentNode",U,V,W,X,Y)},"~":function(W,U,Y){var V=L++,T=S;if(typeof U==="string"&&!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("previousSibling",U,V,W,X,Y)}},find:{ID:function(U,V,W){if(typeof V.getElementById!=="undefined"&&!W){var T=V.getElementById(U[1]);return T?[T]:[]}},NAME:function(V,Y,Z){if(typeof Y.getElementsByName!=="undefined"){var U=[],X=Y.getElementsByName(V[1]);for(var W=0,T=X.length;W<T;W++){if(X[W].getAttribute("name")===V[1]){U.push(X[W])}}return U.length===0?null:U}},TAG:function(T,U){return U.getElementsByTagName(T[1])}},preFilter:{CLASS:function(W,U,V,T,Z,aa){W=" "+W[1].replace(/\\/g,"")+" ";if(aa){return W}for(var X=0,Y;(Y=U[X])!=null;X++){if(Y){if(Z^(Y.className&&(" "+Y.className+" ").indexOf(W)>=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return U<T[3]-0},gt:function(V,U,T){return U>T[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W<T;W++){if(Y[W]===Z){return false}}return true}}}},CHILD:function(T,W){var Z=W[1],U=T;switch(Z){case"only":case"first":while(U=U.previousSibling){if(U.nodeType===1){return false}}if(Z=="first"){return true}U=T;case"last":while(U=U.nextSibling){if(U.nodeType===1){return false}}return true;case"nth":var V=W[2],ac=W[3];if(V==1&&ac==0){return true}var Y=W[0],ab=T.parentNode;if(ab&&(ab.sizcache!==Y||!T.nodeIndex)){var X=0;for(U=ab.firstChild;U;U=U.nextSibling){if(U.nodeType===1){U.nodeIndex=++X}}ab.sizcache=Y}var aa=T.nodeIndex-ac;if(V==0){return aa==0}else{return(aa%V==0&&aa/V>=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V<T;V++){U.push(X[V])}}else{for(var V=0;X[V];V++){U.push(X[V])}}}return U}}var G;if(document.documentElement.compareDocumentPosition){G=function(U,T){var V=U.compareDocumentPosition(T)&4?-1:U===T?0:1;if(V===0){hasDuplicate=true}return V}}else{if("sourceIndex" in document.documentElement){G=function(U,T){var V=U.sourceIndex-T.sourceIndex;if(V===0){hasDuplicate=true}return V}}else{if(document.createRange){G=function(W,U){var V=W.ownerDocument.createRange(),T=U.ownerDocument.createRange();V.selectNode(W);V.collapse(true);T.selectNode(U);T.collapse(true);var X=V.compareBoundaryPoints(Range.START_TO_END,T);if(X===0){hasDuplicate=true}return X}}}}(function(){var U=document.createElement("form"),V="script"+(new Date).getTime();U.innerHTML="<input name='"+V+"'/>";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="<a href='#'></a>";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="<p class='TEST'></p>";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="<div class='test e'></div><div class='test'></div>";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1&&!ac){T.sizcache=Y;T.sizset=W}if(T.nodeName===Z){X=T;break}T=T[U]}ad[W]=X}}}function S(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1){if(!ac){T.sizcache=Y;T.sizset=W}if(typeof Z!=="string"){if(T===Z){X=true;break}}else{if(F.filter(Z,[T]).length>0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z<U;Z++){F(T,V[Z],W)}return F.filter(X,W)};o.find=F;o.filter=F.filter;o.expr=F.selectors;o.expr[":"]=o.expr.filters;F.selectors.filters.hidden=function(T){return T.offsetWidth===0||T.offsetHeight===0};F.selectors.filters.visible=function(T){return T.offsetWidth>0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0){I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F<E.length){o.event.proxy(G,E[F++])}return this.click(o.event.proxy(G,function(H){this.lastToggle=(this.lastToggle||0)%F;H.preventDefault();return E[this.lastToggle++].apply(this,arguments)||false}))},hover:function(E,F){return this.mouseenter(E).mouseleave(F)},ready:function(E){B();if(o.isReady){E.call(document,o)}else{o.readyList.push(E)}return this},live:function(G,F){var E=o.event.proxy(F);E.guid+=this.selector+G;o(document).bind(i(G,this.selector),this.selector,E);return this},die:function(F,E){o(document).unbind(i(F,this.selector),E?{guid:E.guid+this.selector+F}:null);return this}});function c(H){var E=RegExp("(^|\\.)"+H.type+"(\\.|$)"),G=true,F=[];o.each(o.data(this,"events").live||[],function(I,J){if(E.test(J.type)){var K=o(H.target).closest(J.data)[0];if(K){F.push({elem:K,fn:J})}}});F.sort(function(J,I){return o.data(J.elem,"closest")-o.data(I.elem,"closest")});o.each(F,function(){if(this.fn.call(this.elem,H,this.fn.data)===false){return(G=false)}});return G}function i(F,E){return["live",F,E.replace(/\./g,"`").replace(/ /g,"|")].join(".")}o.extend({isReady:false,readyList:[],ready:function(){if(!o.isReady){o.isReady=true;if(o.readyList){o.each(o.readyList,function(){this.call(document,o)});o.readyList=null}o(document).triggerHandler("ready")}}});var x=false;function B(){if(x){return}x=true;if(document.addEventListener){document.addEventListener("DOMContentLoaded",function(){document.removeEventListener("DOMContentLoaded",arguments.callee,false);o.ready()},false)}else{if(document.attachEvent){document.attachEvent("onreadystatechange",function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",arguments.callee);o.ready()}});if(document.documentElement.doScroll&&l==l.top){(function(){if(o.isReady){return}try{document.documentElement.doScroll("left")}catch(E){setTimeout(arguments.callee,0);return}o.ready()})()}}}o.event.add(l,"load",o.ready)}o.each(("blur,focus,load,resize,scroll,unload,click,dblclick,mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,change,select,submit,keydown,keypress,keyup,error").split(","),function(F,E){o.fn[E]=function(G){return G?this.bind(E,G):this.trigger(E)}});o(l).bind("unload",function(){for(var E in o.cache){if(E!=1&&o.cache[E].handle){o.event.remove(o.cache[E].handle.elem)}}});(function(){o.support={};var F=document.documentElement,G=document.createElement("script"),K=document.createElement("div"),J="script"+(new Date).getTime();K.style.display="none";K.innerHTML='   <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';var H=K.getElementsByTagName("*"),E=K.getElementsByTagName("a")[0];if(!H||!H.length||!E){return}o.support={leadingWhitespace:K.firstChild.nodeType==3,tbody:!K.getElementsByTagName("tbody").length,objectAll:!!K.getElementsByTagName("object")[0].getElementsByTagName("*").length,htmlSerialize:!!K.getElementsByTagName("link").length,style:/red/.test(E.getAttribute("style")),hrefNormalized:E.getAttribute("href")==="/a",opacity:E.style.opacity==="0.5",cssFloat:!!E.style.cssFloat,scriptEval:false,noCloneEvent:true,boxModel:null};G.type="text/javascript";try{G.appendChild(document.createTextNode("window."+J+"=1;"))}catch(I){}F.insertBefore(G,F.firstChild);if(l[J]){o.support.scriptEval=true;delete l[J]}F.removeChild(G);if(K.attachEvent&&K.fireEvent){K.attachEvent("onclick",function(){o.support.noCloneEvent=false;K.detachEvent("onclick",arguments.callee)});K.cloneNode(true).fireEvent("onclick")}o(function(){var L=document.createElement("div");L.style.width=L.style.paddingLeft="1px";document.body.appendChild(L);o.boxModel=o.support.boxModel=L.offsetWidth===2;document.body.removeChild(L).style.display="none"})})();var w=o.support.cssFloat?"cssFloat":"styleFloat";o.props={"for":"htmlFor","class":"className","float":w,cssFloat:w,styleFloat:w,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",tabindex:"tabIndex"};o.fn.extend({_load:o.fn.load,load:function(G,J,K){if(typeof G!=="string"){return this._load(G)}var I=G.indexOf(" ");if(I>=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("<div/>").append(M.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function(){G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H<F;H++){var E=o.data(this[H],"olddisplay");this[H].style.display=E||"";if(o.css(this[H],"display")==="none"){var G=this[H].tagName,K;if(m[G]){K=m[G]}else{var I=o("<"+G+" />").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H<F;H++){this[H].style.display=o.data(this[H],"olddisplay")||""}return this}},hide:function(H,I){if(H){return this.animate(t("hide",3),H,I)}else{for(var G=0,F=this.length;G<F;G++){var E=o.data(this[G],"olddisplay");if(!E&&E!=="none"){o.data(this[G],"olddisplay",o.css(this[G],"display"))}}for(var G=0,F=this.length;G<F;G++){this[G].style.display="none"}return this}},_toggle:o.fn.toggle,toggle:function(G,F){var E=typeof G==="boolean";return o.isFunction(G)&&o.isFunction(F)?this._toggle.apply(this,arguments):G==null||E?this.each(function(){var H=E?G:o(this).is(":hidden");o(this)[H?"show":"hide"]()}):this.animate(t("toggle",3),G,F)},fadeTo:function(E,G,F){return this.animate({opacity:G},E,F)},animate:function(I,F,H,G){var E=o.speed(F,H,G);return this[E.queue===false?"each":"queue"](function(){var K=o.extend({},E),M,L=this.nodeType==1&&o(this).is(":hidden"),J=this;for(M in I){if(I[M]=="hide"&&L||I[M]=="show"&&!L){return K.complete.call(this)}if((M=="height"||M=="width")&&this.style){K.display=o.css(this,"display");K.overflow=this.style.overflow}}if(K.overflow!=null){this.style.overflow="hidden"}K.curAnim=o.extend({},I);o.each(I,function(O,S){var R=new o.fx(J,K,O);if(/toggle|show|hide/.test(S)){R[S=="toggle"?L?"show":"hide":S](I)}else{var Q=S.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),T=R.cur(true)||0;if(Q){var N=parseFloat(Q[2]),P=Q[3]||"px";if(P!="px"){J.style[O]=(N||1)+P;T=((N||1)/R.cur(true))*T;J.style[O]=T+P}if(Q[1]){N=((Q[1]=="-="?-1:1)*N)+T}R.custom(T,N,P)}else{R.custom(T,S,"")}}});return true})},stop:function(F,E){var G=o.timers;if(F){this.queue([])}this.each(function(){for(var H=G.length-1;H>=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J<K.length;J++){if(!K[J]()){K.splice(J--,1)}}if(!K.length){clearInterval(n);n=g}},13)}},show:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.show=true;this.custom(this.prop=="width"||this.prop=="height"?1:0,this.cur());o(this.elem).show()},hide:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(H){var G=e();if(H||G>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='<div style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><table style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" cellspacing="0"><tr><td></td></tr></table>';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})();/**
 * Cookie plugin
 *
 * Copyright (c) 2006 Klaus Hartl (stilbuero.de)
 * Dual licensed under the MIT and GPL licenses:
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.gnu.org/licenses/gpl.html
 *
 */

/**
 * Create a cookie with the given name and value and other optional parameters.
 *
 * @example $.cookie('the_cookie', 'the_value');
 * @desc Set the value of a cookie.
 * @example $.cookie('the_cookie', 'the_value', { expires: 7, path: '/', domain: 'jquery.com', secure: true });
 * @desc Create a cookie with all available options.
 * @example $.cookie('the_cookie', 'the_value');
 * @desc Create a session cookie.
 * @example $.cookie('the_cookie', null);
 * @desc Delete a cookie by passing null as value. Keep in mind that you have to use the same path and domain
 *       used when the cookie was set.
 *
 * @param String name The name of the cookie.
 * @param String value The value of the cookie.
 * @param Object options An object literal containing key/value pairs to provide optional cookie attributes.
 * @option Number|Date expires Either an integer specifying the expiration date from now on in days or a Date object.
 *                             If a negative value is specified (e.g. a date in the past), the cookie will be deleted.
 *                             If set to null or omitted, the cookie will be a session cookie and will not be retained
 *                             when the the browser exits.
 * @option String path The value of the path atribute of the cookie (default: path of page that created the cookie).
 * @option String domain The value of the domain attribute of the cookie (default: domain of page that created the cookie).
 * @option Boolean secure If true, the secure attribute of the cookie will be set and the cookie transmission will
 *                        require a secure protocol (like HTTPS).
 * @type undefined
 *
 * @name $.cookie
 * @cat Plugins/Cookie
 * @author Klaus Hartl/klaus.hartl@stilbuero.de
 */

/**
 * Get the value of a cookie with the given name.
 *
 * @example $.cookie('the_cookie');
 * @desc Get the value of a cookie.
 *
 * @param String name The name of the cookie.
 * @return The value of the cookie.
 * @type String
 *
 * @name $.cookie
 * @cat Plugins/Cookie
 * @author Klaus Hartl/klaus.hartl@stilbuero.de
 */
jQuery.cookie = function(name, value, options) {
    if (typeof value != 'undefined') { // name and value given, set cookie
        options = options || {};
        if (value === null) {
            value = '';
            options.expires = -1;
        }
        var expires = '';
        if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
            var date;
            if (typeof options.expires == 'number') {
                date = new Date();
                date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
            } else {
                date = options.expires;
            }
            expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
        }
        // CAUTION: Needed to parenthesize options.path and options.domain
        // in the following expressions, otherwise they evaluate to undefined
        // in the packed version for some reason...
        var path = options.path ? '; path=' + (options.path) : '';
        var domain = options.domain ? '; domain=' + (options.domain) : '';
        var secure = options.secure ? '; secure' : '';
        document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
    } else { // only name given, get cookie
        var cookieValue = null;
        if (document.cookie && document.cookie != '') {
            var cookies = document.cookie.split(';');
            for (var i = 0; i < cookies.length; i++) {
                var cookie = jQuery.trim(cookies[i]);
                // Does this cookie string begin with the name we want?
                if (cookie.substring(0, name.length + 1) == (name + '=')) {
                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                    break;
                }
            }
        }
        return cookieValue;
    }
};/**
 * windowName transport plugin 0.9.1 for jQuery
 *
 * Thanks to Kris Zyp <http://www.sitepen.com/blog/2008/07/22/windowname-transport/>
 * for the original idea and some code. Original BSD license below.
 *
 * Licensed under GPLv3: http://www.gnu.org/licenses/gpl-3.0.txt
 * @author Marko Mrdjenovic <jquery@friedcellcollective.net>
 *
**/
/*
 Copyright (c) 2004-2008, The Dojo Foundation
 All Rights Reserved.

 Licensed under the Academic Free License version 2.1 or above OR the
 modified BSD license. For more information on Dojo licensing, see:

 http://dojotoolkit.org/license
*/
(function ($) {
	$ = $ || window.jQuery;
	var origAjax = $.ajax, idx = 0;
	$.extend({
		ajax: function (s) {
			var remote = /^(?:\w+:)?\/\/([^\/?#]+)/,
				data = '', status = '', requestDone = false,
				xhr = null, type = s.type.toUpperCase(), ival = setTimeout(function () {}, 0),
				onreadystatechange = null, success = null, complete = null,
				localdom = remote.exec(s.url);
			if (s.windowname || (type === 'POST' && localdom && localdom[1] !== location.host)) {
				xhr = function () {
					var url = '',
						frameName = '',
						defaultName = 'jQuery.windowName.transport.frame',
						wnival = setTimeout(function () {}, 0),
						frame = null, form = null,
						u = {};
					function cleanup() {
						clearTimeout(wnival);
						try {
							delete window.jQueryWindowName[frameName];
						} catch (er) {
							window.jQueryWindowName[frameName] = function () {};
						}
						setTimeout(function () {
							$(frame).remove();
							$(form).remove();
						}, 100);
					}
					function setData() {
						try {
							var data = frame.contentWindow.name;
							if (typeof data === 'string') {
								if (data === defaultName) {
									u.status = 501;
									u.statusText = 'Not Implemented';
								} else {
									u.status = 200;
									u.statusText = 'OK';
									u.responseText = data;
								}
								u.readyState = 4; // we are done now
								u.onreadystatechange();
								cleanup();
							}
						} catch (er) {}
					}
					u = {
						abort: function () {
							cleanup();
						},
						getAllResponseHeaders: function () {
							return '';
						},
						getResponseHeader: function (key) {
							return '';
						},
						open: function (m, u) {
							url = u;
							this.readyState = 1;
							this.onreadystatechange();
						},
						send: function (data) {
							if (data.indexOf('windowname=') < 0) { // tell the server we want windowname transport
								data += (data === ''? '' : '&') + 'windowname=' + (s.windowname || 'true');
							}
							// prepare frame
							frameName = "jQueryWindowName" + ('' + Math.random()).substr(2, 8);
							window.jQueryWindowName = window.jQueryWindowName || {};
							window.jQueryWindowName[frameName] = function () {};
							var fmethod = null, faction = null, ftarget = null, fsubmit = null,
								local = window.location.href.substr(0, window.location.href.indexOf('/', 8)),
								locallist = ['/robots.txt', '/crossdomain.xml'];
							form = document.createElement('form');
							if ($.browser.msie) {
								try {
									frame = document.createElement('<iframe name="' + frameName + '" onload="jQueryWindowName[\'' + frameName + '\']()">');
									$('body')[0].appendChild(frame);
								} catch (er) {
								}
							}
							if (!frame) {
								frame = document.createElement('iframe');
							}
							frame.style.display = 'none';
							window.jQueryWindowName[frameName] = frame.onload = function (interval) {
								function get_local(next) {
									var file = '';
									if (next) {
										idx += 1;
									}
									file = s.localfile? s.localfile : locallist[idx]? local + locallist[idx] : null;
									if (!file) {
										file = location.href;
									}
									return file;
								}
								function is_local() {
									var c = false;
									try {
										c = !!frame.contentWindow.location.href;
										// try to get location - if we can we're still local and have to wait some more...
									} catch (er) {
										// if we're at foreign location we're sure we can proceed
									}
									return c;
								}
								try {
									if (frame.contentWindow.location.href === 'about:blank') {
										return;
									}
								} catch (er) {}
								if (u.readyState === 3) {
									if (is_local()) {
										clearInterval(wnival);
										setData();
									} else { // if not local try other local
										frame.contentWindow.location = get_local(true);
									}
								}
								if (u.readyState === 2 && (s.windowname || !is_local())) {
									u.readyState = 3;
									u.onreadystatechange();
									frame.contentWindow.location = get_local();
								}
							};
							setTimeout(function () { // stop after 2 mins
								cleanup();
							}, 120000);
							frame.name = frameName;
							frame.id = frameName;
							if (!frame.parentNode) {
								$('body')[0].appendChild(frame);
							}
							if (type === 'GET') {
								frame.contentWindow.location.href = url + (url.indexOf('?') >= 0? '&' : '?') + data;
							} else {
								// prepare form
								function queryToObject(q) {
									var r = {},
										d = decodeURIComponent;
									$.each(q.split("&"), function (k, v) {
										if (v.length) {
											var parts = v.split('='),
												n = d(parts.shift()),
												curr = r[n];
											v = d(parts.join('='));
											if (typeof curr === 'undefined') {
												r[n] = v;
											} else {
												if (curr.constructor === Array) {
													r[n].push(v);
												} else {
													r[n] = [curr].concat(v);
												}
											}
										}
									});
									return r;
								}
								form.style.display = 'none';
								$('body')[0].appendChild(form);
								// make references to the proper stuff
								fmethod = form.method;
								faction = form.action;
								ftarget = form.target;
								fsubmit = form.submit;
								form.method = 'POST';
								form.action = url;
								form.target = frameName;
								$.each(queryToObject(data.replace(/\+/g, '%20')), function (k, v) {
									function setVal(k, v) {
										var input = document.createElement("input");
										input.type = 'hidden';
										input.name = k;
										input.value = v;
										form.appendChild(input);
									}
									if (v.constuctor === Array) {
										$.each(v, function (i, v) {
											setVal(k, v);
										});
									} else {
										setVal(k, v);
									}
								});
								try {
									fmethod = form.method = 'POST';
									faction = form.action = url;
									ftarget = form.target = frameName;
								} catch (er2) {}
								frame.contentWindow.location = 'about:blank'; // opera likes this
								try {
									fsubmit();
								} catch (er3) {
									fsubmit.call(form);
								}
							}
							this.readyState = 2;
							this.onreadystatechange();
							if (frame.contentWindow) {
								frame.contentWindow.name = defaultName;
							}
						},
						setRequestHeader: function (key, value) {
						},
						onreadystatechange: function () {},
						readyState: 0,
						responseText: '',
						responseXML: null,
						status: null,
						statusText: null
					};
					return u;
				}();
				s = $.extend(true, s, $.extend(true, {}, $.ajaxSettings, s));
				if (s.data && s.processData && typeof s.data !== 'string') {
					s.data = $.param(s.data);
				}
				xhr.open(type, s.url);
				if (s.beforeSend && s.beforeSend(xhr, s) === false) {
					if (s.global) {
						$.active -= 1;
					}
					xhr.abort();
					return false;
				}
				if (s.global) {
					$.event.trigger("ajaxSend", [xhr, s]);
				}
				onreadystatechange = function (isTimeout) {
					if (!requestDone && xhr && (xhr.readyState === 4 || isTimeout === "timeout")) {
						requestDone = true;
						if (ival) {
							clearInterval(ival);
							ival = null;
						}
						status = isTimeout === 'timeout' && 'timeout' || !$.httpSuccess(xhr) && "error" || 'success';
						if (status === 'success') {
							try {
								data = $.httpData(xhr, s.dataType, s.dataFilter);
							} catch (er) {
								status = 'parsererror';
							}
						}
						if (status === 'success') {
							success();
						} else {
							$.handleError(s, xhr, status);
						}
						complete();
						xhr = null;
					}
				};
				ival = setInterval(onreadystatechange, 13);
				if (s.timeout > 0) {
					setTimeout(function () {
						if (xhr) {
							xhr.abort();
							if (!requestDone) {
								onreadystatechange("timeout");
							}
						}
					}, s.timeout);
				}
				try {
					xhr.send(s.data);
				} catch (er) {
					$.handleError(s, xhr, null, er);
				}
				success = function () {
					if (s.success) {
						s.success(data, status);
					}
					if (s.global) {
						$.event.trigger('ajaxSuccess', [xhr, s]);
					}
				};
				complete = function () {
					if (s.complete) {
						s.complete(xhr, status);
					}
					if (s.global) {
						$.event.trigger('ajaxComplete', [xhr, s]);
					}
					$.active -= 1;
					if (s.global && !$.active) {
						$.event.trigger('ajaxStop');
					}
				};
				return xhr;
			} else {
				return origAjax.apply(this, arguments);
			}
		}
	});
})();/*
    http://www.JSON.org/json2.js
    2009-08-17

    Public Domain.

    NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.

    See http://www.JSON.org/js.html

    This file creates a global JSON object containing two methods: stringify
    and parse.

        JSON.stringify(value, replacer, space)
            value       any JavaScript value, usually an object or array.

            replacer    an optional parameter that determines how object
                        values are stringified for objects. It can be a
                        function or an array of strings.

            space       an optional parameter that specifies the indentation
                        of nested structures. If it is omitted, the text will
                        be packed without extra whitespace. If it is a number,
                        it will specify the number of spaces to indent at each
                        level. If it is a string (such as '\t' or '&nbsp;'),
                        it contains the characters used to indent at each level.

            This method produces a JSON text from a JavaScript value.

            When an object value is found, if the object contains a toJSON
            method, its toJSON method will be called and the result will be
            stringified. A toJSON method does not serialize: it returns the
            value represented by the name/value pair that should be serialized,
            or undefined if nothing should be serialized. The toJSON method
            will be passed the key associated with the value, and this will be
            bound to the value

            For example, this would serialize Dates as ISO strings.

                Date.prototype.toJSON = function (key) {
                    function f(n) {
                        // Format integers to have at least two digits.
                        return n < 10 ? '0' + n : n;
                    }

                    return this.getUTCFullYear()   + '-' +
                         f(this.getUTCMonth() + 1) + '-' +
                         f(this.getUTCDate())      + 'T' +
                         f(this.getUTCHours())     + ':' +
                         f(this.getUTCMinutes())   + ':' +
                         f(this.getUTCSeconds())   + 'Z';
                };

            You can provide an optional replacer method. It will be passed the
            key and value of each member, with this bound to the containing
            object. The value that is returned from your method will be
            serialized. If your method returns undefined, then the member will
            be excluded from the serialization.

            If the replacer parameter is an array of strings, then it will be
            used to select the members to be serialized. It filters the results
            such that only members with keys listed in the replacer array are
            stringified.

            Values that do not have JSON representations, such as undefined or
            functions, will not be serialized. Such values in objects will be
            dropped; in arrays they will be replaced with null. You can use
            a replacer function to replace those with JSON values.
            JSON.stringify(undefined) returns undefined.

            The optional space parameter produces a stringification of the
            value that is filled with line breaks and indentation to make it
            easier to read.

            If the space parameter is a non-empty string, then that string will
            be used for indentation. If the space parameter is a number, then
            the indentation will be that many spaces.

            Example:

            text = JSON.stringify(['e', {pluribus: 'unum'}]);
            // text is '["e",{"pluribus":"unum"}]'


            text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t');
            // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'

            text = JSON.stringify([new Date()], function (key, value) {
                return this[key] instanceof Date ?
                    'Date(' + this[key] + ')' : value;
            });
            // text is '["Date(---current time---)"]'


        JSON.parse(text, reviver)
            This method parses a JSON text to produce an object or array.
            It can throw a SyntaxError exception.

            The optional reviver parameter is a function that can filter and
            transform the results. It receives each of the keys and values,
            and its return value is used instead of the original value.
            If it returns what it received, then the structure is not modified.
            If it returns undefined then the member is deleted.

            Example:

            // Parse the text. Values that look like ISO date strings will
            // be converted to Date objects.

            myData = JSON.parse(text, function (key, value) {
                var a;
                if (typeof value === 'string') {
                    a =
/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
                    if (a) {
                        return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
                            +a[5], +a[6]));
                    }
                }
                return value;
            });

            myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
                var d;
                if (typeof value === 'string' &&
                        value.slice(0, 5) === 'Date(' &&
                        value.slice(-1) === ')') {
                    d = new Date(value.slice(5, -1));
                    if (d) {
                        return d;
                    }
                }
                return value;
            });


    This is a reference implementation. You are free to copy, modify, or
    redistribute.

    This code should be minified before deployment.
    See http://javascript.crockford.com/jsmin.html

    USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
    NOT CONTROL.
*/

/*jslint evil: true */

/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply,
    call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
    getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
    lastIndex, length, parse, prototype, push, replace, slice, stringify,
    test, toJSON, toString, valueOf
*/

"use strict";

// Create a JSON object only if one does not already exist. We create the
// methods in a closure to avoid creating global variables.

if (!this.JSON) {
    this.JSON = {};
}

(function () {

    function f(n) {
        // Format integers to have at least two digits.
        return n < 10 ? '0' + n : n;
    }

    if (typeof Date.prototype.toJSON !== 'function') {

        Date.prototype.toJSON = function (key) {

            return isFinite(this.valueOf()) ?
                   this.getUTCFullYear()   + '-' +
                 f(this.getUTCMonth() + 1) + '-' +
                 f(this.getUTCDate())      + 'T' +
                 f(this.getUTCHours())     + ':' +
                 f(this.getUTCMinutes())   + ':' +
                 f(this.getUTCSeconds())   + 'Z' : null;
        };

        String.prototype.toJSON =
        Number.prototype.toJSON =
        Boolean.prototype.toJSON = function (key) {
            return this.valueOf();
        };
    }

    var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
        escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
        gap,
        indent,
        meta = {    // table of character substitutions
            '\b': '\\b',
            '\t': '\\t',
            '\n': '\\n',
            '\f': '\\f',
            '\r': '\\r',
            '"' : '\\"',
            '\\': '\\\\'
        },
        rep;


    function quote(string) {

// If the string contains no control characters, no quote characters, and no
// backslash characters, then we can safely slap some quotes around it.
// Otherwise we must also replace the offending characters with safe escape
// sequences.

        escapable.lastIndex = 0;
        return escapable.test(string) ?
            '"' + string.replace(escapable, function (a) {
                var c = meta[a];
                return typeof c === 'string' ? c :
                    '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
            }) + '"' :
            '"' + string + '"';
    }


    function str(key, holder) {

// Produce a string from holder[key].

        var i,          // The loop counter.
            k,          // The member key.
            v,          // The member value.
            length,
            mind = gap,
            partial,
            value = holder[key];

// If the value has a toJSON method, call it to obtain a replacement value.

        if (value && typeof value === 'object' &&
                typeof value.toJSON === 'function') {
            value = value.toJSON(key);
        }

// If we were called with a replacer function, then call the replacer to
// obtain a replacement value.

        if (typeof rep === 'function') {
            value = rep.call(holder, key, value);
        }

// What happens next depends on the value's type.

        switch (typeof value) {
        case 'string':
            return quote(value);

        case 'number':

// JSON numbers must be finite. Encode non-finite numbers as null.

            return isFinite(value) ? String(value) : 'null';

        case 'boolean':
        case 'null':

// If the value is a boolean or null, convert it to a string. Note:
// typeof null does not produce 'null'. The case is included here in
// the remote chance that this gets fixed someday.

            return String(value);

// If the type is 'object', we might be dealing with an object or an array or
// null.

        case 'object':

// Due to a specification blunder in ECMAScript, typeof null is 'object',
// so watch out for that case.

            if (!value) {
                return 'null';
            }

// Make an array to hold the partial results of stringifying this object value.

            gap += indent;
            partial = [];

// Is the value an array?

            if (Object.prototype.toString.apply(value) === '[object Array]') {

// The value is an array. Stringify every element. Use null as a placeholder
// for non-JSON values.

                length = value.length;
                for (i = 0; i < length; i += 1) {
                    partial[i] = str(i, value) || 'null';
                }

// Join all of the elements together, separated with commas, and wrap them in
// brackets.

                v = partial.length === 0 ? '[]' :
                    gap ? '[\n' + gap +
                            partial.join(',\n' + gap) + '\n' +
                                mind + ']' :
                          '[' + partial.join(',') + ']';
                gap = mind;
                return v;
            }

// If the replacer is an array, use it to select the members to be stringified.

            if (rep && typeof rep === 'object') {
                length = rep.length;
                for (i = 0; i < length; i += 1) {
                    k = rep[i];
                    if (typeof k === 'string') {
                        v = str(k, value);
                        if (v) {
                            partial.push(quote(k) + (gap ? ': ' : ':') + v);
                        }
                    }
                }
            } else {

// Otherwise, iterate through all of the keys in the object.

                for (k in value) {
                    if (Object.hasOwnProperty.call(value, k)) {
                        v = str(k, value);
                        if (v) {
                            partial.push(quote(k) + (gap ? ': ' : ':') + v);
                        }
                    }
                }
            }

// Join all of the member texts together, separated with commas,
// and wrap them in braces.

            v = partial.length === 0 ? '{}' :
                gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' +
                        mind + '}' : '{' + partial.join(',') + '}';
            gap = mind;
            return v;
        }
    }

// If the JSON object does not yet have a stringify method, give it one.

    if (typeof JSON.stringify !== 'function') {
        JSON.stringify = function (value, replacer, space) {

// The stringify method takes a value and an optional replacer, and an optional
// space parameter, and returns a JSON text. The replacer can be a function
// that can replace values, or an array of strings that will select the keys.
// A default replacer method can be provided. Use of the space parameter can
// produce text that is more easily readable.

            var i;
            gap = '';
            indent = '';

// If the space parameter is a number, make an indent string containing that
// many spaces.

            if (typeof space === 'number') {
                for (i = 0; i < space; i += 1) {
                    indent += ' ';
                }

// If the space parameter is a string, it will be used as the indent string.

            } else if (typeof space === 'string') {
                indent = space;
            }

// If there is a replacer, it must be a function or an array.
// Otherwise, throw an error.

            rep = replacer;
            if (replacer && typeof replacer !== 'function' &&
                    (typeof replacer !== 'object' ||
                     typeof replacer.length !== 'number')) {
                throw new Error('JSON.stringify');
            }

// Make a fake root object containing our value under the key of ''.
// Return the result of stringifying the value.

            return str('', {'': value});
        };
    }


// If the JSON object does not yet have a parse method, give it one.

    if (typeof JSON.parse !== 'function') {
        JSON.parse = function (text, reviver) {

// The parse method takes a text and an optional reviver function, and returns
// a JavaScript value if the text is a valid JSON text.

            var j;

            function walk(holder, key) {

// The walk method is used to recursively walk the resulting structure so
// that modifications can be made.

                var k, v, value = holder[key];
                if (value && typeof value === 'object') {
                    for (k in value) {
                        if (Object.hasOwnProperty.call(value, k)) {
                            v = walk(value, k);
                            if (v !== undefined) {
                                value[k] = v;
                            } else {
                                delete value[k];
                            }
                        }
                    }
                }
                return reviver.call(holder, key, value);
            }


// Parsing happens in four stages. In the first stage, we replace certain
// Unicode characters with escape sequences. JavaScript handles many characters
// incorrectly, either silently deleting them, or treating them as line endings.

            cx.lastIndex = 0;
            if (cx.test(text)) {
                text = text.replace(cx, function (a) {
                    return '\\u' +
                        ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
                });
            }

// In the second stage, we run the text against regular expressions that look
// for non-JSON patterns. We are especially concerned with '()' and 'new'
// because they can cause invocation, and '=' because it can cause mutation.
// But just to be safe, we want to reject all unexpected forms.

// We split the second stage into 4 regexp operations in order to work around
// crippling inefficiencies in IE's and Safari's regexp engines. First we
// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
// replace all simple value tokens with ']' characters. Third, we delete all
// open brackets that follow a colon or comma or that begin the text. Finally,
// we look to see that the remaining characters are only whitespace or ']' or
// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.

            if (/^[\],:{}\s]*$/.
test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').
replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {

// In the third stage we use the eval function to compile the text into a
// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
// in JavaScript: it can begin a block or an object literal. We wrap the text
// in parens to eliminate the ambiguity.

                j = eval('(' + text + ')');

// In the optional fourth stage, we recursively walk the new structure, passing
// each name/value pair to a reviver function for possible transformation.

                return typeof reviver === 'function' ?
                    walk({'': j}, '') : j;
            }

// If the text is not JSON parseable, then a SyntaxError is thrown.

            throw new SyntaxError('JSON.parse');
        };
    }
}());
/*
 * jQuery selectbox plugin
 *
 * Copyright (c) 2007 Sadri Sahraoui (brainfault.com)
 * Licensed under the GPL license and MIT:
 *   http://www.opensource.org/licenses/GPL-license.php
 *   http://www.opensource.org/licenses/mit-license.php
 *
 * The code is inspired from Autocomplete plugin (http://www.dyve.net/jquery/?autocomplete)
 *
 * Revision: $Id$
 * Version: 0.6
 * 
 * Changelog :
 *  Version 0.6
 *  - Fix IE scrolling problem
 *  Version 0.5 
 *  - separate css style for current selected element and hover element which solve the highlight issue 
 *  Version 0.4
 *  - Fix width when the select is in a hidden div   @Pawel Maziarz
 *  - Add a unique id for generated li to avoid conflict with other selects and empty values @Pawel Maziarz
 */
jQuery.fn.extend({
	selectbox: function(options) {
		return this.each(function() {
			new jQuery.SelectBox(this, options);
		});
	}
});


/* pawel maziarz: work around for ie logging */
if (!window.console) {
	var console = {
		log: function(msg) { 
	 }
	}
}
/* */

jQuery.SelectBox = function(selectobj, options) {
	
	var opt = options || {};
	opt.inputClass = opt.inputClass || "nscrEmktSelectbox";
	opt.containerClass = opt.containerClass || "nscrEmktSelectboxWrapper";
	opt.hoverClass = opt.hoverClass || "current";
	opt.currentClass = opt.selectedClass || "selected"
	opt.debug = opt.debug || false;
	
	var elm_id = selectobj.id;
	var active = 0;
	var inFocus = false;
	var hasfocus = 0;
	//jquery object for select element
	var $select = $(selectobj);
	// jquery container object
	var $container = setupContainer(opt);
	//jquery input object 
	var $input = setupInput(opt);
	// hide select and append newly created elements
	$select.hide().before($input).before($container);
	
	
	init();
	
	$input
	.click(function(){
    if (!inFocus) {
		  $container.toggle();
		}
	})
	.focus(function(){
	   if ($container.not(':visible')) {
	       inFocus = true;
	       $container.show();
	   }
	})
	.keydown(function(event) {	   
		switch(event.keyCode) {
			case 38: // up
				event.preventDefault();
				moveSelect(-1);
				break;
			case 40: // down
				event.preventDefault();
				moveSelect(1);
				break;
			//case 9:  // tab 
			case 13: // return
				event.preventDefault(); // seems not working in mac !
				$('li.'+opt.hoverClass).trigger('click');
				break;
			case 27: //escape
			  hideMe();
			  break;
		}
	})
	.blur(function() {
		if ($container.is(':visible') && hasfocus > 0 ) {
			if(opt.debug) console.log('container visible and has focus')
		} else {
		  // Workaround for ie scroll - thanks to Bernd Matzner
		  if($.browser.msie){
        if(document.activeElement.getAttribute('id').indexOf('_container')==-1){
          hideMe();
        } else {
          $input.focus();
        }
      } else {
        hideMe();
      }
		}
	});


	function hideMe() { 
		hasfocus = 0;
		$container.hide(); 
	}
	
	function init() {
		$container.append(getSelectOptions($input.attr('id'))).hide();
		var width = $input.css('width');
		$container.width(width);
    }
	
	function setupContainer(options) {
		var container = document.createElement("div");
		$container = $(container);
		$container.attr('id', elm_id+'_container');
		$container.addClass(options.containerClass);
		
		return $container;
	}
	
	function setupInput(options) {
		var input = document.createElement("input");
		var $input = $(input);
		//$input.css("width", $select.css("width"));
		$input.attr("id", elm_id+"_input");
		$input.attr("type", "text");
		$input.addClass(options.inputClass);
		$input.attr("autocomplete", "off");
		$input.attr("readonly", "readonly");
		$input.attr("tabIndex", $select.attr("tabindex")); // "I" capital is important for ie
		
		return $input;	
	}
	
	function moveSelect(step) {
		var lis = $("li", $container);
		if (!lis || lis.length == 0) return false;
		active += step;
    //loop through list
		if (active < 0) {
			active = lis.size();
		} else if (active > lis.size()) {
			active = 0;
		}
    scroll(lis, active);
		lis.removeClass(opt.hoverClass);

		$(lis[active]).addClass(opt.hoverClass);
	}
	
	function scroll(list, active) {
      var el = $(list[active]).get(0);
      var list = $container.get(0);
      
      if (el.offsetTop + el.offsetHeight > list.scrollTop + list.clientHeight) {
        list.scrollTop = el.offsetTop + el.offsetHeight - list.clientHeight;      
      } else if(el.offsetTop < list.scrollTop) {
        list.scrollTop = el.offsetTop;
      }
	}
	
	function setCurrent() {	
		var li = $("li."+opt.currentClass, $container).get(0);
		var ar = (''+li.id).split('_');
		var el = ar[ar.length-1];
		var newVal = $(li).html();
		var newClass = (newVal === "") ? "" : elm_id+"_bg";
		$select.val(el);
		if(newVal !== "") {
		  if($input.hasClass(newClass) === false) { $input.addClass(newClass); }
		} else {
		  $input.removeClass(newClass)
		}
		$input.val(newVal);
		return true;
	}
	
	// select value
	function getCurrentSelected() {
		return $select.val();
	}
	
	// input value
	function getCurrentValue() {
		return $input.val();
	}
	
	function getSelectOptions(parentid) {
		var select_options = new Array();
		var ul = document.createElement('ul');
		$select.children('option').each(function() {
			var li = document.createElement('li');
			li.setAttribute('id', parentid + '_' + $(this).val());
			li.innerHTML = $(this).html();
			if ($(this).is(':selected')) {
				$input.val($(this).html());
				$(li).addClass(opt.currentClass);
			}
			ul.appendChild(li);
			$(li)
			.mouseover(function(event) {
				hasfocus = 1;
				if (opt.debug) console.log('over on : '+this.id);
				jQuery(event.target, $container).addClass(opt.hoverClass);
			})
			.mouseout(function(event) {
				hasfocus = -1;
				if (opt.debug) console.log('out on : '+this.id);
				jQuery(event.target, $container).removeClass(opt.hoverClass);
			})
			.click(function(event) {
			  var fl = $('li.'+opt.hoverClass, $container).get(0);
				if (opt.debug) console.log('click on :'+this.id);
				$('li.'+opt.currentClass).removeClass(opt.currentClass); 
				$(this).addClass(opt.currentClass);
				setCurrent();
				//$select.change();
				$select.get(0).blur();
				hideMe();
				$select.change();
			});
		});
		return ul;
	}
	
	
	
};
ï»¿/**
 * jQuery.query - Query String Modification and Creation for jQuery
 * Written by Blair Mitchelmore (blair DOT mitchelmore AT gmail DOT com)
 * Licensed under the WTFPL (http://sam.zoy.org/wtfpl/).
 * Date: 2009/8/13
 *
 * @author Blair Mitchelmore
 * @version 2.1.6
 *
 **/
new function(settings) { 
  // Various Settings
  var $separator = settings.separator || '&';
  var $spaces = settings.spaces === false ? false : true;
  var $suffix = settings.suffix === false ? '' : '[]';
  var $prefix = settings.prefix === false ? false : true;
  var $hash = $prefix ? settings.hash === true ? "#" : "?" : "";
  var $numbers = settings.numbers === false ? false : true;
  
  jQuery.query = new function() {
    var is = function(o, t) {
      return o != undefined && o !== null && (!!t ? o.constructor == t : true);
    };
    var parse = function(path) {
      var m, rx = /\[([^[]*)\]/g, match = /^([^[]+)?(\[.*\])?$/.exec(path), base = match[1], tokens = [];
      while (m = rx.exec(match[2])) tokens.push(m[1]);
      return [base, tokens];
    };
    var set = function(target, tokens, value) {
      var o, token = tokens.shift();
      if (typeof target != 'object') target = null;
      if (token === "") {
        if (!target) target = [];
        if (is(target, Array)) {
          target.push(tokens.length == 0 ? value : set(null, tokens.slice(0), value));
        } else if (is(target, Object)) {
          var i = 0;
          while (target[i++] != null);
          target[--i] = tokens.length == 0 ? value : set(target[i], tokens.slice(0), value);
        } else {
          target = [];
          target.push(tokens.length == 0 ? value : set(null, tokens.slice(0), value));
        }
      } else if (token && token.match(/^\s*[0-9]+\s*$/)) {
        var index = parseInt(token, 10);
        if (!target) target = [];
        target[index] = tokens.length == 0 ? value : set(target[index], tokens.slice(0), value);
      } else if (token) {
        var index = token.replace(/^\s*|\s*$/g, "");
        if (!target) target = {};
        if (is(target, Array)) {
          var temp = {};
          for (var i = 0; i < target.length; ++i) {
            temp[i] = target[i];
          }
          target = temp;
        }
        target[index] = tokens.length == 0 ? value : set(target[index], tokens.slice(0), value);
      } else {
        return value;
      }
      return target;
    };
    
    var queryObject = function(a) {
      var self = this;
      self.keys = {};
      
      if (a.queryObject) {
        jQuery.each(a.get(), function(key, val) {
          self.SET(key, val);
        });
      } else {
        jQuery.each(arguments, function() {
          var q = "" + this;
          q = q.replace(/^[?#]/,''); // remove any leading ? || #
          q = q.replace(/[;&]$/,''); // remove any trailing & || ;
          if ($spaces) q = q.replace(/[+]/g,' '); // replace +'s with spaces
          
          jQuery.each(q.split(/[&;]/), function(){
            var key = decodeURIComponent(this.split('=')[0] || "");
            var val = decodeURIComponent(this.split('=')[1] || "");
            
            if (!key) return;
            
            if ($numbers) {
              if (/^[+-]?[0-9]+\.[0-9]*$/.test(val)) // simple float regex
                val = parseFloat(val);
              else if (/^[+-]?[0-9]+$/.test(val)) // simple int regex
                val = parseInt(val, 10);
            }
            
            val = (!val && val !== 0) ? true : val;
            
            if (val !== false && val !== true && typeof val != 'number')
              val = val;
            
            self.SET(key, val);
          });
        });
      }
      return self;
    };
    
    queryObject.prototype = {
      queryObject: true,
      has: function(key, type) {
        var value = this.get(key);
        return is(value, type);
      },
      GET: function(key) {
        if (!is(key)) return this.keys;
        var parsed = parse(key), base = parsed[0], tokens = parsed[1];
        var target = this.keys[base];
        while (target != null && tokens.length != 0) {
          target = target[tokens.shift()];
        }
        return typeof target == 'number' ? target : target || "";
      },
      get: function(key) {
        var target = this.GET(key);
        if (is(target, Object))
          return jQuery.extend(true, {}, target);
        else if (is(target, Array))
          return target.slice(0);
        return target;
      },
      SET: function(key, val) {
        var value = !is(val) ? null : val;
        var parsed = parse(key), base = parsed[0], tokens = parsed[1];
        var target = this.keys[base];
        this.keys[base] = set(target, tokens.slice(0), value);
        return this;
      },
      set: function(key, val) {
        return this.copy().SET(key, val);
      },
      REMOVE: function(key) {
        return this.SET(key, null).COMPACT();
      },
      remove: function(key) {
        return this.copy().REMOVE(key);
      },
      EMPTY: function() {
        var self = this;
        jQuery.each(self.keys, function(key, value) {
          delete self.keys[key];
        });
        return self;
      },
      load: function(url) {
        var hash = url.replace(/^.*?[#](.+?)(?:\?.+)?$/, "$1");
        var search = url.replace(/^.*?[?](.+?)(?:#.+)?$/, "$1");
        return new queryObject(url.length == search.length ? '' : search, url.length == hash.length ? '' : hash);
      },
      empty: function() {
        return this.copy().EMPTY();
      },
      copy: function() {
        return new queryObject(this);
      },
      COMPACT: function() {
        function build(orig) {
          var obj = typeof orig == "object" ? is(orig, Array) ? [] : {} : orig;
          if (typeof orig == 'object') {
            function add(o, key, value) {
              if (is(o, Array))
                o.push(value);
              else
                o[key] = value;
            }
            jQuery.each(orig, function(key, value) {
              if (!is(value)) return true;
              add(obj, key, build(value));
            });
          }
          return obj;
        }
        this.keys = build(this.keys);
        return this;
      },
      compact: function() {
        return this.copy().COMPACT();
      },
      toString: function() {
        var i = 0, queryString = [], chunks = [], self = this;
        var encode = function(str) {
          str = str + "";
          if ($spaces) str = str.replace(/ /g, "+");
          return encodeURIComponent(str);
        };
        var addFields = function(arr, key, value) {
          if (!is(value) || value === false) return;
          var o = [encode(key)];
          if (value !== true) {
            o.push("=");
            o.push(encode(value));
          }
          arr.push(o.join(""));
        };
        var build = function(obj, base) {
          var newKey = function(key) {
            return !base || base == "" ? [key].join("") : [base, "[", key, "]"].join("");
          };
          jQuery.each(obj, function(key, value) {
            if (typeof value == 'object') 
              build(value, newKey(key));
            else
              addFields(chunks, newKey(key), value);
          });
        };
        
        build(this.keys);
        
        if (chunks.length > 0) queryString.push($hash);
        queryString.push(chunks.join($separator));
        
        return queryString.join("");
      }
    };
    
    return new queryObject(location.search, location.hash);
  };
}(jQuery.query || {}); // Pass in jQuery.query as settings object
// Password strength meter v1.0
// Matthew R. Miller - 2007
// www.codeandcoffee.com
// Based off of code from  http://www.intelligent-web.co.uk

// Settings
// -- Toggle to true or false, if you want to change what is checked in the password
var bCheckNumbers = true;
var bCheckUpperCase = true;
var bCheckLowerCase = true;
var bCheckPunctuation = true;
var nPasswordLifetime = 365;

// Check password
function checkPassword(strPassword)
{
	// Reset combination count
	nCombinations = 0;
	
	// Check numbers
	if (bCheckNumbers)
	{
		strCheck = "0123456789";
		if (doesContain(strPassword, strCheck) > 0) 
		{ 
        		nCombinations += strCheck.length; 
    		}
	}
	
	// Check upper case
	if (bCheckUpperCase)
	{
		strCheck = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
		if (doesContain(strPassword, strCheck) > 0) 
		{ 
        		nCombinations += strCheck.length; 
    		}
	}
	
	// Check lower case
	if (bCheckLowerCase)
	{
		strCheck = "abcdefghijklmnopqrstuvwxyz";
		if (doesContain(strPassword, strCheck) > 0) 
		{ 
        		nCombinations += strCheck.length; 
    		}
	}
	
	// Check punctuation
	if (bCheckPunctuation)
	{
		strCheck = ";:-_=+\|//?^&!.@$£#*()%~<>{}[]";
		if (doesContain(strPassword, strCheck) > 0) 
		{ 
        		nCombinations += strCheck.length; 
    		}
	}
	
	// Calculate
	// -- 500 tries per second => minutes 
    	var nDays = ((Math.pow(nCombinations, strPassword.length) / 500) / 2) / 86400;
 
	// Number of days out of password lifetime setting
	var nPerc = nDays / nPasswordLifetime;
	
	return nPerc;
}
 
// Runs password through check and then updates GUI 
function runPassword(strPassword, strFieldID) 
{
	// Check password
	nPerc = checkPassword(strPassword);
	
	 // Get controls
    	var ctlBar = document.getElementById(strFieldID + "_bar"); 
    	var ctlText = document.getElementById(strFieldID + "_text");
    	if (!ctlBar || !ctlText)
    		return;
    	
    	// Set new width
    	var nRound = Math.round(nPerc * 100);
	if (nRound < (strPassword.length * 5)) 
	{ 
		nRound += strPassword.length * 5; 
	}
	if (nRound > 100)
		nRound = 100;
    	ctlBar.style.width = nRound + "%";
 
 	// Color and text
 	if (nRound > 95)
 	{
 		strText = "Strong";
 		strColor = "#9feb93";
 	}
 	else if (nRound > 75)
 	{
 		strText = "Secure";
 		strColor = "yellow";
	}
 	else if (nRound > 50)
 	{
 		strText = "Medium";
 		strColor = "orange";
 	}
 	else
 	{
 		strColor = "#9a0000";
 		strText = "Weak";
 	}
	ctlBar.style.backgroundColor = strColor;
	ctlText.innerHTML = "<span style='color: " + strColor + ";'>" + strText + "</span>";
}
 
// Checks a string for a list of characters
function doesContain(strPassword, strCheck)
 {
    	nCount = 0; 
 
	for (i = 0; i < strPassword.length; i++) 
	{
		if (strCheck.indexOf(strPassword.charAt(i)) > -1) 
		{ 
	        	nCount++; 
		} 
	} 
 
	return nCount; 
} 
 
 
 
 
 


// PROTECT IE
if (!window.console || !console.firebug) {
  var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",
  "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];
  window.console = {};
  for (var i = 0; i < names.length; ++i) {
    window.console[names[i]] = function() {}
  }
}

ms.events = {

  "overlay": {
    "init": function() {
      ms.methods.overlay.load();
      $("#nscrEmktOverlay").css("height", $("body").height()); // the overlay drop shadow
      $(ms.ui.object.overlay.close).click(function() {
        ms.methods.overlay.close("#nscrEmktHelpers", "#nscrEmktOverlay");
      });
      $(ms.ui.object.overlay.defaultOverlay.selector).click(function(){
        ms.methods.overlay.close("#nscrEmktHelpers", "#nscrEmktOverlay");
        ms.methods.overlay.go("defaultOverlay", "");
      });
      $(ms.ui.object.overlay.raceView.selector).click(function(){
        ms.methods.overlay.close("#nscrEmktHelpers", "#nscrEmktOverlay");
        ms.methods.overlay.go("raceView", ms.config.storefront + ms.config.raceView, 104);
      });
      $(ms.ui.object.overlay.pitCommand.selector).click(function(){
        ms.methods.overlay.close("#nscrEmktHelpers", "#nscrEmktOverlay");
        ms.methods.overlay.go("pitCommand", ms.config.storefront + ms.config.pitCommand, 6);
      });
      $(ms.ui.object.overlay.scanner.selector).click(function(){
        ms.methods.overlay.close("#nscrEmktHelpers", "#nscrEmktOverlay");
        ms.methods.overlay.go("scanner", ms.config.storefront + ms.config.scanner, 1);
      });
    }
  },
  
  "login": {
    "init": function(){
      ms.methods.forms.init('login');
      ms.methods.validate.bind('login');
      this.customevents.forgotPasswordLink();
      $(ms.methods.get('login').selector).submit(function() {
        console.log('Attempting to login.');
        if(ms.methods.validate.form('login', true)) {
          console.log('Passed validation.');
          var data = $(this).serialize();
          ms.api.login({
            data: data,
            success: function (data, status) {
              ms.events.login.apiResponse(data, status);
            },
            failure: function (xhr, status, error) {
              console.error(error);
            }
          });
        }
        return false; // cancel form submission
      });
    },
    "apiResponse": function(data, status){
      var jsonObj = JSON.parse(data);
      console.log('Login api response:');
      console.log(jsonObj);
      if(jsonObj.success === false) {
        ms.ui.actor.genericError('login', ms.ui.actor.errorMessages.transform(jsonObj.errors[0]));
      } else {
        ms.methods.overlay.close("#nscrEmktHelpers", "#nscrEmktOverlay");
        ms.methods.createAuthCookies(jsonObj.tid, jsonObj.authId, jsonObj.authPass, jsonObj.user.displayName);
        ms.methods.rememberEmailCookie($(ms.methods.get('login','email').selector).val(), $(ms.methods.get('login','rememberEmail').selector).attr('checked'));
        ms.ui.actor.genericError('login','');
        ms.ui.actor.clear.typeAll('login');
        ms.methods.overlay.xurl();
      }
    },
    "customevents": {
      "forgotPasswordLink": function() {
        $('#nscrEmktForgotPassword').click(function() {
          var url, xurl, type, value = $("#nscrEmktLoginEmail").val();
          if(value !== "") {
            url = location.protocol + "//" + location.host + location.pathname;
            type = ms.ui.object.overlay.state.type;
            xurl = ms.ui.object.overlay.state.xurl;
            if(xurl !== "" && type !== "") {
              url += "?xurl=" + xurl + "&type=" + type;
            } else if(xurl !== "") {
              url += "?xurl=" + xurl;
            } else if(type !== "") {
              url += "?type=" + type;
            }
            url = encodeURIComponent(url);
            location.href = ms.config.memberServices + "/pitpass/passHint.do?source=nascar&pid=nascar.default&user_email=" + encodeURIComponent(value) + "&url=" + url;
          } else {
            ms.ui.actor.genericError('login','Please enter e-mail address.');
          }
        });
        $(ms.ui.object.login.fields.email.selector).blur(function(){
          if($(this).val() !== "") {
            ms.ui.actor.genericError('login', '');
          }
        });
      }
    }
  },
  
  "register": {
    "init": function(){
      ms.methods.forms.init('register');
      ms.methods.validate.bind('register');
      ms.events.register.customevents.tips();
      $(ms.methods.get('register','birthYear').tipSelector).mouseover(function() {
        ms.ui.actor.toggleTip('register','birthYear');
      });
      $(ms.methods.get('register','birthYear').tipSelector).mouseout(function() {
        ms.ui.actor.toggleTip('register','birthYear');
      });
      $(ms.methods.get('register').selector).submit(function() {
        console.log('Attempting to register.');
        if(ms.methods.validate.form('register', true)) {
          console.log('Passed validation.');
          var data = $(this).serialize();
          ms.api.register({
            data: data,
            success: function (data, status) {
              ms.events.register.apiResponse(data, status);
            },
            failure: function (xhr, status, error) {
              console.error(error);
            }
          });
        }
        return false; // cancel form submission
      });
    },
    "apiResponse": function(data, status){
      console.log('Register api response:');
      var jsonObj = JSON.parse(data);
      console.log(jsonObj);
      if(jsonObj.success === false) {
        ms.ui.actor.genericError('register', ms.ui.actor.errorMessages.transform(jsonObj.errors[0]));
      } else {
        ms.methods.overlay.close("#nscrEmktHelpers", "#nscrEmktOverlay");
        ms.methods.createAuthCookies(jsonObj.tid, jsonObj.authId, jsonObj.authPass, jsonObj.user.displayName);
        ms.ui.actor.genericError('register','');
        ms.ui.actor.clear.typeAll('register');
        ms.methods.overlay.xurl();
      }
    },
    "customevents": {
      "tips": function(){
        var form = 'register';
        var formObj = ms.methods.get(form);
        for(var field in formObj.fields) {
          if(ms.methods.defined(ms.methods.get(form, field).tip)) {
            $(formObj.fields[field].tipSelector).bind('focus', [form,field], function(e) { 
              ms.ui.actor.tip(e.data[0], e.data[1], ms.methods.get(e.data[0], e.data[1]).tip);
            });
            $(formObj.fields[field].tipSelector).bind('blur', [form,field], function(e) { 
              ms.ui.actor.clearActor(e.data[0], e.data[1], 'tip');
            });
          }
        }
      },
      "dob": function() {
        $("#nscrEmktDobM").change(function(){
          ms.methods.validate.customValidators.validateDob('register','birthMonth', false);
        });
        $("#nscrEmktDobD").change(function(){
          ms.methods.validate.customValidators.validateDob('register','birthDay', false);
        });
        $("#nscrEmktDobY").change(function(){
          ms.methods.validate.customValidators.validateDob('register','birthYear', false);
        });
      },
      "favoriteDriver": function(){
        $("#nscrEmktFdriver").change(function(){
          ms.methods.validate.customValidators.favoriteDriver('register','favoriteDriver', false);
        });
      }
    }
  },
  
  "forgotPassword": {},
  
  
  "resetPassword": {
    "init": function() {
      $('#nscrEmktResetCode').click(function() {
        $('#nscrEmktFPwd1').hide();
        $('#nscrEmktFPwd2').show();
      });
      ms.methods.forms.init('resetPassword');
      ms.methods.validate.bind('resetPassword');
    }
  },
  
  "completeProfile": {
    "init": function(){
      ms.methods.forms.init('completeProfile');
      ms.methods.validate.bind('completeProfile');
      $(ms.ui.object.completeProfile.selector).submit(function() {
        console.log('submitted');
        if(ms.methods.validate.form('completeProfile'), true) {
          var data = $(this).serialize();
          data = ms.methods.cleanSerial(data);
          console.log(data);
          if(data === "") { return false; }
          ms.api.user.edit({
            data: data,
            success: function (data, status) {
              ms.events.completeProfile.apiResponse(data, status);
            },
            failure: function (xhr, status, error) {
              console.error(error);
            }
          });
        }
        return false; // cancel form submission
      });
    },
    "apiResponse": function(data, status){
      var jsonObj = JSON.parse(data);
      console.log(jsonObj);
      if(jsonObj.status == 'error') {
        if(ms.methods.defined(jsonObj.errors[0].field)) {
          ms.ui.actor.genericError('completeProfile',jsonObj.errors[0].field + ' ' + jsonObj.errors[0].error);
        } else {
          ms.ui.actor.genericError('completeProfile',jsonObj.errors[0].error);
        }
      } else {
        console.log(jsonObj);
      }
    }
  }
};
ms.ui.object = {
  
  "global": {
    "checkmark": {"selector":"#nscrEmktSuccess","classSelector":".nscrEmktSuccess"},
    "error": {"selector":"#nscrEmktError","classSelector":".nscrEmktError"},
    "tip": {"selector":"#nscrEmktTip","classSelector":".nscrEmktTip"},
    "helper":"#nscrEmktHelpers",
    "defaultClass":"nscrEmktInDefault",
    "helperPrefix":"nscrZ"
  },
  
  "overlay": {
    "selector": "#nscrEmktOverlay",
    "close": "#nscrEmktOverlayClose",
    "header": "#nscrEmktHdrProg",
    "logo":"#nscrEmktProgLogo",
    "text":"#nscrEmktTopMsg",
    "defaultClass" : "nscrEmktHdrProgNMS",
    "purchaseClass": "nscrEmktHdrProgTP",
    "bulletHide": "#nscrEmktPromoCol div.nscrEmktRoundBox",
    "defaultOverlay": {"selector":"#nscrEmktRL", "logoClass":"nscrEmktProgLogoNMS", "text":"Thanks for choosing NASCAR.COM!"},
    "raceView": {"selector":"#nscrEmktRV", "bullet": "#nscrEmktBulletsRaceView", "logoClass":"nscrEmktProgLogoRV", "text":"Thanks for choosing TrackPass RaceView!"},
    "pitCommand": {"selector":"#nscrEmktPC", "bullet": "#nscrEmktBulletsPitCommand", "logoClass":"nscrEmktProgLogoPC", "text":"Thanks for choosing TrackPass PitCommand!"},
    "scanner": {"selector":"#nscrEmktSC", "bullet": "#nscrEmktBulletsScanner", "logoClass":"nscrEmktProgLogoSC", "text":"Thanks for choosing TrackPass Scanner!"},
    "community": {"selector":"", "bullet": "#nscrEmktBulletsCommunity", "logoClass":"nscrEmktProgLogoCom", "text":"Thanks for choosing NASCAR.COM Community!"},
    "state": {
      "type":"registerOrLogin",
      "resetCode":"",
      "email":"",
      "favoriteDriver":"",
      "rememberEmail":"",
      "xurl":"",
      "offerId": -1
    }
  },
  
  "login": {
    "selector":"#nscrEmktFormLogin",
    "submitSelector":"#nscrEmktSubmitO1",
    "genericError":"div#nscrEmktLogin p.nscrEmktGError",
    "fields": {
      "email": {"type":"text","selector":"#nscrEmktLoginEmail", "actorOff":"checkmark,tip", "validate":"rules[email]", "defaultText":"E-mail Address"},
      "password": {"type":"password","selector":"#nscrEmktLoginPassword", "actorOff":"checkmark,tip", "pwdSelector":"#nscrEmktLoginPwdDiv", "validate":"rules[length[3,20]]", "defaultText":"Password"},
      "rememberEmail": {"type":"checkbox","selector":"#nscrEmktLoginCbox", "actorOff":"error,checkmark,tip", "validate":"rules[ignore]"}
    }
  },
  
  "forgotPassword": {
    "selector":"#nscrEmktFPwd1",
    "submitSelector":"#nscrEmktSubmitO3",
    "genericError":"div#nscrEmktFPwd1 p.nscrEmktGError",
    "fields": {
      "email": {"type":"text","selector":"#nscrEmktFpwdEmail", "actorOff":"checkmark,tip", "validate":"rules[email]", "defaultText":"E-mail Address"}
    }
  },
  
  "resetPassword": {
    "selector":"#nscrEmktFPwd2",
    "submitSelector":"#nscrEmktSubmitO4",
    "genericError":"div#nscrEmktFPwd2 p.nscrEmktGError",
    "fields": {
      "email": {"type":"text","selector":"#nscrEmktFpwd2Email", "actorOff":"checkmark,tip", "validate":"rules[email]", "defaultText":"E-mail Address"},
      "resetCode": {"type":"text","selector":"#nscrEmktFpwd2RCode", "actorOff":"checkmark,tip", "validate":"", "defaultText":"Reset Code"}
    }
  },
  
  "register": {
    "selector":"#nscrEmktFormSignUp",
    "submitSelector":"#nscrEmktSubmitO2",
    "genericError":"div#nscrEmktSignUp p.nscrEmktGError",
    "fields": {
      "firstName": {"type":"text","selector":"#nscrEmktSupFname", "actorOff":"checkmark,tip", "validate":"rules[custom[registerName],length[1,20]]", "defaultText":"First Name"},
      "lastName": {"type":"text","selector":"#nscrEmktSupLname", "validate":"rules[custom[registerName],length[1,20]]", "defaultText":"Last Name"},
      "displayName": {"type":"text","selector":"#nscrEmktSupDname", "tipSelector": "#nscrEmktSupDname", "validate":"rules[length[3,12]]", "defaultText":"Display Name (3-12 characters)", "tip":"No spaces. Choose your tag name wisely."},
      "email": {"type":"text","selector":"#nscrEmktSupEmail", "tipSelector": "#nscrEmktSupEmail", "validate":"rules[email]", "defaultText":"E-mail Address", "tip":"All NASCAR.COM communications will be sent here."},
      "password": {"type":"password","selector":"#nscrEmktSupPwd", "tipSelector": "#nscrEmktSupPwd", "pwdSelector": "#nscrEmktSupPwdDiv", "validate":"rules[length[6,30]]", "defaultText":"Password (Min. 6 characters)", "tip":"Mix lower, upper, and special characters."},
      "confirmPassword": {"type":"password","selector":"#nscrEmktSupCPwd", "pwdSelector": "#nscrEmktSupCPwdDiv", "validate":"rules[length[6,30],match[register,password]", "defaultText":"Confirm Password"},
      "birthMonth": {"type":"select","selector":"#nscrEmktDobM", "actorOff":"error,checkmark,tip", "validate":"rules[custom[validateDob],required]", "defaultText":"Month"},
      "birthDay": {"type":"select","selector":"#nscrEmktDobD", "actorOff":"error,checkmark,tip", "validate":"rules[custom[validateDob],required]", "defaultText":"Day"},
      "birthYear": {"type":"select","selector":"#nscrEmktDobY", "tipSelector": "#nscrEmktTipPopDob", "validate":"rules[custom[validateDob],required]", "defaultText":"Year", "tip":"Legally required."},
      "favoriteDriver": {"type":"select","selector":"#nscrEmktFdriver", "validate":"rules[custom[favoriteDriver],required]", "defaultText":""},
      "legal": {"type":"checkbox","selector":"#nscrEmktSupCboxPP", "actorOff":"error,checkmark,tip", "validate":"rules[custom[registerLegal],required]", "defaultText":""},
      "newsletter1": {"type":"checkbox","selector":"#nscrEmktSupCboxProm", "actorOff":"error,checkmark,tip", "validate":"", "defaultText":"checked"},
      "newsletter2": {"type":"checkbox","selector":"#nscrEmktSupCboxPart", "actorOff":"error,checkmark,tip", "validate":"", "defaultText":"checked"}
    }
  },
  
  "registerOneOff": {
    "selector":"#nscrEmktFormSignUp",
    "fields": {
      "favoriteDriver": {"selector":"#nscrEmktFdriver_input"},
      "birthYear": {"selector":"#nscrEmktDobY_input"}
    }
  },
  
  "completeProfile": {
    "selector":"#nscrEmktFormComplete",
    "submitSelector":"#nscrEmktSubmitCompAct",
    "genericError":"",
    "fields": {
      "favDriverTwo": {"type":"select","selector":"#nscrEmkt2Fdriver", "actorOff":"tip", "validate":""},
      "favDriverThird": {"type":"select","selector":"#nscrEmkt3Fdriver", "actorOff":"tip", "validate":""},
      "gender": {"type":"select","selector":"#nscrEmktGender", "actorOff":"tip", "validate":""},
      "addressOne": {"type":"text","selector":"#nscrEmktActAddress1", "actorOff":"tip", "validate":""},
      "addressTwo": {"type":"text","selector":"#nscrEmktActAddress2", "actorOff":"tip", "validate":""},
      "city": {"type":"text","selector":"#nscrEmktActCity", "actorOff":"tip", "validate":""},
      "state": {"type":"select","selector":"#nscrEmktRecState", "actorOff":"tip", "validate":""},
      "zip": {"type":"text","selector":"#nscrEmktActZip", "actorOff":"tip", "validate":""},
      "country": {"type":"select","selector":"#nscrEmktRecCountry", "actorOff":"tip", "validate":""}
    }
  }
  
};
ms.ui.actor = {

  // CREATE HTML
  "error": function(form,field,message,top,left){
    message = ms.ui.actor.truncate(message);
    if(!ms.methods.defined(top)) { top = -9; }
    if(!ms.methods.defined(left)) { left = 10; }
  
    var id = ms.ui.actor.prefix(form,field,'Error');
    var htmlSelector = "#"+id;
    var html;
    if($(htmlSelector).length === 0) { // create html if it doesn't already exist
      html = ms.methods.clone(ms.ui.object.global.error.selector, id);
      html = html.replace(/<span><\/span>/i, '<span>'+message+'</span>');
  		$(ms.ui.object.global.helper).append(html);
		} else {
  		$(htmlSelector + ' span').html(message);
		}
	  $(htmlSelector).show();
	  ms.ui.actor.position(ms.methods.get(form,field).selector,htmlSelector,top,left);
  },
  
  
  "tip": function(form,field,message,top,left){
    // prevents tips showing on validation errors
    var errSelector = "#"+ms.ui.actor.prefix(form,field,'Error');
    if($(errSelector).css('display') === 'block') { return false; }
    
    // prevents tips showing on successful fields
    var checkSelector = "#"+ms.ui.actor.prefix(form,field,'Checkmark');
    if($(checkSelector).css('display') === 'block') { return false; }

    message = ms.ui.actor.truncate(message);
    if(!ms.methods.defined(top)) { top = -9; }
    if(!ms.methods.defined(left)) { left = 10; }

    var id = ms.ui.actor.prefix(form,field,'Tip');
    var htmlSelector = "#"+id;    
    var html;
    if($(htmlSelector).length === 0) { // create html if it doesn't already exist
      html = ms.methods.clone(ms.ui.object.global.tip.selector, id);
      html = html.replace(/<span><\/span>/i, '<span>'+message+'</span>');
  		$(ms.ui.object.global.helper).append(html);
		} else {
  		$(htmlSelector + ' span').html(message);
		}
	  $(htmlSelector).show();
	  ms.ui.actor.position(ms.methods.get(form,field).tipSelector,htmlSelector,top,left);
  },
  

  "checkmark": function(form, field, top, left){
    if(!ms.methods.defined(top)) { top = 0; }
    if(!ms.methods.defined(left)) { left = 15; }
    var id = ms.ui.actor.prefix(form,field,'Checkmark');
    var htmlSelector = "#"+id;
    var html;
    if($(htmlSelector).length === 0) { // create html if it doesn't already exist
      html = ms.methods.clone(ms.ui.object.global.checkmark.selector, id);
  		$(ms.ui.object.global.helper).append(html);
		}
	  $(htmlSelector).show();
	  
	  ms.ui.actor.position(ms.methods.get(form,field).selector,htmlSelector, top, left);
  },
  
  "genericError": function(form, msg, maxLength) {
    var out = '', maxLength;
    if(!ms.methods.defined(maxLength)) { maxLength = msg.length; }
    if(!ms.methods.defined(ms.ui.object[form].genericError)) { return; }
    if(msg === "") {
      out = "";
    } else {
      out = (msg.length <= maxLength) ? msg : msg.substr(0, maxLength);
      //out = out.substr(0, 1).toUpperCase() + out.substr(1) + ". Try again.";
    }
    $(ms.ui.object[form].genericError).text(out);
  },
  
  "hightlight": function(selector, level, currentBg) {
    if(!ms.methods.defined(currentBg)) { var currentBg = $(selector).css('background-color'); }
    // TODO: Finish this function!      
  },
  
  
  // SETUP OVERLAY
  "rememberEmail": function() {
    if(ms.events.overlay.state.rememberEmail === null || ms.events.overlay.state.rememberEmail === '') { return; }
    $(ms.methods.get('login','email').selector).removeClass(ms.ui.object.global.defaultClass);
    $(ms.methods.get('login','email').selector).val(ms.events.overlay.state.rememberEmail);
  },
  "headerGraphicAndText": function(){
    if(ms.events.overlay.state.type === '') { return; }
    switch(ms.events.overlay.state.type) {
      case "raceView":
      break;
      case "pitCommand":
      break;
      case "scanner":
      break;
    }
  },
  "favoriteDriver": function(){
    if(ms.events.overlay.state.type === null) { return; }
    
  },
  "resetPassword": function(){
    if(ms.events.overlay.state.type === '') { return; }
  },
  
  
  // CONVIENCE METHODS
  
  "callActor": function(form, field, type, helperMsg) {
    if(!ms.ui.actor.actorOff(form, field, type)) {
      switch(type) {
        case "error":
          ms.ui.actor.clearActor(form, field, 'checkmark');
          ms.ui.actor.clearActor(form, field, 'tip');
          ms.ui.actor.error(form, field, helperMsg);
        break;
        case "tip":
          ms.ui.actor.clearActor(form, field, 'checkmark');
          ms.ui.actor.clearActor(form, field, 'tip');
          ms.ui.actor.tip(form, field, helperMsg);
        break;
        case "checkmark":
          ms.ui.actor.clearActor(form, field, 'checkmark');
          ms.ui.actor.clearActor(form, field, 'tip');
          ms.ui.actor.checkmark(form, field);
        break;
      }
    }
  },
  
  
  "clearActor": function(form, field, type) {
    ms.ui.actor.clear.field(form, field, type);
  },
  
  "actorOff": function(form, field, type) {
    if(ms.methods.defined(ms.methods.get(form, field).actorOff)) {
      if(ms.methods.get(form, field).actorOff.indexOf(type) != -1) { return true; }
    }
    return false;
  },
  
  
  // POSITIONING
  "position": function(positionTo, selector, top, left){
    if(!ms.methods.defined(top)) { top = -6; }
    if(!ms.methods.defined(left)) { left = 12; }
    top = Math.round($(positionTo).offset().top + ($(positionTo).height() / 2) + top);
    left = Math.round($(positionTo).offset().left + $(positionTo).width() + left);
    $(selector).css({"top":top,"left":left});
  },
  
  
  "clear": {
    "type": function(form, type){
      $(ms.ui.object.global.helper + ' ' + ms.ui.object.global[type].classSelector).each(function() {
        if($(this).attr('id').indexOf(form) != -1) { $(this).hide(); }
      });
    },
    "typeAll": function(form){
      ms.ui.actor.clear.type(form, 'error');
      ms.ui.actor.clear.type(form, 'tip');
      ms.ui.actor.clear.type(form, 'checkmark');
    },
    "field": function(form, field, type){
      $(ms.ui.object.global[type].classSelector).each(function() {
        if($(this).attr('id').indexOf(form) !== -1 && $(this).attr('id').indexOf(field) !== -1) { $(this).hide(); }
      });
    },
    "fieldAll": function(form, field){
      ms.ui.actor.clear.field(form, field, 'error');
      ms.ui.actor.clear.field(form, field, 'tip');
      ms.ui.actor.clear.field(form, field, 'checkmark');
    }
  },
  
  "toggleTip": function(form,field) {
    var selector = "#"+ms.ui.actor.prefix(form,field,'Tip');
    if ($(selector).length > 0 && $(selector).css('display') == 'block') {
      $(selector).hide();
    } else {
      ms.ui.actor.tip(form,field,ms.methods.get(form,field).tip);
    }
  },
  
  // UTILS
  "prefix": function(form,field,type) {
    return ms.ui.object.global.helperPrefix+form+field+type;
  },
  
  "truncate": function(message) {
    if(message.length > 70) {
      message = message.substr(0, 69);
    }
    if(message.length > 35) {
      var sub1 = message.substr(0,34);
      var sub2 = message.substr(34);
      var sub1Array = sub1.split(" ");
      if(sub1Array.length > 1) {
        sub1 = sub1Array.slice(0, sub1Array.length - 1).join(" ");
        var joinStr = " ";
        if(message.substr(message.indexOf(sub1Array[sub1Array.length - 1]) + 1, 1) !== " ") {
          joinStr = "";
        }
        sub2 = sub1Array[sub1Array.length - 1] + joinStr + sub2;
      }
      message = sub1 + "<br/>" + sub2;
    }
    return message;
  },
  
  errorMessages: {
    transform: function(o){
      if(typeof(o.field) !== "undefined") {
        switch(o.field) {
          case "loginId":
            return o.field + " " + o.error;
          break;
          case "password":
            if(o.error === "invalid") { return "Password incorrect, try again."; }
            return o.field + " " + o.error;
          break;
          case "email":
            if(o.error === "notAvailable") { return "The selected E-mail Address is not available. Select a new one."; }
            else { return o.field + " " + o.error; }
          break;
          case "displayName":
            if(o.error === "notAvailable") { return "The selected Display Name is not available. Select a new one."; }
            else { return o.field + " " + o.error; }
          break;
          default:
            return o.field + " " + o.error;
          break;
        }
      } else {
        switch(o.error) {
          case "user not found":
            return "Login incorrect, try again.";
          break;
          default:
            return o.error;
          break;
        }
      }
    }
  }

};
ms.methods = {
  
  
  "defined": function(variable) {
    try {
      if(typeof(variable) === 'undefined') { return false; }
      else { return true; }
    } catch(e) {
      return false;
    }
  },
  
  
  "get": function(form, field) {
    if(ms.methods.defined(field)) { return ms.ui.object[form].fields[field]; }
    else { return ms.ui.object[form]; }
  },
    
  
  "outerHtml": function(selector) {
    return $('<div>').append($(selector).eq(0).clone()).html();
  },
  
  
  "clone": function(selector, id) {
    var html = ms.methods.outerHtml(selector);
    return html.replace(/id=[\"|']?[a-zA-Z0-9\-\.]+[\"|']?/,'id="'+id+'"');
  },
  
  
  "topLevelDomain": function(domainStr) {
    return /[\w\-]+\.[a-z]{2,6}$/i.exec(domainStr);
  },
  
  "createAuthCookies": function(tid, authId, authPass, dname) {
    var tld = ms.methods.topLevelDomain(location.hostname);
    tid = (tid.substr(0, 1) === "G") ? tid : "G" + tid;
    $.cookie('CNNid', tid, {domain:tld, expiries:14, path:'/'}); // two weeks
    $.cookie('authid', authId, {domain:tld, expiries:14, path:'/'}); // two weeks
    $.cookie('authpass', authPass, {domain:tld, path:'/'}); // session cookie
    $.cookie('displayname', dname, {domain:tld, expiries:14, path:'/'}); // two weeks
  },
  
  "rememberEmailCookie": function(email, isRemember) {
    var tld = ms.methods.topLevelDomain(location.hostname);
    if(isRemember === true) {
      $.cookie('rememberEmail', email, {domain:tld, expiries:14, path:'/'}); // two weeks
    } else {
      $.cookie('rememberEmail', "", {domain:tld, expiries:14, path:'/'}); // two weeks
    }
  },
  
  
  "cleanSerial": function(serial) {
    serial += "&"
    serial = serial.replace(/[\w]+\=\&/g,'');
    if(serial.substr(0, serial.length - 2) !== "&") {
      serial = serial.substr(0, serial.length - 2);
    }
    return serial;
  },
  
  
  "overlay": {
  
    "load": function() {
      // get query parameters
      ms.ui.object.overlay.state.type = ($.query.get('type') || "");
      ms.ui.object.overlay.state.xurl = ($.query.get('xurl') || "");
      ms.ui.object.overlay.state.resetCode = ($.query.get('resetCode') || "");
      ms.ui.object.overlay.state.email = ($.query.get('email') || "");
      ms.ui.object.overlay.state.offerId = (parseInt($.query.get('offerId')) || "");
      ms.ui.object.overlay.state.favoriteDriver = ($.cookie('favoriteDriver') || "");
      ms.ui.object.overlay.state.rememberEmail = ($.cookie('rememberEmail') || "");
      
      // set overlay state
      ms.methods.overlay.rememberEmail();
      if(this.checkOverlayState()) { return; }
      this.close("#nscrEmktHelpers", "#nscrEmktOverlay"); // fix firefox refresh bug
      if(ms.ui.object.overlay.state.type === "" || ms.ui.object.overlay.state.offerId === "") { return; }
      ms.methods.overlay[ms.ui.object.overlay.state.type](ms.ui.object.overlay.state.offerId); // setup the correct views
    },
    "checkOverlayState": function() {
      if(this.checkAuth() && ms.ui.object.overlay.state.xurl !== "") {
        this.xurl();
        return true;
      }
      return false;
    },
    "checkAuth": function() {
      var cnnId = $.cookie('CNNid');
      var authId = $.cookie('authid');
      var authPass = $.cookie('authpass');
      if(cnnId === null | authId === null | authPass === null) {
        return false;
      }
      return true
    },
    "xurl": function() {
      if(ms.ui.object.overlay.state.xurl !== '') {
        location.href = ms.ui.object.overlay.state.xurl;
      } else {
        this.close("#nscrEmktHelpers", "#nscrEmktOverlay");
      }
    },
    "go": function(type, xurl, offerId) {
      if(typeof(offerId) === "undefined") { 
        var offerId = -1;
      }
      ms.ui.object.overlay.state.type = type;
      ms.ui.object.overlay.state.xurl = xurl;
      if(this.checkAuth()) {
        this.xurl();
      } else {
        ms.methods.overlay[type](offerId); // setup the correct views
      }
    },
    "forgotPassword": function() {
      ms.ui.object.overlay.state.type = "forgotPassword";
      this.open();
    },
    "defaultOverlay": function() {
      ms.ui.object.overlay.state.type = "defaultOverlay";
      ms.methods.overlay.headerGraphic(ms.ui.object.overlay.logo, ms.ui.object.overlay.defaultOverlay.logoClass);
      ms.methods.overlay.headerGraphic(ms.ui.object.overlay.header, ms.ui.object.overlay.defaultClass);
      $(ms.ui.object.overlay.bulletHide).hide();
      $(ms.ui.object.overlay.text).text(ms.ui.object.overlay.defaultOverlay.text);
      this.open();
    },
    "community": function() {
      ms.ui.object.overlay.state.type = "community";
      ms.methods.overlay.headerGraphic(ms.ui.object.overlay.logo, ms.ui.object.overlay.community.logoClass);
      ms.methods.overlay.headerGraphic(ms.ui.object.overlay.header, ms.ui.object.overlay.defaultClass);
      $(ms.ui.object.overlay.bulletHide).hide();
      $(ms.ui.object.overlay.community.bullet).show();
      $(ms.ui.object.overlay.text).text(ms.ui.object.overlay.community.text);
      this.open();
    },
    "raceView": function(offerId) {
      ms.ui.object.overlay.state.type = "raceView";
      ms.methods.overlay.headerGraphic(ms.ui.object.overlay.logo, ms.ui.object.overlay.raceView.logoClass);
      ms.methods.overlay.headerGraphic(ms.ui.object.overlay.header, ms.ui.object.overlay.purchaseClass);
      $(ms.ui.object.overlay.bulletHide).hide();
      $(ms.ui.object.overlay.raceView.bullet).show();
      $(ms.ui.object.overlay.text).text(this.offerText(offerId, ms.ui.object.overlay.raceView.text));
      this.open();
    },
    "pitCommand": function(offerId) {
      ms.ui.object.overlay.state.type = "pitCommand";
      ms.methods.overlay.headerGraphic(ms.ui.object.overlay.logo, ms.ui.object.overlay.pitCommand.logoClass);
      ms.methods.overlay.headerGraphic(ms.ui.object.overlay.header, ms.ui.object.overlay.purchaseClass);
      $(ms.ui.object.overlay.bulletHide).hide();
      $(ms.ui.object.overlay.pitCommand.bullet).show();
      $(ms.ui.object.overlay.text).text(this.offerText(offerId, ms.ui.object.overlay.pitCommand.text));
      this.open();
    },
    "scanner": function(offerId) {
      ms.ui.object.overlay.state.type = "scanner";
      ms.methods.overlay.headerGraphic(ms.ui.object.overlay.logo, ms.ui.object.overlay.scanner.logoClass);
      ms.methods.overlay.headerGraphic(ms.ui.object.overlay.header, ms.ui.object.overlay.purchaseClass);
      $(ms.ui.object.overlay.bulletHide).hide();
      $(ms.ui.object.overlay.scanner.bullet).show();
      $(ms.ui.object.overlay.text).text(this.offerText(offerId, ms.ui.object.overlay.scanner.text));
      this.open();
    },
    "rememberEmail": function() {
      if(ms.ui.object.overlay.state.rememberEmail === null || ms.ui.object.overlay.state.rememberEmail === '') { return; }
      $(ms.methods.get('login','rememberEmail').selector).attr('checked', true);
      $(ms.ui.object.login.fields.email.selector).removeClass(ms.ui.object.global.defaultClass);
      $(ms.ui.object.login.fields.email.selector).val(ms.ui.object.overlay.state.rememberEmail);
    },
    "headerGraphic": function(selector, className){
      $(selector).attr('class', className);
    },
    "text": function(selector, text) {
      $(selector).text(text);
    },
    "favoriteDriver": function(){},
    "resetPassword": function(){},
    "close": function(helpers, overlay) {
      var t;
      // hide tips, errors, checkmarks
      $("div[id^='"+ms.ui.object.global.helperPrefix+"']").hide();
      // remove text in input fields and reset class names
      $(overlay + " input[type='text']").each(function(){
        t = $(this);
        t.val("");
        if(t.hasClass(ms.ui.object.global.defaultClass) === false) {
          t.addClass(ms.ui.object.global.defaultClass);
        }
      });
      $(overlay + " input[type='password']").each(function(){
        t = $(this);
        t.val("");
        if(t.hasClass(ms.ui.object.global.defaultClass) === false) {
          t.addClass(ms.ui.object.global.defaultClass);
        }
      });
      $("input[id$='_input']").each(function(){
        $(this).attr("class", "nscrEmktSelectbox");
      });
      $("#mypassword_bar").css('width','0');
      $("#mypassword_text").text('');
      $(overlay).hide();
    },
    "open": function() {
      window.scroll(0,0);
      $(ms.ui.object.overlay.selector).show();
      ms.omniture.overlay.open();
    },
    "offerText": function(offerId, defaultText) {
      if(offerId === -1 || typeof(offerId) === "undefined") { offerId = ms.ui.object.overlay.state.offerId; }
      switch(offerId) {
        case 1:
          return "Thanks for choosing TrackPass Scanner Monthly with Free Trial";
        case 2:
          return "Thanks for choosing TrackPass Scanner Annual with Free Trial";
        case 6:
          return "Thanks for choosing TrackPass PitCommand Monthly with Free Trial";
        case 9:
          return "Thanks for choosing TrackPass PitCommand Annual with Free Trial";
        case 104:
          return "Thanks for choosing TrackPass RaceView Monthly with 14 Day Free Trial";
        case 108:
          return "Thanks for choosing TrackPass RaceView Annual with 14 Day Free Trial";
        default:
          return defaultText;
        break;
      }
    }
  },
  
  
  "forms": {
  
    "init": function(form){
      var formObj = ms.ui.object[form];
      $(formObj.submitSelector).click(function() {
        $(formObj.selector).triggerHandler("submit");
      });
      //ms.methods.forms.setAllDefaultText(form, true);
      //ms.methods.forms.setAllDefaultTextEvents(form);
      ms.methods.forms.setDefaultEvents(form);
    },
    
    
    "setAllDefaultText": function(form, force) {
      var formObj = ms.methods.get(form);
      for(var field in formObj.fields) {
        if(formObj.fields.hasOwnProperty(field)) {
          this.setDefaultText(formObj.fields[field], force);
        }
      }
    },
    
    
    "setDefaultText": function(fieldObj, force) {
      if(ms.methods.defined(fieldObj.defaultText)) {
        force = (ms.methods.defined(force)) ? force : false;
        switch(fieldObj.type) {
          case "text":
            if($(fieldObj.selector).val() === '' | force) { $(fieldObj.selector).val(fieldObj.defaultText); }
          break;
          case "password":
            if($(fieldObj.selector).val() === '' | force) { $(fieldObj.selector).val(fieldObj.defaultText); }
          break;
          case "select":
            if($(fieldObj.selector).val() === '' | force) { $(fieldObj.pwdSelector).val(fieldObj.defaultText); }
          break;
          case "checkbox":
            $(fieldObj.selector).attr('checked',fieldObj.defaultText);
          break;
        }
      }
    },
    
    
    "clearAllDefaultText": function(form) {
      var formObj = ms.methods.get(form);
      for(var field in formObj.fields) {
        if(formObj.fields.hasOwnProperty(field)) {
          ms.methods.forms.clearDefaultText(formObj.fields[field]);
        }
      }
    },
    
    
    "clearDefaultText": function(fieldObj) {
      if(fieldObj.type == 'text' && $(fieldObj.selector).val() == fieldObj.defaultText) {
        $(fieldObj.selector).val('');
      }
    },
    
    "setDefaultEvents": function(form) {
      var formObj = ms.ui.object[form];
      for(var field in formObj.fields) {
        var fieldObj = formObj.fields[field];
        if(formObj.fields.hasOwnProperty(field)) {
          $(fieldObj.selector).focus(function() {
            if($(this).hasClass(ms.ui.object.global.defaultClass)) {
              $(this).removeClass(ms.ui.object.global.defaultClass);
            }
          });
          if(fieldObj.type !== 'select') {
            $(fieldObj.selector).blur(function() {
              if($(this).val() === '' && !$(this).hasClass(ms.ui.object.global.defaultClass)) { 
                $(this).addClass(ms.ui.object.global.defaultClass);
              }
            });
          }
        }
      }
    },
    
    "setAllDefaultTextEvents": function(form) {
      var formObj = ms.methods.get(form);
      for(var field in formObj.fields) {
        if(formObj.fields.hasOwnProperty(field)) {
          if(formObj.fields[field].type == 'text') {
            ms.methods.forms.textBlurFocus(formObj.fields[field]);
          } else if(formObj.fields[field].type == 'password') {
            ms.methods.forms.passwordBlurFocus(formObj.fields[field]);
          }
        }
      }
    },
    
    
    "textBlurFocus": function(fieldObj){   
      $(fieldObj.selector).focus(function() {
        if($(this).val() === fieldObj.defaultText) { $(this).val(''); }
      });
      $(fieldObj.selector).blur(function() {
        if($(this).val() === '') { $(this).val(fieldObj.defaultText); }
      });
    },
    
    
    "passwordBlurFocus": function(fieldObj){
      $(fieldObj.pwdSelector).click(function() {
        $(this).hide();
        $(fieldObj.selector).focus();
      });
      $(fieldObj.selector).focus(function() {
        $(fieldObj.pwdSelector).hide();
      });
      $(fieldObj.selector).blur(function() {
        if($(this).val() === '') {
          $(fieldObj.pwdSelector).show();
        }
      });
    },
    
    
    "submitValues": function(uiFormObj) {
      for(var field in uiFormObj.fields) {
        if(uiFormObj.fields.hasOwnProperty(field)) {
          var fieldObj = uiFormObj.fields[field];
          if(fieldObj.type == 'text' && $(fieldObj.selector).val() == fieldObj.defaultText) {
            $(fieldObj.selector).val('');
          }
        }
      }
    },
    
    "reset": function(selector) {
      $(selector + " input").each(function(){
        $(this).val('');
      });
    }
    
  }
  
};
ms.methods.validate = {

  "form": function(form, submit){
    if(typeof(submit) === "undefined") { var submit = false; }
    var formObj = ms.methods.get(form);
    for(var field in formObj.fields) {
      if(ms.methods.validate.run(form, field, submit) !== true) {
        return false;
      }
    }
    return true;
  },
  
  "parseRules":function(rulesStr){
    // rulesStr format: rules[email,default,blank,length[0,20]]
    if(rulesStr === "") {
      return "";
    }
    var rulesRegExp = /\[(.*)\]/;
    var getRules = rulesRegExp.exec(rulesStr);
    var str = getRules[1];
    var pattern = /\W+/;
    return str.split(pattern);
  },
  
  
  "run": function(form, field, submit){
    var val = $(ms.ui.object[form].fields[field].selector).val();
    if(typeof(submit) === "undefined") { var submit = false; }
    if(ms.ui.object[form].fields[field].validate.indexOf('custom[') !== -1) {
      return ms.methods.validate.customValidation(form,field,submit);
    } else if(val !== '' || submit === true) {
      return ms.methods.validate.normalValidation(form,field);
    } else if(val === '') {
      ms.ui.actor.clearActor(form, field, 'error');
    }
  },
  
  
  "customValidation": function(form, field, submit) {
    var begin, end, rules, method;
    rules = ms.ui.object[form].fields[field].validate;
    begin = rules.indexOf('custom[') + 7;
    end = rules.substr(begin).indexOf(']');
    result = rules.substr(begin, end);
    return ms.methods.validate.customValidators[result](form,field,submit);
  },
  
  
  "normalValidation": function(form, field) {
    var trueOrErr = ms.methods.validate.validate(form,field);
    if(trueOrErr !== true) {
      ms.ui.actor.callActor(form, field, 'error', trueOrErr);
      return false;
    }
    ms.ui.actor.clearActor(form, field, 'error');
    ms.ui.actor.clearActor(form, field, 'tip');
    if(!ms.ui.actor.actorOff(form, field, 'checkmark')) { ms.ui.actor.checkmark(form, field); }
    return true;
  },
  
  
  "validate": function(form, field) {
    var formObj = ms.ui.object[form];
    var fieldObj = formObj.fields[field];
    var rules = ms.methods.validate.parseRules(fieldObj.validate);
    for(var i=0;i<rules.length;i++) {
      switch(rules[i]) {
        case "string":
          if(!ms.methods.validate.test._string(fieldObj,rules,i)) {
             return ms.methods.validate.text(fieldObj,rules,i);
          }
        break;
        case "length":
          if(!ms.methods.validate.test._length(fieldObj,rules,i)) {
             return ms.methods.validate.text(fieldObj,rules,i);
          }
        break;
        case "email":
          if(!ms.methods.validate.test._email(fieldObj,rules,i)) {
            return ms.methods.validate.text(fieldObj,rules,i);
          }
        break;
        case "blank":
          if(!ms.methods.validate.test._blank(fieldObj,rules,i)) {
            return ms.methods.validate.text(fieldObj,rules,i);
          }
        break;
        case "required":
          if(!ms.methods.validate.test._required(fieldObj,rules,i)) {
            return ms.methods.validate.text(fieldObj,rules,i);
          }
        break;
        case "match":
          if(!ms.methods.validate.test._match(fieldObj,rules,i)) {
            return ms.methods.validate.text(fieldObj,rules,i);
          }
        break;
      }
    }
    return true;
  },
  
  
  // VALIDATORS
  "test": {
    "_string": function(field,rules,i){
      return $(field.selector).val().test(/[\w]+/);
    },
    "_length": function(field,rules,i){
      var value = $(field.selector).val();
      var size = value.length;
      if(size >= rules[i+1] && size <= rules[i+2]) { return true; }
      else { return false; }
    },
    "_email": function(field,rules,i){
      var value = $(field.selector).val();
      var myregexp = new RegExp(/^[A-Z0-9._%+\-]+@[A-Z0-9.\-]+\.[A-Z]{2,4}$/i);
      return myregexp.test(value);
    },
    "_regex": function(field,rules,i){ // must be called directy
      return false;
    },
    "_required": function(field,rules,i){
      var value;
      switch(field.type) {
        case "checkbox":
          value = $(field.selector).attr('checked');
        break;
        default:
          value = $(field.selector).val();      
        break;
      }
      if(!value) {
        return false; 
      } else {
        return true; 
      }
    },
    "_match": function(field,rules,i){
      var value = $(field.selector).val();
      var fieldMatch = $(ms.methods.get(rules[i+1],rules[i+2]).selector).val();
      if(value === fieldMatch) { return true; } 
      else { return false; }
    },
    "_date": function isDate(txtDate){  
      // expected format is mm/dd/yyyy
      var objDate, mSeconds;
      if (txtDate.length != 10){return false;}
      var day = txtDate.substring(3,5) - 0;
      var month = txtDate.substring(0,2) - 1; // because months in JS start with 0
      var year = txtDate.substring(6,10) - 0;
      if (txtDate.substring(2,3) != '/'){return false;}
      if (txtDate.substring(5,6) != '/'){return false;}
      if (year < 999 || year > 3000){return false;}
      mSeconds = (new Date(year, month, day)).getTime();
      objDate = new Date();
      objDate.setTime(mSeconds);  
      if(objDate.getFullYear() != year){return false;}
      if(objDate.getMonth() != month){return false;}
      if(objDate.getDate() != day){return false;}
      return true;
    }
  },
  
  
  // EVENTS
  "bind": function(form){
    var formObj = ms.methods.get(form);
    for(var field in formObj.fields) {
      if(formObj.fields.hasOwnProperty(field)) {
        //if(formObj.fields[field].type === "select") { fieldName += "_input"; }
        (function(formName, fieldName) {
          var el = $(formObj.fields[fieldName].selector);
          el.blur(function(e) {
            ms.methods.validate.run(formName, fieldName); 
          });
        })(form, field);
      }
    }
  },
  
  
  // DEFAULT ERROR MESSAGES
  "text": function(fieldObj,rules,i) {
    switch(rules[i]) {
      case "length":
        return rules[i+1] + "-" + rules[i+2] + " characters long.";
      case "blank":
      case "required":
        return "This field(s) is required.";
      case "match":
        return "Fields did not match.";
      case "email":
        return "Please enter a valid e-mail address.";
      case "regex":
        return "Format is incorrect.";
      default:
        return "Please correct the information you entered.";
    }
  },
  
  // ONE-OFFS
  "customValidators": {
    "registerName": function(form,field,submit) {
      var i, trueOrErr = [], values = [], actorField, requiredField;
      actorField = 'lastName';
      values[0] = $(ms.ui.object[form].fields['firstName'].selector).val();
      values[1] = $(ms.ui.object[form].fields['lastName'].selector).val();
      if(values[0] !== "" || submit === true) { trueOrErr[0] = ms.methods.validate.validate(form, 'firstName'); }
      if(values[1] !== "" || submit === true) { trueOrErr[1] = ms.methods.validate.validate(form, 'lastName'); }
      for(i=0; i<trueOrErr.length;i++) {
        if(trueOrErr[i] !== true) {
          ms.ui.actor.clearActor(form, actorField, 'checkmark');
          ms.ui.actor.callActor(form, actorField, 'error', trueOrErr[i]);
          return false;
        }
      }
      ms.ui.actor.clearActor(form, actorField, 'checkmark');
      ms.ui.actor.clearActor(form, actorField, 'error');
      if(values[0] !== "" && values[1] !== "" && values[2] !== "") {
        ms.ui.actor.checkmark(form, actorField);
      }
      return true;
    },
    "validateDob": function(form,field,submit) {
      var m,d,y,r,that=ms.methods.validate;
      m = that.utils.twoDigitMonth($(ms.ui.object['register'].fields['birthMonth'].selector).val());
      d = that.utils.twoDigitDay($(ms.ui.object['register'].fields['birthDay'].selector).val());
      y = $(ms.ui.object['register'].fields['birthYear'].selector).val();
      if(submit === false && (m === "" || d === "" || y === "")) {
        ms.ui.actor.clearActor('register', 'birthYear', 'checkmark');
        return false;
      }
      r = this.registerDateOfBirth(form,field,submit);
      if(r === false) {
        ms.ui.actor.clearActor('register', 'birthYear', 'checkmark');
        ms.ui.actor.error('register', 'birthYear', 'This field(s) is required.', -6, 25);
        return false;
      }
      r = this.validDate(m,d,y);
      if(r === false) {
        ms.ui.actor.clearActor('register', 'birthYear', 'checkmark');
        ms.ui.actor.error('register', 'birthYear', 'Please enter a valid date.', -6, 25);
        return false;
      }
      r = this.checkAge(m,d,y);
      if(r === false) {
        ms.ui.actor.clearActor('register', 'birthYear', 'checkmark');
        ms.ui.actor.genericError('register', 'You are not eligible for an account at this time.');
        return false;
      } else {
        ms.ui.actor.genericError('register', '');
      }
      ms.ui.actor.clearActor('register', 'birthYear', 'error');
      ms.ui.actor.checkmark('register', 'birthYear', -3, 60);
      return true;
    },
    "registerDateOfBirth": function(form,field,submit) {
      var i, trueOrErr = [], values = [];
      values[0] = $(ms.ui.object[form].fields['birthMonth'].selector).val();
      values[1] = $(ms.ui.object[form].fields['birthDay'].selector).val();
      values[2] = $(ms.ui.object[form].fields['birthYear'].selector).val();
      trueOrErr[0] = ms.methods.validate.validate(form, field);
      trueOrErr[1] = ms.methods.validate.validate(form, field);
      trueOrErr[2] = ms.methods.validate.validate(form, field);
      for(i=0; i<trueOrErr.length;i++) {
        if(trueOrErr[i] !== true) {
          return false;
        }
      }
    },
    validDate: function(m,d,y) {
      var date, that = ms.methods.validate;
      date = m + "/" + d + "/" + y
      if(that.test._date(date)) {
        return true;
      } else {
        return false;
      }
    },
    checkAge: function(m,d,y) {
      var m, d, y, date, that = ms.methods.validate;
      if(that.utils.calcAge(m,d,y) >= 13) {
        return true;
      } else {
        return false;
      }
    },
    "registerLegal": function(form,field,submit) {
      var trueOrErr = ms.methods.validate.validate(form,field);
      if(trueOrErr === true) {
        ms.ui.actor.genericError(form, '');
        return true;
      } else {
        ms.ui.actor.genericError(form, 'You must agree to the Privacy Policy.');
        return false;
      }
    },
    "favoriteDriver": function(form,field,submit) {
      if(submit === false && $(ms.ui.object[form].fields[field].selector).val() === "") {
        ms.ui.actor.clearActor('register', 'favoriteDriver', 'checkmark');
        return false;
      }
      var trueOrErr = ms.methods.validate.validate(form, field);
      if(trueOrErr !== true) {
        ms.ui.actor.clearActor('register', 'favoriteDriver', 'checkmark');
        ms.ui.actor.error('register', 'favoriteDriver', trueOrErr, -6, 25);
        return false;
      }
      ms.ui.actor.clearActor('register', 'favoriteDriver', 'error');
      ms.ui.actor.checkmark('register', 'favoriteDriver', -3, 30);
      return true;
    }
  },
  
  // UTILS
  utils: {
    twoDigitMonth: function(monthStr) {
      monthStr = monthStr.toLowerCase();
      monthStr = monthStr.replace(/\s/g, '');
      switch(monthStr) {
        case "january":
          return "01";
        break;
        case "february":
          return "02";
        break;
        case "march":
          return "03";
        break;
        case "april":
          return "04";
        break;
        case "may":
          return "05";
        break;
        case "june":
          return "06";
        break;
        case "july":
          return "07";
        break;
        case "august":
          return "08";
        break;
        case "september":
          return "09";
        break;
        case "october":
          return "10";
        break;
        case "november":
          return "11";
        break;
        case "december":
          return "12";
        break;
      }
      return null;
    },
    twoDigitDay: function(dayStr) {
      dayStr = dayStr.replace(/\s/g, '');
      return (dayStr.length === 1) ? "0" + dayStr : dayStr;
    },
    calcAge: function(dobM, dobD, dobY) {
      var date = new Date(); 
      var d = parseInt(date.getDate()), m = parseInt(date.getMonth()) + 1, y = parseInt(date.getFullYear());
      dobM = parseInt(dobM);
      dobD = parseInt(dobD);
      dobY = parseInt(dobY);
      if(dobM < m) {
        return (y - dobY);
      } else if (dobM == m && dobD <= d) {
        return (y - dobY);
      } else {
        return (y - dobY) - 1;
      }
    }
  }
  
};

ms.api = {

  apiUrl: ms.config.api,
  blank: ms.config.blank,
  
  login: function(s) {
    s.url = ms.api.apiUrl + '/login';
    ms.api.request(s);
  },
  
  register: function(s) {
    // parameters: email, displayName, password, passwordConfirmation, firstname, lastname
    //  legal, newsletter, monthOfBirth, dayOfBirth, yearOfBrith, favoriteDriver
    s.url = ms.api.apiUrl + '/register';
    ms.api.request(s);
  },
  
  user: {
    edit: function(s) {
      s.url = ms.api.apiUrl + '/user.edit';
      ms.api.request(s);
    },
    get: function(s) {
      s.url = ms.api.apiUrl + '/user.get';
      ms.api.request(s);
    }
  },
  
  email: { // not implemented on legacy api
    add: function(s){
      s.url = ms.api.apiUrl + '/email.add';
      ms.api.request(s);
    },
    "delete": function(s) {
      s.url = ms.api.apiUrl + '/email.delete';
      ms.api.request(s);
    }
  },
  
  newsletter: {
    subscribe: function(s) {
      // parameters: tId, authId, name, <email>
      s.url = ms.api.apiUrl + '/newsletter.subscribe';
      ms.api.request(s);
    },
    unsubscribe: function(s) {
      // parameters: tId, authId, name
      s.url = ms.api.apiUrl + '/newsletter.unsubscribe';
      ms.api.request(s);
    },
    getAll: function(s) {
      // parameters: tId, authId
      s.url = ms.api.apiUrl + '/newsletter.getAll';
      ms.api.request(s);
    },
    get: function(s) {
      // parameters: tId, authId, name
      s.url = ms.api.apiUrl + '/newsletter.get';
      ms.api.request(s);
    }
  },
  
  request: function(s) {
    if(!ms.methods.defined(s.url)) { return false; }
    if(!ms.methods.defined(s.type)) {
      if(ms.methods.defined(s.data)) {
        s.type = 'POST';
      } else {
        s.type = 'GET';
      }
    }
    if(!ms.methods.defined(s.windowname)) { s.windowname = true; }
    if(!ms.methods.defined(s.localfile)) { s.localfile = ms.api.blank; }
    $.ajax(s);
  }  
  
};
ms.omniture = {
	overlay: {
		open: function(){
			if(ms.omniture.available() === false) { return; }
			if (s_account != "") {
				s.pageName="NMS Storefront Overlay"				
				void(s.t());
			}			
		}
	},
	available: function() {
	  if(typeof(s) === "undefined") { return false; }
		if(typeof(s.t) === "undefined") { return false; }
		return true
	}
};
$(document).ready(function() {
  ms.events.overlay.init();
  ms.events.login.init();
  ms.events.register.init();
});
