8 $showSQL = $SYSENV[
"devmode"];
9 $self =
"$menu_link?ft=$ft";
10 $jsonFile =
"$home_path/admin/mailer";
11 $selectArray = array(
"all",
"withE",
"withoutE",
"withBP",
"withText");
15 if ($operation !=
"") {
18 $returnArray = badFlagFilter($dbh, $Cu);
21 $returnArray = saveFlags($dbh, $Cu, $Cn);
24 $returnArray = array(
"sql" => array(),
"error" => array(
"Operation is not recognized: $operation."));
27 header(
'Content-type: application/json');
29 unset($returnArray[
"sql"]);
31 print HCU_JsonEncode($returnArray);
33 printFlagEmailsPage($self);
45 function saveFlags($dbh, $Cu, $Cn) {
47 $parameters = array(
"a" => array(
"changedList" =>
""));
49 $string = array(
"filter" => HCUFILTER_INPUT_STRING);
50 HCU_ImportVars($parameters,
"a", array(
"changedList" => $string));
51 extract($parameters[
"a"]);
52 $changedList = isset($changedList) ? trim($changedList) :
"";
55 if ($changedList ==
"") {
56 throw new exception(
"Changed List is required.", 1);
58 $changedList= HCU_JsonDecode($changedList,
true);
59 if (!is_array($changedList)) {
60 throw new exception(
"Changed List is invalid.", 2);
62 $updateTable = array();
65 foreach($changedList as $row) {
66 $userId = trim($row[
"user_id"]);
67 $isBad = intval($row[
"isbad"]);
68 $badMap[$userId] = $isBad;
70 throw new exception(
"User Id is required.", 3);
72 if (!is_numeric($isBad)) {
73 throw new exception(
"Is Bad needs to be a number.", 5);
76 if (count($badMap) == 0) {
77 throw new exception(
"Should have something in the bad map.", 8);
80 $sql =
"select user_id, msg_tx from ${Cu}user where user_id in ('" . implode(
"','", array_keys($badMap)) .
"')";
82 $sth = db_query($sql, $dbh);
84 throw new exception(
"msg tx query failed.", 6);
87 for($i = 0; $row = db_fetch_assoc($sth, $i); $i++) {
88 $txMap[trim($row[
"user_id"])] = intval($row[
"msg_tx"]);
92 $EMAIL_FLAG = GetMsgTxValue(
'MSGTX_FORCE_EM');
93 foreach($badMap as $userId => $isBad) {
94 if ($firstUserId == -1) {
95 $firstUserId = $userId;
97 $tx = intval($txMap[$userId]);
98 $updateTable[] = array(
"_action" =>
"update",
"user_id" => $userId,
"msg_tx" => $isBad == 1 ? ($tx | $EMAIL_FLAG) : ($tx & ~$EMAIL_FLAG));
100 $updateTable = array(
"user" => $updateTable);
102 $sql =
"select email from cuadminusers where user_name = '$Cn' and cu = '$Cu'";
104 $sth = db_query($sql, $dbh);
106 throw new exception(
"Email query failed.", 9);
108 $email = db_fetch_row($sth)[0];
110 if (DataUserTableUpdate($dbh, array(
"cu" => $Cu),
null, $updateTable, $firstUserId,
"EMAIL_FLAG",
"admin",
"broadcastEmails.prg",
"A",
"Email Flag update",
111 $Cn, $email, trim($_SERVER[
"REMOTE_ADDR"])) ===
false) {
112 throw new exception(
"User update failed.", 7);
114 }
catch(exception $e) {
115 return array(
"error" => array($e->getMessage()),
"sql" => $sqls);
117 return array(
"error" => array(),
"sql" => $sqls);
131 function badFlagFilter($dbh, $Cu) {
133 $parameters = array(
"a" => array(
"type" =>
"",
"list" =>
""));
135 $string = array(
"filter" => HCUFILTER_INPUT_STRING);
136 HCU_ImportVars($parameters,
"a", array(
"type" => $string,
"list" => $string));
137 extract($parameters[
"a"]);
139 $type = isset($type) ? trim($type) :
"";
140 $list = isset($list) ? trim($list) :
"";
144 $EMAIL_FLAG = GetMsgTxValue(
'MSGTX_FORCE_EM');
148 throw new exception(
"List is required.", 3);
150 $list = preg_split(
'/\s/', $list);
151 $validList = array();
152 for($i = 0, $count = count($list); $i != $count; $i++) {
157 if (!validateEmail($email)) {
158 throw new exception(
"List is invalid.", 4);
160 $validList[] = $email;
162 if (count($validList) == 0) {
163 throw new exception(
"List is invalid.", 5);
165 $sql =
"select user_id, email, user_name, coalesce(msg_tx,0) & $EMAIL_FLAG as isbad from ${Cu}user 166 where lower(email) in ('" . strtolower(implode(
"','", $validList)) .
"')";
168 $sth = db_query($sql, $dbh);
170 throw new exception(
"Select query failed.", 6);
172 for($i = 0; $row = db_fetch_assoc($sth, $i); $i++) {
173 $row[
"previousIsbad"] = $row[
"isbad"];
178 $sql =
"select user_id, email, user_name, 1 as isbad from ${Cu}user where (coalesce(msg_tx,0) & $EMAIL_FLAG) <> 0";
180 $sth = db_query($sql, $dbh);
182 throw new exception(
"Select query failed.", 7);
184 for($i = 0; $row = db_fetch_assoc($sth, $i); $i++) {
185 $row[
"previousIsbad"] = $row[
"isbad"];
190 throw new exception(
"Type is required.", 2);
193 throw new exception(
"Type is unknown.", 1);
195 }
catch(exception $e) {
196 return array(
"error" => array($e->getMessage()),
"sql" => $sqls,
"gridData" => array());
198 return array(
"error" => array(),
"sql" => $sqls,
"gridData" => $gridData);
207 function printFlagEmailsPage($self) { ?>
208 <script type=
"text/javascript">
210 getShowWaitFunctions();
220 var grid = $(
"#grid").kendoGrid({
227 user_id: {type:
"number"},
228 user_name: {type:
"number"},
229 email: {type:
"string"},
230 isbad: {type:
"number"},
231 previousIsbad: {type:
"number"}
237 {field:
"email", title:
"Email"},
238 {field:
"user_name", title:
"User #", width:
"150px"},
239 {field:
"isbad", headerTemplate:
"<input type='checkbox' class='allCheckbox'>", sortable:
false, filterable:
false, width:
"10px"}
241 rowTemplate:
"<tr data-uid='#: uid #'><td>#: email #</td><td>#: user_name #</td><td><input type='checkbox' class='singleCheckbox'" 242 +
"#= isbad == 1 ? ' checked' : '' #></td></tr>",
246 template:
"<tr><td colspan='4'>No Records Found</td></tr>" 248 dataBound:
function() {
249 $(
"#grid .allCheckbox").prop(
"checked", $(
"#grid .singleCheckbox:not(:checked)").length == 0);
251 }).data(
"kendoGrid");
253 $(
"#grid").on(
"click",
".allCheckbox",
function() {
254 $(
"#formInfoDiv").hide();
255 var data = grid.dataSource.data();
256 var checked = $(
this).prop(
"checked");
257 for(var i = 0; i!= data.length; i++) {
258 data[i].isbad = checked ? 1 : 0;
260 $(
"#grid .singleCheckbox").prop(
"checked", checked);
263 $(
"#grid").on(
"click",
".singleCheckbox",
function() {
264 $(
"#formInfoDiv").hide();
265 var checked= $(
this).prop(
"checked");
266 grid.dataItem($(
this).closest(
"tr")).isbad= checked ? 1 : 0;
268 if (checked && $(
"#grid .singleCheckbox:not(:checked)").length == 0) {
269 $(
"#grid .allCheckbox").prop(
"checked",
true);
270 }
else if (!checked && $(
"#grid .singleCheckbox:checked").length != 0) {
271 $(
"#grid .allCheckbox").prop(
"checked",
false);
275 $(
".saveBtn").click(
function() {
276 $(
"#formInfoDiv").hide();
277 var changedList = [];
278 var data = grid.dataSource.data();
279 for(var i = 0; i != data.length; i++) {
281 if (row.isbad != row.previousIsbad) {
282 changedList.push({user_id: row.user_id, isbad: row.isbad});
285 var parameters = {changedList: kendo.stringify(changedList)};
287 $.post(
"<?php echo $self; ?>&operation=saveFlags", parameters,
function(data) {
289 if (data.error.length > 0) {
290 $.homecuValidator.displayMessage(data.error, $.homecuValidator.settings.statusError );
291 $(
"#formInfoDiv").hide();
293 $(
"#formInfoDiv").show();
299 $(
".refilterBtn").click(
function() {
313 function openFilterDialog() {
314 $(
"#formInfoDiv").hide();
315 var filterDialog = $(
"#filterDialog").data(
"kendoDialog");
316 var filterDDL = $(
"#filterTypeDDL").data(
"kendoDropDownList");
317 $(
"#gridDiv").hide();
318 var onInit = filterDialog ==
null;
320 filterDialog = $(
"<div id='filterDialog'></div>").appendTo(
"body").kendoDialog({
322 content: $(
"#popupTemplate").html(),
324 {text:
"Filter", primary:
true, action:
function() {
325 if ($.homecuValidator.validate()) {
326 var parameters = {type: filterDDL.value(), list: $(
"#emailInput").val()};
328 $.post(
"<?php echo $self; ?>&operation=badFlagFilter", parameters,
function(data) {
330 if (data.error.length > 0) {
331 $.homecuValidator.displayMessage(data.error, $.homecuValidator.settings.statusError );
333 $(
"#grid").data(
"kendoGrid").dataSource.data(data.gridData);
334 $(
"#gridDiv").show();
335 filterDialog.close();
346 if (window.activeWindows !=
null) {
347 window.activeWindows.push(
this);
351 if (window.activeWindows !=
null) {
352 window.activeWindows.pop();
354 $.homecuValidator.setup({formValidate:
'gridDiv', formStatusField:
'formValidateDiv'});
357 }).data(
"kendoDialog");
359 filterDDL = $(
"#filterTypeDDL").kendoDropDownList({
361 data: [ {text:
"Emails In List", value:
"list"}, {text:
"All Flagged Emails", value:
"bad"}]
363 dataTextField:
"text",
364 dataValueField:
"value",
366 switch(this.value()) {
368 $(
"#listDiv").show();
371 $(
"#listDiv").hide();
375 }).data(
"kendoDropDownList");
378 $.homecuValidator.setup({formValidate:
'popupForm', formStatusField:
'formPopupValidateDiv', homecuCustomRules: {
379 validateemails:
function(input) {
381 if (!$(input).is(
"[name='emailInput']") || !$(input).is(
":visible")) {
384 var emails = $(input).val().trim();
386 $(input).attr(
"data-validateemails-msg",
"Please enter at least one email.");
389 emails = emails.split(/\s+/);
390 for(var i = 0; i != emails.length; i++) {
391 var email = emails[i];
392 if (email.match(/(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/) !=
null || email.match(/^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/) ==
null) {
393 $(input).attr(
"data-validateemails-msg",
"Emails are not valid.");
402 $(
"#listDiv").show();
403 $(
"#emailInput").val(
"");
406 $(
"#filterDialog").data(
"successful",
false);
409 var activeWindows = [];
410 $(document).ready(
function() {
412 <?php printClickOverlayEvent(); ?>
415 <script
id=
"popupTemplate" type=
"text/x-kendo-template">
416 <div
id=
"formPopupValidateDiv"></div>
417 <form
id=
"popupForm">
418 <div
class=
"container hcu-all-100 hcu-template vsgPrimary">
419 <div
class=
"row hcuSpacer">
420 <div
class=
"col-xs-4">
423 <div
class=
"col-xs-8">
424 <div
id=
"filterTypeDDL" class=
"hcu-all-100"></div>
427 <div
class=
"row hcuSpacer" id=
"listDiv">
428 <div
class=
"col-xs-4">
431 <div
class=
"col-xs-8">
432 <textarea
class=
"k-input hcu-all-100" type=
"text" id=
"emailInput" name=
"emailInput" style=
"height:100px" row=15 col=40></textarea>
438 <div
class=
"container hcu-all-100 hcu-template vsgPrimary">
439 <div
class=
"row hcuSpacer">
440 <div
id=
"formValidateDiv" class=
"k-block k-error-colored formValidateDiv" style=
"display:none;"></div>
442 <div
id=
"gridDiv" style=
"display:none;">
443 <div
class=
"row hcuSpacer">
444 <div
class=
"col-xs-12">
445 <div
id=
"grid"></div>
448 <div
class=
"hcu-edit-buttons k-state-default row">
449 <a
class=
"refilterBtn" href=
"#">Refilter</a>
451 <a
class=
"saveBtn k-button k-primary" href=
"#"><i
class=
"fa fa-check"></i>Save</a>