Improve identity selection javascript
authorMichael M Slusarz <slusarz@curecanti.org>
Wed, 17 Feb 2010 09:37:43 +0000 (02:37 -0700)
committerMichael M Slusarz <slusarz@curecanti.org>
Thu, 18 Feb 2010 07:46:01 +0000 (00:46 -0700)
framework/Prefs/lib/Horde/Prefs/Ui.php
horde/js/identityselect.js [new file with mode: 0644]
horde/templates/prefs/deleteidentity.inc
horde/templates/prefs/identityselect.inc

index c7fa086..7597271 100644 (file)
@@ -296,7 +296,7 @@ class Horde_Prefs_Ui
 
         $title = _("User Options");
         if ($group == 'identities' && !$prefs->isLocked('default_identity')) {
-            $notification->push('newChoice()', 'javascript');
+            Horde::addInlineScript(array('IdentitySelect.newChoice()'), 'dom');
         }
         $GLOBALS['bodyId'] = 'services_prefs';
         if (!$chunk) {
diff --git a/horde/js/identityselect.js b/horde/js/identityselect.js
new file mode 100644 (file)
index 0000000..f5cb8a9
--- /dev/null
@@ -0,0 +1,73 @@
+/**
+ * Horde identity selection javascript.
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ */
+
+var IdentitySelect = {
+
+    newChoice: function()
+    {
+        var id = $('identity').down('[value=' + $F('identity') + ']').value;
+
+        if (id < 0) {
+            $('prefs').reset();
+            $('identity').setValue(id);
+            return;
+        }
+
+        this.identities[id].each(function(a) {
+            var field = $(a[0]);
+            if (!field) {
+                return;
+            }
+
+            switch (a[1]) {
+            case "enum":
+                for (var j = 0; j < field.options.length; ++j) {
+                    if (field.options[j].value == a[2]) {
+                        field.selectedIndex = j;
+                        break;
+                    }
+                }
+                break;
+
+            case "implicit":
+                eval("newChoice_" + a[0] + "(" + a[2] + ")");
+                break;
+
+            case "checkbox":
+            default:
+                field.setValue(a[2]);
+                break;
+            }
+        });
+    },
+
+    deleteIdentity: function()
+    {
+        var params, q,
+            id = $('identity').down('[value=' + $F('identity') + ']').value;
+
+        if (id >= 0) {
+            q = this.deleteurl.indexOf('?');
+            params = this.deleteurl.toQueryParams();
+            params.id = id;
+            window.location.assign(this.deleteurl.substring(0, q) + '?' + params.toQueryString());
+        }
+    },
+
+    onDomLoad: function()
+    {
+        if ($('identity')) {
+            $('identity').observe('change', this.newChoice.bind(this));
+        }
+        if ($('deleteidentity')) {
+            $('deleteidentity').observe('click', this.deleteIdentity.bind(this));
+        }
+    }
+
+};
+
+document.observe('dom:loaded', IdentitySelect.onDomLoad.bind(IdentitySelect));
index 6fca635..1ef76be 100644 (file)
@@ -1,15 +1,12 @@
 <?php if (!$prefs->isLocked('default_identity')): ?>
-<script type="text/javascript">
-<!--
-function deleteIdentity()
-{
-    var id = document.prefs.identity.options[document.prefs.identity.selectedIndex].value;
-    if (id >= 0) {
-        document.location.href = "<?php echo str_replace('&amp;', '&', Horde_Util::addParameter(Horde::selfUrl(true), array('actionID' => 'delete_identity', 'id' => ''))) ?>" + id;
-    }
-}
-//-->
-</script>
-<br />
-<input type="button" onclick="deleteIdentity()" class="button" value="<?php echo _("Delete selected identity") ?>" /><br /><br />
+<?php
+    echo Horde::wrapInlineScript(array(
+        'IdentitySelect.deleteurl = ' . Horde_Serialize::serialize(strval(Horde::selfUrl(true)->setRaw(true)->add('actionID', 'delete_identity')), Horde_Serialize::JSON)
+    ));
+?>
+<div>
+ <p>
+  <input id="deleteidentity" type="button" class="button" value="<?php echo _("Delete selected identity") ?>" />
+ </p>
+</div>
 <?php endif; ?>
index b263541..b4606e4 100644 (file)
@@ -1,99 +1,68 @@
 <?php if ($prefs->isLocked('default_identity')): ?>
-<input type="hidden" name="identity" value="<?php echo (int)$GLOBALS['identity']->getDefault() ?>" />
+<input type="hidden" name="identity" value="<?php echo intval($GLOBALS['identity']->getDefault()) ?>" />
 <?php else: ?>
-<script type="text/javascript">
-var identities = [];
 <?php
-global $identity;
-$identities = $identity->getAll('id');
-$default_identity = $identity->getDefault();
-$members = $prefGroups['identities']['members'];
-for ($i = 0; $i < count($identities); ++$i):
-?>
-identities[<?php echo $i ?>] = [];
-<?php
-$k = 0;
-foreach ($members as $member):
-    if ($member == 'default_identity' ||
-        !empty($_prefs[$member]['locked']) ||
-        $_prefs[$member]['type'] == 'special' ||
-        $_prefs[$member]['type'] == 'link') {
-        continue;
-    }
-?>
-identities[<?php echo $i ?>][<?php echo $k++ ?>] = ["<?php echo $member ?>", "<?php echo $_prefs[$member]['type'] ?>", <?php
-$val = $identity->getValue($member, $i);
-switch ($_prefs[$member]['type']) {
-case 'checkbox':
-    echo $val ? 'true' : 'false';
-    break;
+    $identities = $GLOBALS['identity']->getAll('id');
+    $default_identity = $GLOBALS['identity']->getDefault();
+    $members = $prefGroups['identities']['members'];
 
-case 'number':
-    echo (int)$val;
-    break;
+    $out = array();
 
-case 'textarea':
-    if (is_array($val)) {
-        $val = implode("\n", $val);
-    }
-    $val = Horde_String::convertCharset($val, Horde_Nls::getCharset(), 'UTF-8');
-    echo 'decodeURIComponent("' . rawurlencode($val) . '")';
-    break;
+    for ($i = 0, $icnt = count($identities); $i < $icnt; ++$i) {
+        $tmp = array();
+        foreach ($members as $member) {
+            if ($member == 'default_identity' ||
+                !empty($_prefs[$member]['locked']) ||
+                $_prefs[$member]['type'] == 'special' ||
+                $_prefs[$member]['type'] == 'link') {
+                continue;
+            }
 
-default:
-    $val = Horde_String::convertCharset($val, Horde_Nls::getCharset(), 'UTF-8');
-    echo 'decodeURIComponent("' . rawurlencode($val) . '")';
-}
-?>];
-<?php endforeach; endfor; ?>
+            $val = $GLOBALS['identity']->getValue($member, $i);
+            switch ($_prefs[$member]['type']) {
+            case 'checkbox':
+                $val2 = $val ? 'true' : 'false';
+                break;
 
-function newChoice()
-{
-    var field, val;
-    var index = document.prefs.identity.selectedIndex;
-    var id = document.prefs.identity.options[index].value;
-    if (id < 0) {
-        document.prefs.reset();
-        document.prefs.identity.selectedIndex = index;
-        return;
-    }
-    for (var i = 0; i < identities[id].length; i++) {
-        field = document.prefs[identities[id][i][0]];
-        if (!field) {
-            continue;
-        }
-        val = identities[id][i][2];
-        switch (identities[id][i][1]) {
-        case "enum":
-            for (var j = 0; j < field.options.length; j++) {
-                if (field.options[j].value == val) {
-                    field.selectedIndex = j;
-                    break;
-                }
-            }
-            break;
+            case 'number':
+                $val2 = intval($val);
+                break;
 
-        case "checkbox":
-            field.checked = val;
-            break;
+            case 'textarea':
+                if (is_array($val)) {
+                    $val = implode("\n", $val);
+                }
+                // Fall-through
 
-        case "implicit":
-            eval("newChoice_" + identities[id][i][0] + "(val)");
-            break;
+            default:
+                $val2 = Horde_String::convertCharset($val, Horde_Nls::getCharset(), 'UTF-8');
+            }
 
-        default:
-            field.value = val;
+            $tmp[] = array(
+                $member,
+                $_prefs[$member]['type'],
+                $val2
+            );
         }
+
+        $out[] = $tmp;
     }
-}
-</script>
-<br />
-<?php echo Horde::label('identity', _("Select the identity you want to change:")) ?><br />
-<select name="identity" id="identity" onchange="javascript:newChoice()">
+
+    Horde::addScriptFile('identityselect.js', 'horde');
+    echo Horde::wrapInlineScript(array(
+        'IdentitySelect.identities = ' . Horde_Serialize::serialize($out, Horde_Serialize::JSON)
+    ));
+?>
+<div>
+ <?php echo Horde::label('identity', _("Select the identity you want to change:")) ?>
+</div>
+<div>
+ <select name="identity" id="identity">
   <option value="-2" selected="selected"><?php echo _("None") ?></option>
   <option value="-1"><?php echo _("Create a new one") ?></option>
-<?php for ($i = 0; $i < count($identities); $i++): ?>
+<?php for ($i = 0, $icnt = count($identities); $i < $icnt; ++$i): ?>
   <option value="<?php echo $i ?>"<?php if ($i == $default_identity) echo ' selected="selected"' ?>><?php echo htmlspecialchars($identities[$i]) ?></option>
 <?php endfor; ?>
-</select><br />
+ </select>
+</div>
 <?php endif; ?>