<?xml version="1.0"?>
<News hasArchived="true" page="8801" pageCount="10714" pageSize="10" timestamp="Sun, 05 Jul 2026 08:29:17 -0400" url="https://my3.my.umbc.edu/posts.xml?page=8801">
<NewsItem contentIssues="true" id="28276" important="false" status="posted" url="https://my3.my.umbc.edu/posts/28276">
<Title>SGA Election Results</Title>
<Tagline>Elections Board announced winners from the SGA elections</Tagline>
<Body>
<![CDATA[
    <div class="html-content">
    <p>A hotly contested <span>SGA</span> election season ended tonight at 7:30 p.m. in The Commons Student Org Space. <span>Arash</span> <span>Fallah</span> and Jeffrey <span>Kee</span> were announced as the President-elect and Executive Vice President-elect of the <span>UMBC</span> Student Government Association.</p>
    <p>Fallah and <span>Kee</span> brought in 1,300 votes, which represented 37.9 percent of the total turnout. The Elections Board Chair Collin <span>Wojciechowski</span>announced that this year's turnout of 3,532 votes is a new <span>UMBC</span> record.</p>
    <p><span>Hamza</span> <span>Siddiqui</span> and Melissa <span>Hom</span> brought in 1,091 votes, representing 31.8 percent of the vote, while Max <span>Barnhart</span> and <span>Ganesh</span> Mysore pulled in 1,004 votes, which is 29.3 percent of ballots cast.</p>
    <p><strong>Read the rest of the story <a href="http://www.retrieverweekly.com/sga-election-results-1.3036253#.UXnT9yt375k" rel="nofollow external" class="bo">here</a>.</strong></p>
    <p><strong><br></strong></p>
    <p><strong>We'll have a follow-up article in the print edition on Tuesday, check it out!</strong></p>
    </div>
]]>
</Body>
<Summary>A hotly contested SGA election season ended tonight at 7:30 p.m. in The Commons Student Org Space. Arash Fallah and Jeffrey Kee were announced as the President-elect and Executive Vice...</Summary>
<Website>http://www.retrieverweekly.com/sga-election-results-1.3036253#.UXnT9yt375k</Website>
<AttachmentKind>Document</AttachmentKind>
<AttachmentUrl>https://assets1-my.umbc.edu/system/shared/attachments/52a8aadd459a2e4dd4a6ef360153a591/6a4a4e1d/news/000/028/276/1299c1b7a9e0c2bf41af69c449464a49/2013 Student Election Results.pdf?1366938770</AttachmentUrl>
<Attachments>
<Attachment kind="Document" url="https://my3.my.umbc.edu/posts/28276/attachments/9979"></Attachment>
</Attachments>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/28276/guest@my.umbc.edu/22bd554021f7d1249584e105047352f4/api/pixel</TrackingUrl>
<Tag>elections</Tag>
<Tag>government</Tag>
<Tag>results</Tag>
<Tag>sga</Tag>
<Tag>student</Tag>
<Tag>studentgovernment</Tag>
<Group token="retired-26">The Retriever Weekly</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-26</GroupUrl>
<AvatarUrl>https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/026/c51c55cec7054dd833f192a7895b378c/xsmall.png?1341372037</AvatarUrl>
<AvatarUrl size="original">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/026/c51c55cec7054dd833f192a7895b378c/original.png?1341372037</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/026/c51c55cec7054dd833f192a7895b378c/xxlarge.png?1341372037</AvatarUrl>
<AvatarUrl size="xlarge">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/026/c51c55cec7054dd833f192a7895b378c/xlarge.png?1341372037</AvatarUrl>
<AvatarUrl size="large">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/026/c51c55cec7054dd833f192a7895b378c/large.png?1341372037</AvatarUrl>
<AvatarUrl size="medium">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/026/c51c55cec7054dd833f192a7895b378c/medium.png?1341372037</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/026/c51c55cec7054dd833f192a7895b378c/small.png?1341372037</AvatarUrl>
<AvatarUrl size="xsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/026/c51c55cec7054dd833f192a7895b378c/xsmall.png?1341372037</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/026/c51c55cec7054dd833f192a7895b378c/xxsmall.png?1341372037</AvatarUrl>
<Sponsor>The Retriever Weekly</Sponsor>
<ThumbnailUrl size="xxlarge">https://assets1-my.umbc.edu/system/shared/thumbnails/news/000/028/276/33190d14d318d1c823c983c952c1fac8/xxlarge.jpg?1366938537</ThumbnailUrl>
<ThumbnailUrl size="xlarge">https://assets1-my.umbc.edu/system/shared/thumbnails/news/000/028/276/33190d14d318d1c823c983c952c1fac8/xlarge.jpg?1366938537</ThumbnailUrl>
<ThumbnailUrl size="large">https://assets1-my.umbc.edu/system/shared/thumbnails/news/000/028/276/33190d14d318d1c823c983c952c1fac8/large.jpg?1366938537</ThumbnailUrl>
<ThumbnailUrl size="medium">https://assets3-my.umbc.edu/system/shared/thumbnails/news/000/028/276/33190d14d318d1c823c983c952c1fac8/medium.jpg?1366938537</ThumbnailUrl>
<ThumbnailUrl size="small">https://assets1-my.umbc.edu/system/shared/thumbnails/news/000/028/276/33190d14d318d1c823c983c952c1fac8/small.jpg?1366938537</ThumbnailUrl>
<ThumbnailUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/thumbnails/news/000/028/276/33190d14d318d1c823c983c952c1fac8/xsmall.jpg?1366938537</ThumbnailUrl>
<ThumbnailUrl size="xxsmall">https://assets3-my.umbc.edu/system/shared/thumbnails/news/000/028/276/33190d14d318d1c823c983c952c1fac8/xxsmall.jpg?1366938537</ThumbnailUrl>
<PawCount>26</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Thu, 25 Apr 2013 21:10:58 -0400</PostedAt>
<EditAt>Thu, 25 Apr 2013 21:56:55 -0400</EditAt>
</NewsItem>

<NewsItem contentIssues="false" id="28277" important="false" status="posted" url="https://my3.my.umbc.edu/posts/28277">
<Title>Scripting Made Easier with the Eclipse JavaScript Development Tools (JSDT)</Title>
<Body>
<![CDATA[
    <div class="html-content"><p>The JavaScript Development Tools (JSDT) plug-in supports the development of JavaScript-powered applications as well as JavaScript within traditional web applications. In today's article, Rob Gravelle demonstrates how use the JSDT plugin to enhance the development of a static web project.</p></div>
]]>
</Body>
<Summary>The JavaScript Development Tools (JSDT) plug-in supports the development of JavaScript-powered applications as well as JavaScript within traditional web applications. In today's article, Rob...</Summary>
<Website>http://www.htmlgoodies.com/HTML5/javascript/scripting-made-easier-with-the-eclipse-javascript-development-tools-jsdt.html</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/28277/guest@my.umbc.edu/df5baff28240e6af81c7c80a52cfd2b4/api/pixel</TrackingUrl>
<Tag>html</Tag>
<Tag>htmlgoodies</Tag>
<Tag>learning</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Thu, 25 Apr 2013 20:06:00 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="28274" important="false" status="posted" url="https://my3.my.umbc.edu/posts/28274">
<Title>2013 SGA Election Results</Title>
<Body>
<![CDATA[
    <div class="html-content">by Craig Berger<br>
    <br>
    3,532 students (or 32.2% of the undergraduate population) voted in this year's SGA election, the largest turnout in UMBC history (previous record: last year's 3,216 votes).  Congratulations to all the newly elected leaders (in bold) and all of the students who had the courage to run.  The new officers will be inaugurated at a public ceremony on Monday, May 13 at noon on The Quad.<br>
    <br>
    <br>
    <strong>PRESIDENT AND EXECUTIVE VICE PRESIDENT</strong><br>
    <br>
    <strong>Arash Fallah (President) and Jeffrey Kee (Executive Vice President):  1300 votes (37.9%)</strong><br>
    <br>
    Hamza Siddiqui (President) and Melissa Hom (Executive Vice President): 1091 votes (31.8%)<br>
    <br>
    Max Barnhart (President) and Ganesh Mysore (Executive Vice President): 1004 votes (29.3%)<br>
    <br>
    Other: 54 votes (0.0%)<br>
    <br>
    <br>
    <strong>VICE PRESIDENT FOR STUDENT ORGANIZATIONS</strong><br>
    <br>
    <strong>Hannah Khan: 2,044 votes (93.1%)</strong><br>
    <br>
    Other: 155 votes (6.9%)<br>
    <br>
    <br>
    <strong>TREASURER</strong><br>
    <br>
    <strong>Haneen Daham: 1,847 votes (92.3%)</strong><br>
    <br>
    Other: 158 votes (7.7%)<br>
    <br>
    <br>
    <strong>SENATOR</strong><br>
    <br>
    <strong>Alex Lee: 1303 votes</strong><br>
    <br>
    <strong>Austin Nam: 1161 votes</strong><br>
    <br>
    <strong>Hayden Marshall: 1140 votes</strong><br>
    <br>
    <strong>Belawoe Akwakoku: 1136 votes</strong><br>
    <br>
    <strong>Ali Shariati: 1130 votes</strong><br>
    <br>
    <strong>Jack Anthony Bautista Neumeier: 1098 votes</strong><br>
    <br>
    <strong>Robert Roselle: 1088 votes</strong><br>
    <br>
    <strong>Kabish Shah: 1065 votes</strong><br>
    <br>
    <strong>Benjamin Alkon: 1061 votes</strong><br>
    <br>
    <strong>Trupti Sindhi: 1058 votes</strong><br>
    <strong><br></strong>
    <strong>Mayur Darji: 1046 votes</strong><br>
    <br>
    Other: 119 votes<br>
    <br>
    <br>
    <strong>FINANCE BOARD REPRESENTATIVE</strong><br>
    <br>
    <strong>Sara Kim: 962 votes</strong><br>
    <br>
    <strong>Daniel Rodriquez: 906 votes</strong><br>
    <br>
    <strong>Ayshah Mahmud: 873 votes</strong><br>
    <br>
    <strong>Taylor Good: 868 votes</strong><br>
    <br>
    <strong>Morgan Mayer: 795 votes</strong><br>
    <br>
    Seth Ofosu-Ameyaw: 743 votes<br>
    <br>
    Gurbani Singh: 733 votes<br>
    <br>
    Other: 81 votes<br>
    <br>
    <br>
    <strong>REFERENDUM A (ELIMINATING SUPREME COURT FROM SGA CONSTITUTION)</strong><br>
    <br>
    <strong>Yes: 1,357 votes (73.1%)</strong><br>
    <br>
    No: 507 votes (26.9%)<br>
    <br>
    <br>
    <em><a href="http://cocreateumbc.blogspot.com/" rel="nofollow external" class="bo">Co-Create UMBC</a> is a blog for and about UMBC, written by David Hoffman and Craig Berger from the Office of Student Life. Join the <a href="http://my.umbc.edu/groups/co-create" rel="nofollow external" class="bo">Co-Create UMBC group</a> on MyUMBC. Like <a href="https://www.facebook.com/cocreateumbc" rel="nofollow external" class="bo">Co-Create UMBC on Facebook</a>. And follow <a href="https://twitter.com/CoCreateUMBC" rel="nofollow external" class="bo">David</a> and <a href="https://twitter.com/CraigBerger" rel="nofollow external" class="bo">Craig</a> on Twitter.</em><span> </span><br>
    <br>
    </div>
]]>
</Body>
<Summary>by Craig Berger    3,532 students (or 32.2% of the undergraduate population) voted in this year's SGA election, the largest turnout in UMBC history (previous record: last year's 3,216 votes)....</Summary>
<Website>http://cocreateumbc.blogspot.com/2013/04/2013-sga-election-results.html</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/28274/guest@my.umbc.edu/a4a1b8ee72f02392d01ff403de6e837a/api/pixel</TrackingUrl>
<Group token="co-create">Co-Create UMBC</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/co-create</GroupUrl>
<AvatarUrl>https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/002/5b8f025dafb56cb8d3088b7259aadcfb/xsmall.png?1499890363</AvatarUrl>
<AvatarUrl size="original">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/002/5b8f025dafb56cb8d3088b7259aadcfb/original.jpg?1499890363</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/002/5b8f025dafb56cb8d3088b7259aadcfb/xxlarge.png?1499890363</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/002/5b8f025dafb56cb8d3088b7259aadcfb/xlarge.png?1499890363</AvatarUrl>
<AvatarUrl size="large">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/002/5b8f025dafb56cb8d3088b7259aadcfb/large.png?1499890363</AvatarUrl>
<AvatarUrl size="medium">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/002/5b8f025dafb56cb8d3088b7259aadcfb/medium.png?1499890363</AvatarUrl>
<AvatarUrl size="small">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/002/5b8f025dafb56cb8d3088b7259aadcfb/small.png?1499890363</AvatarUrl>
<AvatarUrl size="xsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/002/5b8f025dafb56cb8d3088b7259aadcfb/xsmall.png?1499890363</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/002/5b8f025dafb56cb8d3088b7259aadcfb/xxsmall.png?1499890363</AvatarUrl>
<Sponsor>Co-Create UMBC</Sponsor>
<PawCount>51</PawCount>
<CommentCount>21</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Thu, 25 Apr 2013 19:49:00 -0400</PostedAt>
<EditAt>Thu, 25 Apr 2013 19:49:00 -0400</EditAt>
</NewsItem>

<NewsItem contentIssues="true" id="123341" important="false" status="posted" url="https://my3.my.umbc.edu/posts/123341">
<Title>Black and Latino Senior Reception 2013</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <img width="150" height="150" src="https://umbc.edu/wp-content/uploads/2013/04/cblareception-150x150.jpg" alt="" style="max-width: 100%; height: auto;"><p><a href="/wp-content/uploads/2013/04/cblareception.jpg" rel="nofollow external" class="bo"><img alt="cblareception" src="/wp-content/uploads/2013/04/cblareception.jpg" width="640" height="426" style="max-width: 100%; height: auto;"></a>The <a href="http://alumni.umbc.edu/cbla" rel="nofollow external" class="bo">Chapter of Black and Latino Alumni</a> and the Office of Student Life’s Mosaic: Center for Culture and Diversity hosted the Black and Latino Senior Reception yesterday to celebrate the achievements of the Class of 2013. This annual dessert reception presents a great opportunity for black and Latino alumni to connect and network with some of our newly graduating seniors.</p>
    <p>Congratulations to all! <a href="http://www.flickr.com/photos/umbcalumni/sets/72157633350849296/" rel="nofollow external" class="bo">See a full slideshow of photos from the event here.</a></p>
    </div>
]]>
</Body>
<Summary>The Chapter of Black and Latino Alumni and the Office of Student Life’s Mosaic: Center for Culture and Diversity hosted the Black and Latino Senior Reception yesterday to celebrate the...</Summary>
<Website>https://umbc.edu/stories/black-and-latino-senior-reception-2013/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/123341/guest@my.umbc.edu/95f7512b9d21c224d5def4c41ecf5139/api/pixel</TrackingUrl>
<Tag>alumni</Tag>
<Group token="umbc-news-magazine">UMBC News &amp;amp; Magazine</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/umbc-news-magazine</GroupUrl>
<AvatarUrl>https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xsmall.png?1748556657</AvatarUrl>
<AvatarUrl size="original">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/original.png?1748556657</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xxlarge.png?1748556657</AvatarUrl>
<AvatarUrl size="xlarge">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xlarge.png?1748556657</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/large.png?1748556657</AvatarUrl>
<AvatarUrl size="medium">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/medium.png?1748556657</AvatarUrl>
<AvatarUrl size="small">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/small.png?1748556657</AvatarUrl>
<AvatarUrl size="xsmall">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xsmall.png?1748556657</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xxsmall.png?1748556657</AvatarUrl>
<Sponsor>UMBC News &amp; Magazine</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>false</CommentsAllowed>
<PostedAt>Thu, 25 Apr 2013 19:48:38 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="123342" important="false" status="posted" url="https://my3.my.umbc.edu/posts/123342">
<Title>Seth Messinger, Sociology and Anthropology, on WTOP</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p>As injured survivors of the Boston bombing start their long and challenging road to recovery, Washington D.C.’s <a href="http://www.wtop.com/1305/3297367/Is-it-ever-OK-to-cry-at-work" rel="nofollow external" class="bo">WTOP interviewed UMBC’s Seth D. Messinger </a>yesterday on the topic of rehabilitation following traumatic limb loss.</p>
    <p>Messinger, an associate professor of anthropology who works primarily with service members, notes, “the question is whether or not civilian patients are going to be able to have the kind of time in therapy or in rehab that military patients take for granted.” He also highlights the financial hardship that the recovery process might place on victims and their families, remarking, “It’s not only the individual who’s injured who then steps out of work, but also a caregiver.”</p>
    </div>
]]>
</Body>
<Summary>As injured survivors of the Boston bombing start their long and challenging road to recovery, Washington D.C.’s WTOP interviewed UMBC’s Seth D. Messinger yesterday on the topic of rehabilitation...</Summary>
<Website>https://umbc.edu/stories/seth-messinger-sociology-and-anthropology-on-wtop/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/123342/guest@my.umbc.edu/1d9e9e5415d93deea26cfe9be33ec00e/api/pixel</TrackingUrl>
<Tag>cahss</Tag>
<Tag>policy-and-society</Tag>
<Tag>saph</Tag>
<Group token="umbc-news-magazine">UMBC News &amp;amp; Magazine</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/umbc-news-magazine</GroupUrl>
<AvatarUrl>https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xsmall.png?1748556657</AvatarUrl>
<AvatarUrl size="original">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/original.png?1748556657</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xxlarge.png?1748556657</AvatarUrl>
<AvatarUrl size="xlarge">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xlarge.png?1748556657</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/large.png?1748556657</AvatarUrl>
<AvatarUrl size="medium">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/medium.png?1748556657</AvatarUrl>
<AvatarUrl size="small">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/small.png?1748556657</AvatarUrl>
<AvatarUrl size="xsmall">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xsmall.png?1748556657</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xxsmall.png?1748556657</AvatarUrl>
<Sponsor>UMBC News &amp; Magazine</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>false</CommentsAllowed>
<PostedAt>Thu, 25 Apr 2013 19:14:27 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="29107" important="false" status="posted" url="https://my3.my.umbc.edu/posts/29107">
<Title>LayoutIt! offers drag and drop Bootstrap workflow</Title>
<Body>
<![CDATA[
    <div class="html-content">Quick start tool for prototyping aims to speed up website projects<div><table border="0"><tbody><tr><td>
    <a href="http://share.feedsportal.com/share/twitter/?u=http%3A%2F%2Fwww.netmagazine.com%2Fnews%2Flayoutit-offers-drag-and-drop-bootstrap-workflow-132709&amp;t=LayoutIt%21+offers+drag+and+drop+Bootstrap+workflow" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/twitter.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/facebook/?u=http%3A%2F%2Fwww.netmagazine.com%2Fnews%2Flayoutit-offers-drag-and-drop-bootstrap-workflow-132709&amp;t=LayoutIt%21+offers+drag+and+drop+Bootstrap+workflow" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/facebook.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/linkedin/?u=http%3A%2F%2Fwww.netmagazine.com%2Fnews%2Flayoutit-offers-drag-and-drop-bootstrap-workflow-132709&amp;t=LayoutIt%21+offers+drag+and+drop+Bootstrap+workflow" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/linkedin.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/gplus/?u=http%3A%2F%2Fwww.netmagazine.com%2Fnews%2Flayoutit-offers-drag-and-drop-bootstrap-workflow-132709&amp;t=LayoutIt%21+offers+drag+and+drop+Bootstrap+workflow" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/googleplus.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/email/?u=http%3A%2F%2Fwww.netmagazine.com%2Fnews%2Flayoutit-offers-drag-and-drop-bootstrap-workflow-132709&amp;t=LayoutIt%21+offers+drag+and+drop+Bootstrap+workflow" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/email.png" style="max-width: 100%; height: auto;"></a>
    </td></tr></tbody></table></div>
    </div>
]]>
</Body>
<Summary>Quick start tool for prototyping aims to speed up website projects     </Summary>
<Website>http://feedproxy.google.com/~r/net/topstories/~3/SENHpw6X_Nc/story01.htm</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/29107/guest@my.umbc.edu/891ae5bdb0b86d249ccd73d9479d5cd6/api/pixel</TrackingUrl>
<Tag>css</Tag>
<Tag>development</Tag>
<Tag>html</Tag>
<Tag>javascript</Tag>
<Tag>mysql</Tag>
<Tag>net</Tag>
<Tag>php</Tag>
<Tag>sql</Tag>
<Tag>web</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Thu, 25 Apr 2013 19:10:24 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="123343" important="false" status="posted" url="https://my3.my.umbc.edu/posts/123343">
<Title>Thomas Schaller, Political Science, in Governing Magazine</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p><a href="/wp-content/uploads/2012/08/tom-schaller-11.jpg" rel="nofollow external" class="bo"><img alt="Tom Schaller" src="/wp-content/uploads/2012/08/tom-schaller-11.jpg?w=300" width="178" height="119" style="max-width: 100%; height: auto;"></a>Thomas F. Schaller, professor of political science at UMBC, offers his expertise on Maryland politics in a new <em>Governing Magazine</em> article that asks <a href="http://www.governing.com/blogs/politics/gov-states-deepening-nations-red-blue-divide.html" rel="nofollow external" class="bo">“Are the States Deepening the Nation’s Red-Blue Divide?”</a></p>
    <p>The article explores how the expansion of unified party control and legislative supermajorities at the state level are impacting policymaking, examining what policies are being approved in strongly Republican and strongly Democratic states.</p>
    <p>The article identifies Maryland as a Democratic state that has taken a turn to the left with recent legislation on assault weapons, education, same-sex marriage and the death penalty. “Maryland is getting bluer in election results,” says Schaller; conveying that Maryland’s GOP has become increasingly marginalized.</p>
    </div>
]]>
</Body>
<Summary>Thomas F. Schaller, professor of political science at UMBC, offers his expertise on Maryland politics in a new Governing Magazine article that asks “Are the States Deepening the Nation’s Red-Blue...</Summary>
<Website>https://umbc.edu/stories/thomas-schaller-political-science-in-governing-magazine/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/123343/guest@my.umbc.edu/f5e667d7af0e5292334807fc52669062/api/pixel</TrackingUrl>
<Tag>cahss</Tag>
<Tag>policy-and-society</Tag>
<Tag>politicalscience</Tag>
<Group token="umbc-news-magazine">UMBC News &amp;amp; Magazine</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/umbc-news-magazine</GroupUrl>
<AvatarUrl>https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xsmall.png?1748556657</AvatarUrl>
<AvatarUrl size="original">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/original.png?1748556657</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xxlarge.png?1748556657</AvatarUrl>
<AvatarUrl size="xlarge">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xlarge.png?1748556657</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/large.png?1748556657</AvatarUrl>
<AvatarUrl size="medium">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/medium.png?1748556657</AvatarUrl>
<AvatarUrl size="small">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/small.png?1748556657</AvatarUrl>
<AvatarUrl size="xsmall">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xsmall.png?1748556657</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xxsmall.png?1748556657</AvatarUrl>
<Sponsor>UMBC News &amp; Magazine</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>false</CommentsAllowed>
<PostedAt>Thu, 25 Apr 2013 19:00:25 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="123344" important="false" status="posted" url="https://my3.my.umbc.edu/posts/123344">
<Title>Donald Norris, Public Policy, in the Washington Post</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p>Yesterday’s allegations that state prison guards helped a gang operate a contraband smuggling scheme from behind bars at the Baltimore City Detention Center are prompting strong responses from Maryland lawmakers. While Sen. Brian E. Frosh said the O’Malley administration deserves credit for its role in a “very bold, aggressive and appropriate” prosecution, Del. Curtis S. Anderson called the indictments “just horrific” and asked for further explanation from the governor.</p>
    <p><a href="/wp-content/uploads/2012/09/donald-norris-umbc.jpg" rel="nofollow external" class="bo"><img alt="Donald Norris UMBC" src="/wp-content/uploads/2012/09/donald-norris-umbc.jpg" width="140" height="126" style="max-width: 100%; height: auto;"></a>Donald F. Norris, professor and chair of public policy at UMBC, <a href="http://www.washingtonpost.com/local/md-politics/maryland-prison-indictments-prompt-anger-some-understanding-from-lawmakers/2013/04/24/a0644f86-acee-11e2-a198-99893f10d6dd_story.html" rel="nofollow external" class="bo">told the <em>Washington Post</em></a> that any political fallout from the episode for O’Malley, who is considering a 2016 presidential bid, will likely be determined by “how he handles this, whether he gets out in front of it.” Norris notes, “If the state were riddled with incompetence and corruption, that’d be one thing, but it’s not. … This kind of thing happens in all prison systems, though maybe not this flagrant.”</p>
    </div>
]]>
</Body>
<Summary>Yesterday’s allegations that state prison guards helped a gang operate a contraband smuggling scheme from behind bars at the Baltimore City Detention Center are prompting strong responses from...</Summary>
<Website>https://umbc.edu/stories/donald-norris-public-policy-in-the-washington-post-3/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/123344/guest@my.umbc.edu/86d8ede40138c5abb11bd011e3675a4c/api/pixel</TrackingUrl>
<Tag>cahss</Tag>
<Tag>policy-and-society</Tag>
<Tag>publicpolicy</Tag>
<Group token="umbc-news-magazine">UMBC News &amp;amp; Magazine</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/umbc-news-magazine</GroupUrl>
<AvatarUrl>https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xsmall.png?1748556657</AvatarUrl>
<AvatarUrl size="original">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/original.png?1748556657</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xxlarge.png?1748556657</AvatarUrl>
<AvatarUrl size="xlarge">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xlarge.png?1748556657</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/large.png?1748556657</AvatarUrl>
<AvatarUrl size="medium">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/medium.png?1748556657</AvatarUrl>
<AvatarUrl size="small">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/small.png?1748556657</AvatarUrl>
<AvatarUrl size="xsmall">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xsmall.png?1748556657</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xxsmall.png?1748556657</AvatarUrl>
<Sponsor>UMBC News &amp; Magazine</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>false</CommentsAllowed>
<PostedAt>Thu, 25 Apr 2013 18:38:42 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="123345" important="false" status="posted" url="https://my3.my.umbc.edu/posts/123345">
<Title>For All the World to Hear to Present at AAM Meeting</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p><a href="/wp-content/uploads/2013/03/fatwth-in-afro-american-28-feb-2013.jpg" rel="nofollow external" class="bo"><img alt="FATWTH in Afro-American 28 Feb 2013" src="/wp-content/uploads/2013/03/fatwth-in-afro-american-28-feb-2013.jpg?w=150" width="150" height="144" style="max-width: 100%; height: auto;"></a><em>For All The World to Hear: Stories from the Struggle for Civil Rights</em>, an oral history, outreach project of the CADVC, will present the session “Storytelling from Page to Stage: An Oral History Community Project” at the American Alliance of Museums’ (AAM) annual Meeting and Museum Expo.</p>
    <p>The session, scheduled for Monday, May 20 from 1:45-3:00 p.m. in the Baltimore Convention Center, will tell the tale of the creation and production of <em>For All the World to Hear.</em> Harriet Lynn, director of the project, Sandra Abbott, CADVC, producer of <em>For All the World to Hear</em>, and Carrie Rennolds, graduate student, will present alongside participants in the project, who will share stories of their experience before and during the American civil rights movement.</p>
    <p>Learn more about the session at the AAM article, <a href="http://www.aam-us.org/events/annual-meeting/annual-meeting-theme" rel="nofollow external" class="bo">“2013 AAM Annual Meeting Theme: The Power of Stor</a><a href="http://www.aam-us.org/events/annual-meeting/annual-meeting-theme" rel="nofollow external" class="bo">y,”</a> or visit <a href="http://foralltheworldtohear.org" rel="nofollow external" class="bo">foralltheworldtohear.org</a>.</p>
    </div>
]]>
</Body>
<Summary>For All The World to Hear: Stories from the Struggle for Civil Rights, an oral history, outreach project of the CADVC, will present the session “Storytelling from Page to Stage: An Oral History...</Summary>
<Website>https://umbc.edu/stories/for-all-the-world-to-hear-to-present-at-aam-meeting/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/123345/guest@my.umbc.edu/66a099b012a27fc7d4e7a69866240eac/api/pixel</TrackingUrl>
<Tag>cadvc</Tag>
<Tag>cahss</Tag>
<Tag>policy-and-society</Tag>
<Tag>visualarts</Tag>
<Group token="umbc-news-magazine">UMBC News &amp;amp; Magazine</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/umbc-news-magazine</GroupUrl>
<AvatarUrl>https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xsmall.png?1748556657</AvatarUrl>
<AvatarUrl size="original">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/original.png?1748556657</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xxlarge.png?1748556657</AvatarUrl>
<AvatarUrl size="xlarge">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xlarge.png?1748556657</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/large.png?1748556657</AvatarUrl>
<AvatarUrl size="medium">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/medium.png?1748556657</AvatarUrl>
<AvatarUrl size="small">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/small.png?1748556657</AvatarUrl>
<AvatarUrl size="xsmall">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xsmall.png?1748556657</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xxsmall.png?1748556657</AvatarUrl>
<Sponsor>UMBC News &amp; Magazine</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>false</CommentsAllowed>
<PostedAt>Thu, 25 Apr 2013 17:55:19 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="28273" important="false" status="posted" url="https://my3.my.umbc.edu/posts/28273">
<Title>Promise-Based Validation</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <a href="http://rss.buysellads.com/click.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=31473&amp;c=1382487731" rel="nofollow external" class="bo"><img src="http://rss.buysellads.com/img.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=31473&amp;c=1382487731" alt="" style="max-width: 100%; height: auto;"></a><p>The concept of “Promises” has changed the way we write asynchronous JavaScript. Over the past year, many frameworks have incorporated some form of the Promise pattern to make asynchronous code easier to write, read and maintain. For example, jQuery added <a href="http://api.jquery.com/category/deferred-object/" rel="nofollow external" class="bo">$.Deferred()</a>, and NodeJS has the <a href="http://documentup.com/kriskowal/q/" rel="nofollow external" class="bo">Q</a> and <a href="https://github.com/dfilatov/jspromise" rel="nofollow external" class="bo">jspromise</a> modules that work on both client and server. Client-side MVC frameworks, such as <a href="http://emberjs.com" rel="nofollow external" class="bo">EmberJS</a> and <a href="http://angularjs.org/" rel="nofollow external" class="bo">AngularJS</a>, also implement their own versions of Promises.</p>
    <p></p>
    <p>But it doesn’t have to stop there: we can rethink older solutions and apply Promises to them. In this article, we’ll do just that: validate a form using the Promise pattern to expose a super simple API.</p>
    <hr>
    <h2>What is a Promise?</h2>
    <blockquote><p> Promises notify the result of an operation.</p></blockquote>
    <p>Simply put, Promises notify the result of an operation. The result can be a success or a failure, and the operation, itself, can be anything that abides by a simple contract. I chose to use the word <em>contract</em> because you can design this contract in several different ways. Thankfully, the development community reached a consensus and created a specification called <a href="http://promises-aplus.github.io/promises-spec/" rel="nofollow external" class="bo">Promises/A+</a>.</p>
    <p>Only the operation truly knows when it has completed; as such, it is responsibile for notifying its result using the Promises/A+ contract. In other words, it <em>promises</em> to tell you the final result on completion.</p>
    <p>The operation returns a <code>promise</code> object, and you can attach your callbacks to it by using the <code>done()</code> or <code>fail()</code> methods. The operation can notify its outcome by calling <code>promise.resolve()</code> or <code>promise.reject()</code>, respectively. This is depicted in the following figure:</p> <img src="http://cdn.tutsplus.com/net.tutsplus.com/uploads/2013/04/promise-validation-promise.png" alt="Figure for Promises" style="max-width: 100%; height: auto;"><hr>
    <h2>Using Promises for Form Validation</h2>
    <p>Let me paint a plausible scenario.</p>
    <blockquote><p>We can rethink older solutions and apply Promises to them.</p></blockquote>
    <p>Client-side form validation always begins with the simplest of intentions. You may have a sign-up form with <em>Name</em> and <em>Email</em> fields, and you need to ensure that the user provides valid input for both fields. That seems fairly straightforward, and you start implementing your solution.</p>
    <p>You are then told that email addresses must be unique, and you decide to validate the email address on the server. So, the user clicks the submit button, the server checks the email’s uniqueness and the page refreshes to display any errors. That seems like the right approach, right? Nope. Your client wants a slick user experience; visitors should see any error messages without refreshing the page.</p>
    <p>Your form has the <em>Name</em> field that doesn’t require any server-side support, but then you have the <em>Email</em> field that requires you to make a request to the server. Server requests means <code>$.ajax()</code> calls, so you will have to perform email validation in your callback function. If your form has multiple fields that require server-side support, your code will be a nested mess of <code>$.ajax()</code> calls in callbacks. Callbacks inside callbacks: “Welcome to callback hell! We hope you have a miserable stay!”.</p>
    <p>So, how do we handle callback hell?</p>
    <h3>The Solution I Promised</h3>
    <p>Take a step back and think about this problem. We have a set of operations that can either succeed or fail. Either of these results can be captured as a <code>Promise</code>, and the operations can be anything from simple client-side checks to complex server-side validations. Promises also give you the added benefit of consistency, as well as letting you avoid conditionally checking on the type of validation. Lets see how we can do this.</p>
    <blockquote><p>As I noted earlier, there are several promise implementations in the wild, but I will focus on jQuery’s <a href="http://api.jquery.com/deferred" rel="nofollow external" class="bo">$.Deferred()</a> Promise implementation.</p></blockquote>
    <p>We will build a simple validation framework where every check immediately returns either a result or a Promise. As a user of this framework, you only have to remember one thing: <em>“it always returns a Promise”</em>. Lets get started.</p>
    <h3>Validator Framework using Promises</h3>
    <p>I think it’s easier to appreciate the simplicity of Promises from the consumer’s point of view. Lets say I have a form with three fields: Name, Email and Address:</p>
    <pre>&lt;form&gt;&#x000A;      &lt;div class="row"&gt;&#x000A;        &lt;div class="large-4 columns"&gt;&#x000A;          &lt;label&gt;Name&lt;/label&gt;&#x000A;          &lt;input type="text" class="name"/&gt;&#x000A;        &lt;/div&gt;&#x000A;      &lt;/div&gt;&#x000A;    &#x000A;      &lt;div class="row"&gt;&#x000A;        &lt;div class="large-4 columns"&gt;&#x000A;          &lt;label&gt;Email&lt;/label&gt;&#x000A;          &lt;input type="text" class="email"/&gt;&#x000A;        &lt;/div&gt;&#x000A;      &lt;/div&gt;&#x000A;    &#x000A;      &lt;div class="row"&gt;&#x000A;        &lt;div class="large-4 columns"&gt;&#x000A;          &lt;label&gt;Address&lt;/label&gt;&#x000A;          &lt;input type="text" class="address"/&gt;&#x000A;        &lt;/div&gt;&#x000A;      &lt;/div&gt;&#x000A;    &#x000A;    &lt;/form&gt;&#x000A;    </pre>
    <p>I will first configure the validation criteria with the following object. This also serves as our framework’s API:</p>
    <pre>var validationConfig = {&#x000A;      '.name': {&#x000A;        checks: 'required',&#x000A;        field: 'Name'&#x000A;      },&#x000A;      '.email': {&#x000A;        checks: ['required'],&#x000A;        field: 'Email'&#x000A;      },&#x000A;      '.address': {&#x000A;        checks: ['random', 'required'],&#x000A;        field: 'Address'&#x000A;      }&#x000A;    };&#x000A;    </pre>
    <p>The keys of this config object are jQuery selectors; their values are objects with the following two properties:</p>
    <ul>
    <li>
    <code>checks</code>: a string or array of validations.</li>
    <li>
    <code>field</code>: the human-readable field name, which will be used for reporting errors for that field</li>
    </ul>
    <p>We can call our validator, exposed as the global variable <code>V</code>, like this:</p>
    <pre>V.validate(validationConfig)&#x000A;      .done(function () {&#x000A;          // Success&#x000A;      })&#x000A;      .fail(function (errors) {&#x000A;          // Validations failed. errors has the details&#x000A;      });&#x000A;    </pre>
    <p>Note the use of the <code>done()</code> and <code>fail()</code> callbacks; these are the default callbacks for handing a Promise’s result. If we happen to add more form fields, you could simply augment the <code>validationConfig</code> object without disturbing the rest of the setup (the <a href="http://en.wikipedia.org/wiki/Open/closed_principle" rel="nofollow external" class="bo">Open-Closed Principle</a> in action). In fact, we can add other validations, like the uniqueness constraint for email addresses, by extending the validator framework (which we will see later).</p>
    <p>So that’s the consumer-facing API for the validator framework. Now, let’s dive in and see how it works under the hood.</p>
    <h3>Validator, Under the Hood</h3>
    <p>The validator is exposed as an object with two properties:</p>
    <ul>
    <li>
    <code>type</code>: contains the different kinds of validations, and it is also serves as the extension point for adding more.</li>
    <li>
    <code>validate</code>: the core method that performs the validations based upon the provided config object.</li>
    </ul>
    <p>The overall structure can be summarized as:</p>
    <pre>var V = (function ($) {&#x000A;    &#x000A;    var validator = {&#x000A;    &#x000A;      /*&#x000A;      * Extension point - just add to this hash&#x000A;      * &#x000A;      * V.type['my-validator'] = {&#x000A;      *   ok: function(value){ return true; },&#x000A;      *   message: 'Failure message for my-validator'&#x000A;      *   }&#x000A;      */&#x000A;      type: {&#x000A;        'required': {&#x000A;          ok: function (value) {&#x000A;              // is valid ?&#x000A;          },&#x000A;          message: 'This field is required'&#x000A;        },&#x000A;    &#x000A;        ...&#x000A;      },&#x000A;    &#x000A;      /**&#x000A;       *&#x000A;       * @param config&#x000A;       * {&#x000A;       *   '&lt;jquery-selector&gt;': string | object | [ string ]&#x000A;       * }&#x000A;       */&#x000A;      validate: function (config) {&#x000A;    &#x000A;        // 1. Normalize the configuration object  &#x000A;    &#x000A;        // 2. Convert each validation to a promise  &#x000A;    &#x000A;        // 3. Wrap into a master promise&#x000A;    &#x000A;        // 4. Return the master promise&#x000A;      }&#x000A;    };&#x000A;    &#x000A;    })(jQuery);&#x000A;    </pre>
    <p>The <code>validate</code> method provides the underpinnings of this framework. As seen in the comments above, there are four steps that happen here:</p>
    <p><strong>1. Normalize the configuration object.</strong></p>
    <p>This is where we go through our config object and convert it into an internal representation. This is mostly to capture all the information we need to carry out the validation and report errors if necessary:</p>
    <pre>function normalizeConfig(config) {&#x000A;      config = config || {};&#x000A;    &#x000A;      var validations = [];&#x000A;    &#x000A;      $.each(config, function (selector, obj) {&#x000A;    &#x000A;        // make an array for simplified checking&#x000A;        var checks = $.isArray(obj.checks) ? obj.checks : [obj.checks];&#x000A;    &#x000A;        $.each(checks, function (idx, check) {&#x000A;          validations.push({&#x000A;            control: $(selector),&#x000A;            check: getValidator(check),&#x000A;            checkName: check,&#x000A;            field: obj.field&#x000A;          });&#x000A;        });&#x000A;    &#x000A;      });&#x000A;      return validations;&#x000A;    }&#x000A;    &#x000A;    function getValidator(type) {&#x000A;      if ($.type(type) === 'string' &amp;&amp; validator.type[type]) return validator.type[type];&#x000A;    &#x000A;      return validator.noCheck;&#x000A;    }&#x000A;    &#x000A;    </pre>
    <p>This code loops over the keys in the config object and creates an internal representation of the validation. We will use this representation in the <code>validate</code> method.</p>
    <p>The <code>getValidator()</code> helper fetches the validator object from the <code>type</code> hash. If we don’t find one, we return the <code>noCheck</code> validator which always returns true.</p>
    <p><strong>2. Convert each validation to a Promise.</strong></p>
    <p>Here, we ensure every validation is a Promise by checking the return value of <code>validation.ok()</code>. If it contains the <code>then()</code> method, we know it’s a Promise (this is as per the Promises/A+ spec). If not, we create an ad-hoc Promise that resolves or rejects depending on the return value.</p>
    <pre>    &#x000A;    validate: function (config) {&#x000A;      // 1. Normalize the configuration object&#x000A;      config = normalizeConfig(config);&#x000A;      var promises = [],&#x000A;        checks = [];&#x000A;    &#x000A;      // 2. Convert each validation to a promise&#x000A;      $.each(config, function (idx, v) {&#x000A;        var value = v.control.val();&#x000A;        var retVal = v.check.ok(value);&#x000A;    &#x000A;        // Make a promise, check is based on Promises/A+ spec&#x000A;        if (retVal.then) {&#x000A;          promises.push(retVal);&#x000A;        }&#x000A;        else {&#x000A;          var p = $.Deferred();&#x000A;    &#x000A;          if (retVal) p.resolve();&#x000A;          else p.reject();&#x000A;    &#x000A;          promises.push(p.promise());&#x000A;        }&#x000A;        checks.push(v);&#x000A;      });&#x000A;      // 3. Wrap into a master promise&#x000A;    &#x000A;      // 4. Return the master promise&#x000A;    }&#x000A;    </pre>
    <p><strong>3. Wrap into a master Promise.</strong></p>
    <p>We created an array of Promises in the previous step. When they all succeed, we want to either resolve once or fail with detailed error information. We can do this by wrapping all of the Promises into a single Promise and propagate the result. If everything goes well, we just resolve on the master promise.</p>
    <p>For errors, we can read from our internal validation representation and use it for reporting. Since there can be multiple validation failures, we loop over the <code>promises</code> array and read the <code>state()</code> result. We collect all of the rejected promises into the <code>failed</code> array and call <code>reject()</code> on the master promise:</p>
    <pre>// 3. Wrap into a master promise&#x000A;    var masterPromise = $.Deferred();&#x000A;    $.when.apply(null, promises)&#x000A;      .done(function () {&#x000A;        masterPromise.resolve();&#x000A;      })&#x000A;      .fail(function () {&#x000A;        var failed = [];&#x000A;        $.each(promises, function (idx, x) {&#x000A;          if (x.state() === 'rejected') {&#x000A;            var failedCheck = checks[idx];&#x000A;            var error = {&#x000A;              check: failedCheck.checkName,&#x000A;              error: failedCheck.check.message,&#x000A;              field: failedCheck.field,&#x000A;              control: failedCheck.control&#x000A;            };&#x000A;            failed.push(error);&#x000A;          }&#x000A;        });&#x000A;        masterPromise.reject(failed);&#x000A;      });&#x000A;    &#x000A;    // 4. Return the master promise&#x000A;    return masterPromise.promise();&#x000A;    </pre>
    <p><strong>4. Return the master promise.</strong></p>
    <p>Finally we return the master promise from the <code>validate()</code> method. This is the Promise on which the client code sets up the <code>done()</code> and <code>fail()</code> callbacks.</p>
    <p>Steps two and three are the crux of this framework. By normalizing the validations into a Promise, we can handle them consistently. We have more control with a master Promise object, and we can attach additional contextual information that may be useful to the end user.</p>
    <hr>
    <h2>Using the Validator</h2>
    <p>See the demo file for a full use of the validator framework. We use the <code>done()</code> callback to report success and <code>fail()</code> to show a list of errors against each of the fields. The screenshots below show the success and failure states:</p> <img src="http://cdn.tutsplus.com/net.tutsplus.com/uploads/2013/04/promise-validation-demo-success.png" alt="Demo showing Success" style="max-width: 100%; height: auto;"> <img src="http://cdn.tutsplus.com/net.tutsplus.com/uploads/2013/04/promise-validation-demo-failure.png" alt="Demo showing failures" style="max-width: 100%; height: auto;"><p>The demo uses the same HTML and validation configuration mentioned earlier in this article. The only addition is the code that displays the alerts. Note the use of the <code>done()</code> and <code>fail()</code> callbacks to handle the validation results.</p>
    <pre>function showAlerts(errors) {&#x000A;      var alertContainer = $('.alert');&#x000A;      $('.error').remove();&#x000A;    &#x000A;      if (!errors) {&#x000A;        alertContainer.html('&lt;small class="label success"&gt;All Passed&lt;/small&gt;');&#x000A;      } else {&#x000A;        $.each(errors, function (idx, err) {&#x000A;          var msg = $('&lt;small&gt;&lt;/small&gt;')&#x000A;              .addClass('error')&#x000A;              .text(err.error);&#x000A;    &#x000A;          err.control.parent().append(msg);&#x000A;        });&#x000A;      }&#x000A;    }&#x000A;    &#x000A;    $('.validate').click(function () {&#x000A;    &#x000A;      $('.indicator').show();&#x000A;      $('.alert').empty();&#x000A;    &#x000A;      V.validate(validationConfig)&#x000A;          .done(function () {&#x000A;            $('.indicator').hide();&#x000A;            showAlerts();&#x000A;          })&#x000A;          .fail(function (errors) {&#x000A;            $('.indicator').hide();&#x000A;            showAlerts(errors);&#x000A;          });&#x000A;    &#x000A;    });&#x000A;    </pre>
    <h3>Extending the Validator</h3>
    <p>I mentioned earlier that we can add more validation operations to the framework by extending the validator’s <code>type</code> hash. Consider the <code>random</code> validator as an example. This validator randomly succeeds or fails. I know its not a useful validator, but it’s worth noting some of its concepts:</p>
    <ul>
    <li>Use <code>setTimeout()</code> to make the validation async. You can also think of this as simulating network latency.</li>
    <li>Return a Promise from the <code>ok()</code> method.</li>
    </ul>
    <pre>  &#x000A;    // Extend with a random validator&#x000A;    V.type['random'] = {&#x000A;      ok: function (value) {&#x000A;        var deferred = $.Deferred();&#x000A;    &#x000A;        setTimeout(function () {&#x000A;          var result = Math.random() &lt; 0.5;&#x000A;          if (result) deferred.resolve();&#x000A;          else deferred.reject();&#x000A;    &#x000A;        }, 1000);&#x000A;    &#x000A;        return deferred.promise();&#x000A;      },&#x000A;      message: 'Failed randomly. No hard feelings.'&#x000A;    };&#x000A;    </pre>
    <p>In the demo, I used this validation on the <em>Address</em> field like so:</p>
    <pre>var validationConfig = {&#x000A;      /* cilpped for brevity */&#x000A;    &#x000A;      '.address': {&#x000A;        checks: ['random', 'required'],&#x000A;        field: 'Address'&#x000A;      }&#x000A;    };&#x000A;    </pre>
    <hr>
    <h2>Summary</h2>
    <p>I hope that this article has given you a good idea of how you can apply Promises to old problems and build your own framework around them. The Promise-based approach is a fantastic solution to abstract operations that may or may not run synchronously. You can also chain callbacks and even compose higher-order Promises from a set of other Promises.</p>
    <p>The Promise pattern is applicable in a variety of scenarios, and you’ll hopefully encounter some of them and see an immediate match!</p>
    <hr>
    <h2>References</h2>
    <ul>
    <li><a href="http://promises-aplus.github.io/promises-spec/" rel="nofollow external" class="bo">Promises/A+ spec</a></li>
    <li><a href="http://api.jquery.com/category/deferred-object/" rel="nofollow external" class="bo">jQuery.Deferred()</a></li>
    <li><a href="http://documentup.com/kriskowal/q/" rel="nofollow external" class="bo">Q</a></li>
    <li><a href="https://github.com/dfilatov/jspromise" rel="nofollow external" class="bo">jspromise</a></li>
    </ul>
    </div>
]]>
</Body>
<Summary>The concept of “Promises” has changed the way we write asynchronous JavaScript. Over the past year, many frameworks have incorporated some form of the Promise pattern to make asynchronous code...</Summary>
<Website>http://feedproxy.google.com/~r/nettuts/~3/g_CrQeWOv6w/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/28273/guest@my.umbc.edu/1ce26acb6467255e2843650610089e47/api/pixel</TrackingUrl>
<Tag>css</Tag>
<Tag>development</Tag>
<Tag>html</Tag>
<Tag>javascript</Tag>
<Tag>javascript-and-ajax</Tag>
<Tag>mysql</Tag>
<Tag>php</Tag>
<Tag>promises</Tag>
<Tag>sql</Tag>
<Tag>tutorials</Tag>
<Tag>wed</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Thu, 25 Apr 2013 17:46:03 -0400</PostedAt>
<EditAt>Thu, 25 Apr 2013 17:46:03 -0400</EditAt>
</NewsItem>

</News>
