Patron editor changes
authorjason <jason@esilibrary.com>
Mon, 27 Feb 2012 22:32:31 +0000 (17:32 -0500)
committerjason <jason@esilibrary.com>
Mon, 27 Feb 2012 22:32:31 +0000 (17:32 -0500)
Originating from https://github.com/grpl-eg/rel_2_1.git:

aad962182fc75967a763a66bf32208065fd4b773
39a67d5523f80aaf119b537f5665c0772958e6f7
8bac903b2e512d3625553f2693b100f3cc60f9a0

Open-ILS/examples/fm_IDL.xml
Open-ILS/src/perlmods/lib/OpenILS/Application/Actor.pm
Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/CDBI/actor.pm
Open-ILS/web/js/ui/tadl/actor/user/combodata.js [new file with mode: 0644]
Open-ILS/web/js/ui/tadl/actor/user/register.js
Open-ILS/web/tadl.templates/default/actor/user/register.tt2
Open-ILS/web/tadl.templates/default/actor/user/register_table.tt2

index 602ee6b..f1bd9b9 100644 (file)
@@ -4362,9 +4362,12 @@ SELECT  usr,
                        <field reporter:label="Barcode" name="barcode" reporter:datatype="text"/>
                        <field reporter:label="Card ID" name="id" reporter:datatype="id" />
                        <field reporter:label="User" name="usr" reporter:datatype="link"/>
+            <field reporter:label="Creator" name="creator" reporter:datatype="link"/>
+            <field reporter:label="Create Date" name="create_date" reporter:datatype="timestamp"/>
                </fields>
                <links>
                        <link field="usr" reltype="has_a" key="id" map="" class="au"/>
+            <link field="creator" reltype="has_a" key="id" map="" class="au"/>
                </links>
        </class>
        <class id="actsc" controller="open-ils.cstore open-ils.pcrud" oils_obj:fieldmapper="actor::stat_cat" oils_persist:tablename="actor.stat_cat" reporter:label="User Statistical Category">
index 8b56e97..9140233 100644 (file)
@@ -775,6 +775,7 @@ sub _add_update_cards {
        my $session = shift;
        my $patron = shift;
        my $new_patron = shift;
+       my $user = shift;
 
        my $evt;
 
@@ -786,7 +787,7 @@ sub _add_update_cards {
                if(ref($card) and $card->isnew()) {
 
                        $virtual_id = $card->id();
-                       ( $card, $evt ) = _add_card($session,$card);
+                       ( $card, $evt ) = _add_card($session,$card,$user);
                        return (undef, $evt) if $evt;
 
                        #if(ref($patron->card)) { $patron->card($patron->card->id); }
@@ -807,8 +808,9 @@ sub _add_update_cards {
 
 # adds an card to the db and returns the card with new id
 sub _add_card {
-       my( $session, $card ) = @_;
+       my( $session, $card, $user ) = @_;
        $card->clear_id();
+       $card->creator($user->id);
 
        $logger->info("Adding new patron card ".$card->barcode);
 
index 392febe..cbcbf9a 100644 (file)
@@ -142,7 +142,7 @@ use base qw/actor/;
 
 __PACKAGE__->table( 'actor_card' );
 __PACKAGE__->columns( Primary => qw/id/ );
-__PACKAGE__->columns( Essential => qw/usr barcode active/ );
+__PACKAGE__->columns( Essential => qw/usr barcode active creator create_date/ );
 
 #-------------------------------------------------------------------------------
 package actor::user_access_entry;
diff --git a/Open-ILS/web/js/ui/tadl/actor/user/combodata.js b/Open-ILS/web/js/ui/tadl/actor/user/combodata.js
new file mode 100644 (file)
index 0000000..f9d04c9
--- /dev/null
@@ -0,0 +1,59 @@
+var comboData = {
+       "address_types": {
+               "label":"type",             
+        "identifier":"type",               
+        "items":[
+                {"type":"MAILING"},      
+                {"type":"PHYSICAL"},
+                {"type":"JUVENILE"},
+                {"type":"GUARDIAN"},    
+                {"type":"SCHOOL"},             
+                {"type":"ALTERNATE"},
+                {"type":"INSTITUTION"}
+        ]              
+       },
+
+       "suffixes": {
+               "label":"suffix",
+               "identifier":"suffix",
+               "items":[
+                       {"suffix":"Jr"},
+                       {"suffix":"Sr"},
+                       {"suffix":"II"},
+                       {"suffix":"III"},
+                       {"suffix":"AA"},
+                       {"suffix":"AS"},
+                       {"suffix":"AAS"},
+                       {"suffix":"BA"},
+                       {"suffix":"BS"},
+                       {"suffix":"CFPIM"},
+                       {"suffix":"CPA"},
+                       {"suffix":"CPIM"},
+                       {"suffix":"CPM"},
+                       {"suffix":"CXE"},
+                       {"suffix":"DC"},
+                       {"suffix":"DDS"},
+                       {"suffix":"DO"},
+                       {"suffix":"DPM"},
+                       {"suffix":"DVM"},
+                       {"suffix":"Esq"},
+                       {"suffix":"FACAAI"},
+                       {"suffix":"FACP"},
+                       {"suffix":"FACS"},
+                       {"suffix":"FACEP"},
+                       {"suffix":"FCP"},
+                       {"suffix":"FICS"},
+                       {"suffix":"GYN"},
+                       {"suffix":"JD"},
+                       {"suffix":"LPN"},
+                       {"suffix":"MA"},
+                       {"suffix":"MCSE"},
+                       {"suffix":"MD"},
+                       {"suffix":"MS"},
+                       {"suffix":"NMD"},
+                       {"suffix":"OB"},
+                       {"suffix":"PhD"},
+                       {"suffix":"RN"}
+       ]               
+       }
+};
index f74b110..371e3f1 100644 (file)
@@ -46,6 +46,7 @@ var optInSettings;
 var allCardsTemplate;
 var uEditCloneCopyAddr; // if true, copy addrs on clone instead of link
 var homeOuTypes = {};
+var comboStores = {};
 
 var dupeUsrname = false;
 var dupeBarcode = false;
@@ -226,10 +227,20 @@ function load() {
     loadSurveys();
     checkClaimsReturnCountPerm();
     checkClaimsNoCheckoutCountPerm();
+    checkBarPatronPerm();
+    checkUnBarPatronPerm();
 
     dojo.connect(replaceBarcode, 'onClick', replaceCardHandler);
     dojo.connect(allCards, 'onClick', drawAllCards);
-    if(patron.cards().length > 1)
+    dojo.connect(clearAlert, 'onClick', clearMessage);
+    dojo.connect(asAdult, 'onClick', RegAsAdult);
+    dojo.connect(plus, 'onClick', addOneMonth);
+    dojo.connect(plus6, 'onClick', addSixMonths);
+    dojo.connect(plus1, 'onClick', addOneYear);
+    dojo.connect(plus3, 'onClick', addThreeYears);
+    dojo.connect(genISM, 'onClick', replaceISMCard);
+
+//    if(patron.cards().length > 1)
         dojo.removeClass(dojo.byId('uedit-all-barcodes'), 'hidden');
 
     var input = findWidget('ac', 'barcode');
@@ -321,11 +332,25 @@ function drawAllCards() {
             }
             var row = allCardsTemplate.cloneNode(true);
             getByName(row, 'barcode').innerHTML = card.barcode();
+           getByName(row, 'creator').innerHTML = card.creator();
+           getByName(row, 'create_date').innerHTML = card.create_date();
             getByName(row, 'active').appendChild(
                 openils.Util.isTrue(card.active()) ? 
                     dojo.byId('true').cloneNode(true) :
                     dojo.byId('false').cloneNode(true)
             ); 
+            if (openils.Util.isTrue(card.active())){
+                var act = new dijit.form.ToggleButton({label:"Disable", onClick: function() {disableCard(card.id());} },"disableButton");
+                getByName(row, 'state').appendChild(act.domNode);
+            }else{
+                var act = new dijit.form.Button({label:"Enable", onClick: function() {enableCard(card.id());} },"enableButton");
+                getByName(row, 'state').appendChild(act.domNode);
+            }
+            if (!first) {
+                var pri = new dijit.form.Button({label:"Make Primary", onClick: function() {makePrimaryCard(card.id());} },"primaryButton");
+                getByName(row, 'primary').appendChild(pri.domNode);
+            }
+
 
             tbody.appendChild(row);
             first = false;
@@ -335,6 +360,100 @@ function drawAllCards() {
     allCardsDialog.show();
 }
 
+function disableCard(id) {
+    var old = patron.cards().filter(function(c){return (c.id() == id)})[0];
+    old.active('f');
+    old.ischanged(1);
+    dojo.removeClass(dojo.byId('changesPending'),"hidden");
+}
+
+function enableCard(id) {
+    var old = patron.cards().filter(function(c){return (c.id() == id)})[0];
+    old.active('t');
+    old.ischanged(1);
+    dojo.removeClass(dojo.byId('changesPending'),"hidden");
+}
+
+function makePrimaryCard(id) {
+    patron.card().id(id);
+    patron.ischanged(1);
+    dojo.removeClass(dojo.byId('changesPending'),"hidden");
+}
+
+
+function clearMessage(){
+    var input = findWidget('au', 'alert_message');
+    input.widget.attr('disabled', false).attr('readOnly', false).attr('value', null).focus();
+}
+
+function RegAsAdult(){
+    var input = findWidget('au', 'ident_value2');
+    input.widget.attr('value', 'REGISTERED AS ADULT').focus();
+}
+
+function addOneMonth(){
+    var expire = findWidget('au', 'expire_date');
+    var newDate = new Date();
+    newDate.setDate(newDate.getDate() + 30);
+    expire.widget.attr('value', newDate).focus();
+}
+function addSixMonths(){
+    var expire = findWidget('au', 'expire_date');
+    var newDate = new Date();
+    newDate.setDate(newDate.getDate() + 180);
+    expire.widget.attr('value', newDate).focus();
+}
+function addOneYear(){
+    var expire = findWidget('au', 'expire_date');
+    var newDate = new Date();
+    newDate.setDate(newDate.getDate() + 365);
+    expire.widget.attr('value', newDate).focus();
+}
+function addThreeYears(){
+    var expire = findWidget('au', 'expire_date');
+    var newDate = new Date();
+    newDate.setDate(newDate.getDate() + 1095);
+    expire.widget.attr('value', newDate).focus();
+}
+
+
+function updateSuffix(){
+    var suffix = findWidget('au', 'suffix');
+    suffix.widget.attr('value',dojo.byId("suffixSelector").value);
+}
+
+function updateAddType(){
+    var addType = findWidget('aua', 'address_type');
+    addType.widget.attr('value',dojo.byId("addTypeSelector").value);
+}
+
+function replaceISMCard(){
+    var input = findWidget('ac', 'barcode');
+    var rnd = Math.floor(Math.random()*999999);
+    rnd = '555'+rnd;
+    input.widget.attr('disabled', false).attr('readOnly', true).attr('value', rnd).focus();
+    genISM.attr('disabled', true);
+
+    var profile = findWidget('au', 'profile');
+    profile.widget.attr('value',71);
+
+if (!patron.isnew()){
+    var old = patron.cards().filter(function(c){return (c.id() == patron.card().id())})[0];
+    old.active('f');
+    old.ischanged(1);
+
+    var newc = new fieldmapper.ac();
+    newc.id(uEditCardVirtId--);
+    newc.isnew(1);
+    newc.active('t');
+    patron.card(newc);
+    var t = patron.cards();
+        if (!t) { t = []; }
+        t.push(newc);
+        patron.cards(t);
+}
+}
+
 /**
  * Mark the current card inactive, create a new primary card
  */
@@ -346,7 +465,8 @@ function replaceCardHandler() {
     // pull old card off the cards list so we don't have a dupe sitting in there
     if (patron.cards().length > 0) {
         var old = patron.cards().filter(function(c){return (c.id() == patron.card().id())})[0];
-        old.active('f');
+       var add = confirm('Deactivate the original card?');
+       if (add) old.active('f');
         old.ischanged(1);
     }
 
@@ -370,6 +490,17 @@ function generatePasswordHandler() {
        f.widget.attr('value', patron.passwd());
        f = findWidget('au', 'passwd2');
        f.widget.attr('value', patron.passwd());
+//MIEG: if you use the phone number, reset to the phone number
+                            if(uEditUsePhonePw) {
+                                // if configured, use the last four digits of the day phone number as the password
+                                var newVal = findWidget('au', 'day_phone').widget.value;
+                                if(newVal && newVal.length >= 4) {
+                                    var pw1 = findWidget('au', 'passwd').widget;
+                                    var pw2 = findWidget('au', 'passwd2').widget;
+                                    pw1.attr('value', newVal.substring(newVal.length - 4));
+                                    pw2.attr('value', newVal.substring(newVal.length - 4));
+                                }
+                            }
 }
 
 /**
@@ -734,7 +865,7 @@ function fleshFMRow(row, fmcls, args) {
         else if(isphone && orgSettings['ui.patron.edit.phone.example']) {
             ftd.appendChild(document.createTextNode(localeStrings.EXAMPLE + orgSettings['ui.patron.edit.phone.example']));
         }
-        else if(fieldIdl.datatype == 'timestamp') {
+        else if(fieldIdl.datatype == 'timestamp' && !fmfield.match(/expire/)) {
             ftd.appendChild(document.createTextNode(localeStrings.EXAMPLE + dojo.date.locale.format(new Date(1970,0,31),{selector: "date", fullYear: true, datePattern: (orgSettings['format.date'] ? orgSettings['format.date'] : null)})));
         }
     }
@@ -811,6 +942,17 @@ function fleshFMRow(row, fmcls, args) {
         orgLimitPerms : ['UPDATE_USER'],
     };
 
+    // handle comboBox data, create store if necessary
+    if (dojo.attr(row, 'combodata')) {
+
+        var dataName = dojo.attr(row, 'combodata');        
+        if (!comboStores[dataName])
+            comboStores[dataName] = new dojo.data.ItemFileReadStore({data:comboData[dataName]});
+
+        wargs.dijitArgs.store = comboStores[dataName]; 
+        wargs.dijitArgs.searchAttr = comboData[dataName].identifier;
+    }
+
     if(fmfield == 'profile') {
         // fetch profile groups non-async so existing expire_date is
         // not overwritten when the profile groups arrive and update
@@ -889,6 +1031,39 @@ function checkClaimsReturnCountPerm() {
     );
 }
 
+/**
+ * if the user does not have the BAR_PATRON/UNBAR_PATRON perm
+ * This function checks the perm and disable/enables the widget.
+ */
+
+function checkBarPatronPerm() {
+    new openils.User().getPermOrgList(
+        'BAR_PATRON',
+        function(orgList) {
+            var cr = findWidget('au', 'barred');
+            if(orgList.indexOf(patron.home_ou()) == -1)
+                cr.widget.attr('disabled', true);
+            else
+                cr.widget.attr('disabled', false);
+        },
+        true,
+        true
+    );
+}
+function checkUnBarPatronPerm(){
+    new openils.User().getPermOrgList(
+        'UNBAR_PATRON',
+        function(orgList) {
+            var cr = findWidget('au', 'barred');
+            if(orgList.indexOf(patron.home_ou()) == -1)
+                cr.widget.attr('disabled', true);
+            else
+                cr.widget.attr('disabled', false);
+        },
+        true,
+        true
+    );
+}
 
 function checkClaimsNoCheckoutCountPerm() {
     new openils.User().getPermOrgList(
@@ -970,6 +1145,42 @@ function attachWidgetEvents(fmcls, fmfield, widget) {
             dojo.connect(widget.widget, 'onChange',
                 function() {
                     var barcode = this.attr('value');
+//MIEG: TADL Michigan ID to barcode voodo
+if (barcode.length > 22){
+       if (barcode.length == 25) {var bc = barcode.substr(0,13);}
+       if (barcode.length == 23) {var bc = barcode.substr(0,11);}
+       var dob = findWidget('au', 'dob');
+       var ident = findWidget('au', 'ident_value');
+       var id_type = findWidget('au', 'ident_type');
+       if (barcode.length == 25) {
+               var bc = barcode.substr(0,13);
+               if (!dob.widget.attr('value')){
+                       var y = barcode.substr(13,4);
+                       var m = barcode.substr(17,2);
+                       var d = barcode.substr(19,2);
+                       var bdate = new Date(y,m-1,d);
+                       dob.widget.attr('value',bdate);
+               }
+               if (!ident.widget.attr('value'))
+                       ident.widget.attr('value',bc);
+               id_type.widget.attr('value',1); 
+       }
+       if (barcode.length == 23) {
+               var bc = barcode.substr(0,11);
+               if (!dob.widget.attr('value')){
+                        var y = barcode.substr(11,4);
+                        var m = barcode.substr(15,2);
+                        var d = barcode.substr(17,2);
+                       var bdate = new Date(y,m-1,d);
+                        dob.widget.attr('value',bdate);
+                }
+                if (!ident.widget.attr('value'))
+                        ident.widget.attr('value',bc);
+                id_type.widget.attr('value',4);
+       }
+       bc = bc.toLowerCase();
+       this.attr('value',bc);
+}
                     dupeBarcode = false;
                     dojo.addClass(dojo.byId('uedit-dupe-barcode-warning'), 'hidden');
                     fieldmapper.standardRequest(
@@ -1065,10 +1276,12 @@ function attachWidgetEvents(fmcls, fmfield, widget) {
                         var base = new Date();
                         base.setTime(base.getTime() - Number(openils.Util.intervalToSeconds(juvInterval) + '000'));
 
-                        if(newDob <= base) // older than global.juvenile_age_threshold
+                        if(newDob <= base) // older than global.juvenile_age_threshold
                             juvWidget.widget.attr('value', false);
-                        else
+                            openils.Util.show('parentGuardian');
+                        } else {
                             juvWidget.widget.attr('value', true);
+                        }
                     }
                 );
                 return;
@@ -1347,6 +1560,13 @@ function _uEditSave(doClone) {
             case 'au':
                 if(w._fmfield != 'passwd2')
                     patron[w._fmfield](val);
+//MIEG: dob kludge
+               if(w._fmfield == 'dob'){
+                   var DOB = dojo.date.stamp.fromISOString(val);
+                   DOB = dojo.date.add(DOB,'hour',4);
+                   DOB = dojo.date.stamp.toISOString(DOB);
+                   patron[w._fmfield](DOB);
+               }
                 break;
 
             case 'ac':
index a821020..14fb343 100644 (file)
@@ -1,6 +1,7 @@
 [% ctx.page_title = 'User Editor' %]
 [% WRAPPER default/base.tt2 %]
-<script type="text/javascript" src='[% ctx.media_prefix %]/js/ui/default/actor/user/register.js'></script>
+<script type="text/javascript" src='[% ctx.media_prefix %]/js/ui/tadl/actor/user/combodata.js'></script>
+<script type="text/javascript" src='[% ctx.media_prefix %]/js/ui/tadl/actor/user/register.js'></script>
 <link rel="stylesheet" type="text/css" href="[% ctx.media_prefix %]/css/skin/[% ctx.skin %]/register.css" />
 
 <div dojoType="dijit.form.Form" id="myForm" jsId="myForm" encType="multipart/form-data" action="" method="">
 <div class='hidden'>
     <span id='true' style='color:green;'>&#x2713;</span>
     <span id='false' style='color:red;'>&#x2717;</span>
+    <span id='button'><button dojoType='dijit.form.Button'></button></span>
     <div dojoType='dijit.Dialog' jsId='allCardsDialog'>
         <table class='oils-generic-table' style='margin:10px;'>
             <thead>
                 <tr>
                     <th>Barcode</th>
                     <th>Active</th>
+                    <th>Creator</th>
+                    <th>Create Date</th>
+                   <th/>
+                   <th/>
                 </tr>
             </thead>
             <tbody id='uedit-all-cards-tbody'>
                 <tr id='uedit-all-cards-tr-template'>
                     <td><div name='barcode'></div></td>
                     <td><div name='active'></div></td>
+                    <td><div name='creator'></div></td>
+                    <td><div name='create_date'></div></td>
+                   <td><div name='state'></div></td>
+                   <td><div name='primary'></div></td>
                 </tr>
             </tbody>
             <tbody>
                     <td colspan='2' style='text-align:center;'>
                         <button dojoType='dijit.form.Button' onClick='allCardsDialog.hide()' scrollOnFocus='false'>Close</button>
                     </td>
+                   <td/>
+                   <td colspan='2' style='text-align:center;'><span id='changesPending' class='hidden'>Changes Pending</span></td>
+                   <td/>
+                   <td style='text-align:right;'>
+                       <button dojoType='dijit.form.Button' onClick='uEditSave()' scrollOnFocus='false'>Apply</button>
+                    </td>
                 </tr>
             </tbody>
         </table>
index 5528252..90c4a3a 100644 (file)
@@ -5,6 +5,7 @@
             <button dojoType='dijit.form.Button' jsId='replaceBarcode' scrollOnFocus='false'></button>
             <span id='uedit-dupe-barcode-warning' style='color:red; font-weight:bold' class='hidden'>
             </span>
+           <span id='ISMbutton' class='hidden'><button dojoType='dijit.form.Button' id='genISM' jsId='genISM' scrollOnFocus='false'>ISM Number</button></span>
         </td>
         <td id='uedit-all-barcodes' class='hidden'>
             <button dojoType='dijit.form.Button' jsId='allCards' scrollOnFocus='false'></button>
     <tr fmclass='au' fmfield='first_given_name' required='required'/>
     <tr fmclass='au' fmfield='second_given_name'/>
     <tr fmclass='au' fmfield='family_name' required='required'/>
-    <tr fmclass='au' fmfield='suffix'/>
+<!--
+    <tr fmclass='au' fmfield='suffix' id='suffix'><td/><td/><td/>
+                                                                               <td>
+                                                                                        <select id='suffixSelector' jsID='suffixSelector' dojoType='dijit.form.FilteringSelect' required='false'>
+                                                                                                <option value=''></option>
+                                                                                                <option value='Jr'>Jr</option>
+                                                                                                <option value='Sr'>Sr</option>
+                                                                                                <option value='II'>II</option>
+                                                                                                <option value='III'>III</option>
+                                                                                                <option value='AA'>AA</option>
+                                                                                                <option value='AS'>AS</option>
+                                                                                                <option value='AAS'>AAS</option>
+                                                                                                <option value='BA'>BA</option>
+                                                                                                <option value='BS'>BS</option>
+                                                                                                <option value='CFPIM'>CFPIM</option>
+                                                                                                <option value='CPA'>CPA</option>
+                                                                                                <option value='CPIM'>CPIM</option>
+                                                                                                <option value='CPM'>CPM</option>
+                                                                                                <option value='CXE'>CXE</option>
+                                                                                                <option value='DC'>DC</option>
+                                                                                                <option value='DDS'>DDS</option>
+                                                                                                <option value='DO '>DO</option>
+                                                                                                <option value='DPM'>DPM</option>
+                                                                                                <option value='DVM'>DVM</option>
+                                                                                                <option value='Esq'>Esq</option>
+                                                                                                <option value='FACAAI'>FACAAI</option>
+                                                                                                <option value='FACP'>FACP</option>
+                                                                                                <option value='FACS'>FACS</option>
+                                                                                                <option value='FACEP'>FACEP</option>
+                                                                                                <option value='FCP'>FCP</option>
+                                                                                                <option value='FICS'>FICS</option>
+                                                                                                <option value='GYN'>GYN</option>
+                                                                                                <option value='JD'>JD</option>
+                                                                                                <option value='LPN'>LPN</option>
+                                                                                                <option value='MA'>MA</option>
+                                                                                                <option value='MCSE'>MCSE</option>
+                                                                                                <option value='MD'>MD</option>
+                                                                                                <option value='MS'>MS</option>
+                                                                                                <option value='NMD'>NMD</option>
+                                                                                                <option value='OB'>OB</option>
+                                                                                                <option value='PhD'>PhD</option>
+                                                                                                <option value='RN'>RN</option>
+                                                                                       </select>
+                                                                       </td>
+    </tr>
+
+
+    <tr fmfield='suffix' id='suffix'><td/><td>Suffix</td>
+        <td>
+            <select jsID='suffixSelector' dojoType='dijit.form.ComboBox' required='false' scrollOnFocus='false'>
+                    <option value=''></option>
+                    <option value='Jr'>Jr</option>
+                    <option value='Sr'>Sr</option>
+                    <option value='II'>II</option>
+                    <option value='III'>III</option>
+                    <option value='AA'>AA</option>
+                    <option value='AS'>AS</option>
+                    <option value='AAS'>AAS</option>
+                    <option value='BA'>BA</option>
+                    <option value='BS'>BS</option>
+                    <option value='CFPIM'>CFPIM</option>
+                    <option value='CPA'>CPA</option>
+                    <option value='CPIM'>CPIM</option>
+                    <option value='CPM'>CPM</option>
+                    <option value='CXE'>CXE</option>
+                    <option value='DC'>DC</option>
+                    <option value='DDS'>DDS</option>
+                    <option value='DO '>DO</option>
+                    <option value='DPM'>DPM</option>
+                    <option value='DVM'>DVM</option>
+                    <option value='Esq'>Esq</option>
+                    <option value='FACAAI'>FACAAI</option>
+                    <option value='FACP'>FACP</option>
+                    <option value='FACS'>FACS</option>
+                    <option value='FACEP'>FACEP</option>
+                    <option value='FCP'>FCP</option>
+                    <option value='FICS'>FICS</option>
+                    <option value='GYN'>GYN</option>
+                    <option value='JD'>JD</option>
+                    <option value='LPN'>LPN</option>
+                    <option value='MA'>MA</option>
+                    <option value='MCSE'>MCSE</option>
+                    <option value='MD'>MD</option>
+                    <option value='MS'>MS</option>
+                    <option value='NMD'>NMD</option>
+                    <option value='OB'>OB</option>
+                    <option value='PhD'>PhD</option>
+                    <option value='RN'>RN</option>
+           </select>
+        </td>
+    </tr>
+-->
+
+    <tr fmclass='au' fmfield='suffix' combodata='suffixes'/>
     <tr fmclass='au' fmfield='alias'/>
-    <tr fmclass='au' fmfield='dob'/>
-    <tr fmclass='au' fmfield='juvenile'/>
-    <tr fmclass='au' fmfield='ident_type' required='required'/>
     <tr fmclass='au' fmfield='ident_value'/>
+    <tr fmclass='au' fmfield='ident_type' required='required'/>
     <tr fmclass='au' fmfield='ident_value2'><td/><td id='parentGuardian'></td></tr>
+    <tr fmclass='au' fmfield='dob'/>
+    <tr fmclass='au' fmfield='juvenile'/>
     <tr fmclass='au' fmfield='email'/>
     <tr fmclass='au' fmfield='day_phone'/>
     <tr fmclass='au' fmfield='evening_phone'/>
     <tr fmclass='au' fmfield='master_account'/>
     <tr fmclass='au' fmfield='claims_returned_count' wclass='dijit.form.NumberSpinner' wconstraints="{min:0,places:0}" wvalue='0'/>
     <tr fmclass='au' fmfield='claims_never_checked_out_count' wclass='dijit.form.NumberSpinner' wconstraints="{min:0,places:0}" wvalue='0'/>
-    <tr fmclass='au' fmfield='alert_message' wclass='dijit.form.Textarea' wstyle='height:5em'/>
+    <tr fmclass='au' fmfield='alert_message' wclass='dijit.form.Textarea' wstyle='height:5em'>
+        <td/><td/><td/>
+        <td>
+            <button dojoType='dijit.form.Button' jsId='clearAlert' scrollOnFocus='false'>Clear</button>
+        </td>
+    </tr>
 
     <tr class='divider hidden' id='uedit-settings-divider'><td colspan='0' id='userSettings'></td></tr>
     <tr class='hidden' id='uedit-user-setting-template'>
         </td>
     </tr>
 
+    <!--
+    <tr type='addr-template' id='address_type'>
+       <td></td>
+       <td>Type</td>
+       <td>
+            <select id='addTypeSelector' name='address_type' jsID='addTypeSelector' dojoType='dijit.form.ComboBox' required='required'>
+               <option value=''></option>
+               <option value='MAILING'>MAILING</option>
+               <option value='PHYSICAL'>PHYSICAL</option>
+               <option value='JUVENILE'>JUVENILE</option>
+               <option value='GUARDIAN'>GUARDIAN</option>
+               <option value='SCHOOL'>SCHOOL</option>
+               <option value='ALTERNATE'>ALTERNATE</option>
+               <option value='INSTITUTION'>INSTITUTION</option>
+           </select>
+       </td>
+    </tr>
+    -->
+
+    <!--
+   <tr type='addr-template' id='address_type' name='uedit-addr-type'>
+      <td></td>
+      <td>Type</td>
+      <td>
+          <input id='address_type_input' />
+      </td>
+   </tr>
+      
+   <tr name='uedit-addr-type-row' fmfield='address_type' type='addr-template' required='required'>
+      <td class='uedit-help'></td>
+      <td>Type</td>
+   </tr>
+    -->
 
-    <tr fmclass='aua' fmfield='address_type' type='addr-template' required='required'/>
+    <tr fmclass='aua' fmfield='address_type' type='addr-template' required='required' combodata='address_types'/>
     <tr fmclass='aua' fmfield='post_code' type='addr-template' required='required'/>
     <tr fmclass='aua' fmfield='street1' type='addr-template' required='required'/>
     <tr fmclass='aua' fmfield='street2' type='addr-template' required='show'/>