SMSNotifier - Version 1.0.1

Version Notes

Visit product homepage at:
http://www.artio.net/e-shop/magento-extensions/magento-sms-notifier

Download this release

Release Info

Developer Magento Core Team
Extension SMSNotifier
Version 1.0.1
Comparing to
See all releases


Code changes from version 1.0.0 to 1.0.1

app/code/community/Artio/SMSNotifier/Block/Adminhtml/Data/Form/Element/CustomerNumbers.php CHANGED
@@ -44,6 +44,9 @@ class Artio_SMSNotifier_Block_Adminhtml_Data_Form_Element_CustomerNumbers extend
44
  "</span></p>
45
  <div id=\"search_autocomplete\" class=\"search-autocomplete\" style=\"display:none;\"></div>
46
  <input type=\"hidden\" id=\"customer_numbers\" name=\"customer_numbers\" value=\"\" />
 
 
 
47
  <table id=\"table-numbers\" class=\"empty-table\">
48
  <tbody id=\"table-numbers-tbody\">
49
  <tr id=\"table-numbers-template\" style=\"display:none\">
@@ -72,9 +75,15 @@ class Artio_SMSNotifier_Block_Adminhtml_Data_Form_Element_CustomerNumbers extend
72
  vals.push(val);
73
  });
74
  if (vals.length == 0)
 
75
  $('table-numbers').addClassName('empty-table');
 
 
76
  else
 
77
  $('table-numbers').removeClassName('empty-table');
 
 
78
  $('customer_numbers').value = vals.join(';');
79
  }
80
  new Ajax.Autocompleter(
44
  "</span></p>
45
  <div id=\"search_autocomplete\" class=\"search-autocomplete\" style=\"display:none;\"></div>
46
  <input type=\"hidden\" id=\"customer_numbers\" name=\"customer_numbers\" value=\"\" />
47
+ <p id=\"table-numbers-empty-message\">
48
+ <small>".$helper->__("Number list is empty. Enter phone number and click to suggest list, please.")."</small>
49
+ </p>
50
  <table id=\"table-numbers\" class=\"empty-table\">
51
  <tbody id=\"table-numbers-tbody\">
52
  <tr id=\"table-numbers-template\" style=\"display:none\">
75
  vals.push(val);
76
  });
77
  if (vals.length == 0)
78
+ {
79
  $('table-numbers').addClassName('empty-table');
80
+ $('table-numbers-empty-message').removeClassName('hidden');
81
+ }
82
  else
83
+ {
84
  $('table-numbers').removeClassName('empty-table');
85
+ $('table-numbers-empty-message').addClassName('hidden');
86
+ }
87
  $('customer_numbers').value = vals.join(';');
88
  }
89
  new Ajax.Autocompleter(
app/code/community/Artio/SMSNotifier/controllers/AdminhtmlController.php CHANGED
@@ -18,7 +18,7 @@
18
  * Controller
19
  *
20
  * @category Artio
21
- * @package Artio_MTurbo
22
  * @author Artio Magento Team (info@artio.net)
23
  */
24
  class Artio_SMSNotifier_AdminhtmlController extends Mage_Adminhtml_Controller_Action
18
  * Controller
19
  *
20
  * @category Artio
21
+ * @package Artio_SMSNotifier
22
  * @author Artio Magento Team (info@artio.net)
23
  */
24
  class Artio_SMSNotifier_AdminhtmlController extends Mage_Adminhtml_Controller_Action
app/code/community/Artio/SMSNotifier/etc/adminhtml.xml CHANGED
@@ -20,7 +20,7 @@
20
  <children>
21
  <smsnotify translate="title" module="smsnotify">
22
  <title>SMS Notifier</title>
23
- <action>smsnotify</action>
24
  <sort_order>16</sort_order>
25
  <children>
26
  <send>
20
  <children>
21
  <smsnotify translate="title" module="smsnotify">
22
  <title>SMS Notifier</title>
23
+ <action>smsnotify/adminhtml</action>
24
  <sort_order>16</sort_order>
25
  <children>
26
  <send>
app/code/community/Artio/SMSNotifier/etc/config.xml CHANGED
@@ -18,7 +18,7 @@
18
  <config>
19
  <modules>
20
  <Artio_SMSNotifier>
21
- <version>1.0.0</version>
22
  </Artio_SMSNotifier>
23
  </modules>
24
  <admin>
18
  <config>
19
  <modules>
20
  <Artio_SMSNotifier>
21
+ <version>1.0.1</version>
22
  </Artio_SMSNotifier>
23
  </modules>
24
  <admin>
js/artio/numberfilters.js DELETED
@@ -1,1385 +0,0 @@
1
- /**
2
- * Setup select.
3
- */
4
- document.observe('dom:loaded', function(event) {
5
- var select = $('smsnotify_general_local_country');
6
- var hidden = $('smsnotify_general_local_country-hidden');
7
-
8
- if (select && hidden)
9
- {
10
- select.childElements().each(function(option, index) {
11
- if (option.value == hidden.value)
12
- select.selectedIndex = index;
13
- });
14
- }
15
-
16
- var select = $('smsnotify_general_min_length_with_prefix');
17
- var hidden = $('smsnotify_general_min_length_with_prefix-hidden');
18
-
19
- if (select && hidden)
20
- {
21
- select.childElements().each(function(option, index) {
22
- if (option.value == hidden.value)
23
- select.selectedIndex = index;
24
- });
25
- }
26
- });
27
-
28
-
29
- /**
30
- * Number Filters Util
31
- * Library of some useful functions which is missing
32
- * in the standard JavaScript.
33
- */
34
- NFU = {
35
-
36
-
37
- /**
38
- * Function walks through all element's in the list and calls
39
- * callback whith item and index as arguments.
40
- *
41
- * If list or callback is not specifie function
42
- * does nothing.
43
- */
44
- each: function(list, callback)
45
- {
46
- if (!list || !callback)
47
- return;
48
-
49
- for (var i=0; i<list.length; i++)
50
- callback(list[i], i);
51
- },
52
-
53
-
54
- /**
55
- * Function returns first item of a list which satisfies a condition.
56
- * Condition is a function which returns a bool value (true/false).
57
- *
58
- * If the condition is not defined function returns first
59
- * item of array.
60
- *
61
- * If list is not specified or any child does not satisfy
62
- * the condition then function returns null.
63
- */
64
- first: function(list, condition)
65
- {
66
- if (!list)
67
- return null;
68
-
69
- if (!condition)
70
- condition = function() { return true; }
71
-
72
- for (var i=0; i<list.length; i++)
73
- if (condition(list[i]))
74
- return list[i];
75
-
76
- return null;
77
- },
78
-
79
-
80
- /**
81
- * Function returns last item of a list which satisfies a condition.
82
- *
83
- * If the condition is not defined then function returns last
84
- * item of array.
85
- *
86
- * If the list is not specified or any child does not satisfy
87
- * the condition then function returns null.
88
- */
89
- last: function(list, condition)
90
- {
91
- if (!list)
92
- return null;
93
-
94
- if (!condition)
95
- condition = function() { return true; }
96
-
97
- var lastsatisfy = null;
98
-
99
- for (var i=0; i<list.length; i++)
100
- if (condition(list[i]))
101
- lastsatisfy = list[i];
102
-
103
- return lastsatisfy;
104
- },
105
-
106
-
107
- /**
108
- * Function walk through all chars in a string and
109
- * call a callback on each.
110
- *
111
- * You can walk forward (reverse = false) or
112
- * backward (reverse = true).
113
- *
114
- * If string or the callback is not defined function
115
- * does nothing.
116
- */
117
- eachChars: function(string, reverse, callback)
118
- {
119
- if (!string || !callback)
120
- return;
121
-
122
- var start = reverse ? string.length-1 : 0;
123
- var end = reverse ? 0 : string.length;
124
- var step = reverse ? -1 : +1;
125
-
126
- for (i=start; i!=end; i=i+step) {
127
- callback(string.charAt(i), i);
128
- }
129
- },
130
-
131
-
132
- /**
133
- * Function walks through all childs of an element
134
- * with specified a tagNam and call a callable
135
- * on each.
136
- *
137
- * Callable is a function.
138
- *
139
- * If tagName is not specified function walks
140
- * through all chidls (include text nodes).
141
- *
142
- * If the element or the callable is not specified
143
- * function does nothing.
144
- */
145
- eachChilds: function(element, tagName, callable)
146
- {
147
- if (!element || !callable)
148
- return;
149
-
150
- var childs = NFU.getChilds(element, tagName);
151
- NFU.each(childs, callable);
152
- },
153
-
154
-
155
- /**
156
- * Function get first element with tagName which
157
- * satisfy a condition.
158
- *
159
- * If tagName is not specified function returns
160
- * any first element which satisfy a condition.
161
- *
162
- * If the condition is not defined function returns
163
- * first element withot testing.
164
- *
165
- * If element is not specified function does nothing.
166
- */
167
- firstChild: function(element, tagName, condition)
168
- {
169
- var childs = NFU.getChilds(element, tagName);
170
- return NFU.first(childs, condition);
171
- },
172
-
173
-
174
- /**
175
- * Function get last element with tagName which
176
- * satisfy a condition.
177
- *
178
- * If tagName is not specified function returns
179
- * any last element which satisfy a condition.
180
- *
181
- * If the condition is not defined function returns
182
- * last element withot testing.
183
- *
184
- * If element is not specified function does nothing.
185
- */
186
- lastChild: function(element, tagName, condition)
187
- {
188
- var childs = NFU.getChilds(element, tagName);
189
- return NFU.last(childs, condition);
190
- },
191
-
192
-
193
- /**
194
- * Function get first parent with tagName.
195
- *
196
- * If element is not define or there is no
197
- * parent with specified tagName function returns
198
- * null.
199
- *
200
- * If tagName is not specified method retruns
201
- * first parent no matter tagName.
202
- */
203
- firstParent: function(element, tagName)
204
- {
205
- if (!element)
206
- return null;
207
-
208
- var parent = element.parentNode;
209
-
210
- while (parent && tagName && parent.tagName != tagName)
211
- parent = parent.parentNode;
212
-
213
- if (parent && tagName && parent.tagName == tagName)
214
- return parent;
215
- else
216
- return null;
217
- },
218
-
219
-
220
- /**
221
- * Function rerurns all element's childrens.
222
- *
223
- * Note searching is non-recursive there are returned only
224
- * childrens in the first "generations".
225
- *
226
- * You can restrict visited childrens by tag name.
227
- *
228
- * If tag name is not specified function returns all
229
- * childrens (e.g: text nodes)
230
- *
231
- * If element is not specifie function
232
- * does nothing.
233
- */
234
- getChilds: function(element, tagName)
235
- {
236
- if (!element)
237
- return;
238
-
239
- var result = [];
240
-
241
- for (var i=0; i<element.childNodes.length; i++)
242
- {
243
- if (!tagName || (element.childNodes[i].tagName == tagName))
244
- {
245
- result.push(element.childNodes[i]);
246
- }
247
- }
248
-
249
- return result;
250
- },
251
-
252
-
253
- /**
254
- * Function rerurns all element's childrens.
255
- *
256
- * Note searching is recursive (deep) there are returned all
257
- * childrens.
258
- *
259
- * You can restrict visited childrens by tag name.
260
- *
261
- * If tag name is not specified function returns all
262
- * childrens (e.g: text nodes)
263
- *
264
- * If element is not specifie function
265
- * does nothing.
266
- */
267
- getChildsRecursively: function(element, tagName)
268
- {
269
- if (!element)
270
- return;
271
-
272
- var result = [];
273
-
274
- for (var i=0; i<element.childNodes.length; i++)
275
- {
276
- if (!tagName || (element.childNodes[i].tagName == tagName))
277
- {
278
- result.push(element.childNodes[i]);
279
- }
280
-
281
- NFU.each(NFU.getChildsRecursively(element.childNodes[i], tagName), function(child) {
282
- result.push(child);
283
- });
284
- }
285
-
286
- return result;
287
- },
288
-
289
-
290
- /**
291
- * Function returns all element which satisfy className
292
- * and tagName.
293
- *
294
- * Argument className is mandatory, if missing function
295
- * returns empty array.
296
- *
297
- * Argument tagName is optional.
298
- */
299
- getElementsByClassName: function(className, tagName)
300
- {
301
- if (!className)
302
- return [];
303
-
304
- if (!tagName)
305
- tagName = '*';
306
-
307
- var result = [];
308
-
309
- var elements = document.getElementsByTagName(tagName);
310
-
311
- for (var i=0; i<elements.length; i++)
312
- if (NFU.hasClassName(elements[i], className))
313
- result.push(elements[i]);
314
-
315
- return result;
316
- },
317
-
318
-
319
- /**
320
- * Function determines whether element's attribute
321
- * "className" contains a className or not
322
- *
323
- * element - tested element
324
- * className - tested className
325
- *
326
- * Function returns true when element's attribute "className"
327
- * contains className, otherwise function returns false.
328
- *
329
- * If element or className is not defined function returns false.
330
- */
331
- hasClassName: function(element, className)
332
- {
333
- if (!element || !className)
334
- return false;
335
-
336
- var reg = new RegExp("(^|\\s)" + className + "(\\s|$)");
337
-
338
- return reg.test(element.className);
339
- },
340
-
341
-
342
- /**
343
- * Function remove a className from the class attribute
344
- * of an element.
345
- *
346
- * If element or className is not specified function
347
- * does nothing.
348
- */
349
- removeClassName: function(element, className)
350
- {
351
- if (!element || !className)
352
- return;
353
-
354
- element.className = element.className.replace(className, '');
355
- },
356
-
357
-
358
- /**
359
- * Function add a className to an element.
360
- *
361
- * If element or className is not specified or element
362
- * already has className function does nothing.
363
- */
364
- addClassName: function(element, className)
365
- {
366
- if (!element || !className)
367
- return false;
368
-
369
- if (!NFU.hasClassName(element, className))
370
- element.className = element.className + " " + className;
371
- }
372
-
373
-
374
- };
375
-
376
-
377
- /**
378
- *
379
- */
380
- function FilterTable(id, filters)
381
- {
382
- /* this instance */
383
- var self = this;
384
-
385
-
386
- /* if of element TABLE represented this filters */
387
- this.id = id;
388
-
389
-
390
- /* instance of ancestor object */
391
- this.filters = filters;
392
-
393
-
394
- /* TABLE element represented this filters */
395
- this.table = document.getElementById(id);
396
- /* ROW element which is template for making another rows */
397
- this.template_row = document.getElementById(id+'-template');
398
- /* INPUT fields where are stored serialized values */
399
- this.field = document.getElementById(id+'-field');
400
- /* SELECT element with countries (you can switch the lists of filters by this) */
401
- this.country_select = document.getElementById(this.id+'-country');
402
-
403
-
404
- /**
405
- * Internal data.
406
- * Here are stored rows for all countries. This is important
407
- * because there may be filters for not selected country.
408
- *
409
- * {
410
- * country1 => [row1, row2, ...],
411
- * country2 => [row1, row2, ...]
412
- * ...
413
- * }
414
- */
415
- this.data = {};
416
-
417
-
418
- /**
419
- * Add filter to table for a country. If the country
420
- * is not specified function gets current displayed country.
421
- *
422
- * This function makes a TR element for filter and
423
- * insert it to internal this.data.
424
- *
425
- * If there is displayed the country which is
426
- * the inserted filter assigned for then the row
427
- * is appended to table.
428
- *
429
- * Function does not validate filter.
430
- * Function does not check the duplicity.
431
- */
432
- this.addFilter = function(filter, country)
433
- {
434
- // country is not specified, get current displayed
435
- if (!country)
436
- country = this.getCurrentCountry();
437
-
438
- // create new row by template
439
- var newrow = this.template_row.cloneNode(true);
440
-
441
- // clear some attributes
442
- newrow.id = "";
443
- newrow.style.display = "";
444
-
445
- // fill data
446
- NFU.each(NFU.getChildsRecursively(newrow, 'SPAN'), function(span) {
447
- if (NFU.hasClassName(span, 'value'))
448
- span.innerHTML = filter;
449
- if (NFU.hasClassName(span, 'prefix'))
450
- span.innerHTML = self.filters.getDialingCode(country);
451
- });
452
-
453
- // assign new row to data
454
- if (this.data[country])
455
- this.data[country].push(newrow);
456
- else
457
- this.data[country] = [newrow];
458
-
459
- // display row immediatly for current country
460
- if (country == this.getCurrentCountry())
461
- this.table.appendChild(newrow);
462
-
463
- // update input field with serialized data
464
- this.updateField();
465
- };
466
-
467
-
468
- /**
469
- * Update existed row by a new filter value.
470
- *
471
- * Function expected exactly TR element (they
472
- * are stored in this.data).
473
- */
474
- this.updateFilter = function(element, filter)
475
- {
476
- // search span 'value' and update them
477
- NFU.each(NFU.getChildsRecursively(element, 'SPAN'), function(span) {
478
- if (NFU.hasClassName(span, 'value'))
479
- span.innerHTML = filter;
480
- });
481
-
482
- // update input field with serialized data
483
- this.updateField();
484
- };
485
-
486
-
487
- /**
488
- * Remove a filter specified by its TR tag or some of
489
- * its children (row).
490
- *
491
- * If TR tag is not found function does nothing
492
- */
493
- this.removeFilter = function(row)
494
- {
495
- // search parent TR
496
- if (row.tagName != 'TR')
497
- row = NFU.firstParent(row, 'TR');
498
- if (row.tagName != 'TR')
499
- return;
500
-
501
- // remove row from internal data
502
- for (var country in this.data) {
503
- var index = this.data[country].indexOf(row);
504
- if (index != -1)
505
- this.data[country].splice(index, 1);
506
- }
507
-
508
- // remove from table immediatly
509
- row.parentNode.removeChild(row);
510
- // update input field with serialized data
511
- this.updateField();
512
- };
513
-
514
-
515
- /**
516
- * Extract the filter value from a row.
517
- *
518
- * This function works for all instances same way.
519
- */
520
- this.getValueByRow = function(row)
521
- {
522
- var val = "";
523
-
524
- // search value as HTML of SPAN 'value'
525
- NFU.each(NFU.getChildsRecursively(row, 'SPAN'), function(span) {
526
- if (NFU.hasClassName(span, 'value')) {
527
- val = span.innerHTML;
528
- }
529
- });
530
-
531
- return val;
532
- };
533
-
534
-
535
- /**
536
- * Get current the displayed country.
537
- * Value is get from this.country_select.
538
- */
539
- this.getCurrentCountry = function()
540
- {
541
- return this.country_select.options[this.country_select.selectedIndex].value;
542
- };
543
-
544
-
545
- /**
546
- * Change country. This function is an event handler of
547
- * event "change" of this.country_select.
548
- *
549
- * Function removes all rows from TABLE (not from this.data)
550
- * and again add all rows for new country.
551
- */
552
- this.changeCountry = function()
553
- {
554
- // get current displayed country
555
- var country = this.getCurrentCountry();
556
- // remove all TR from table
557
- this.removeAllRows();
558
-
559
- // walk through internal data and add rows
560
- // for the new displayed country
561
- if (this.data[country]) {
562
- NFU.each(this.data[country], function(row) {
563
- self.addExistedRow(row);
564
- });
565
- }
566
-
567
- // set class name for table
568
- if (this.data[country])
569
- NFU.removeClassName(this.filters.div, 'empty-filter');
570
- else
571
- NFU.addClassName(this.filters.div, 'empty-filter');
572
- };
573
-
574
-
575
- /**
576
- * Function removes all TR elements from TABLE
577
- * (except template row).
578
- *
579
- * Function removes only TR elements not rows
580
- * from this.data.
581
- */
582
- this.removeAllRows = function()
583
- {
584
- NFU.eachChilds(this.table, 'TR', function(row) {
585
- if (!NFU.hasClassName(row, this.id+'-template'))
586
- row.parentNode.removeChild(row);
587
- });
588
- };
589
-
590
-
591
- /**
592
- * Function adds an existed row (TR) element
593
- * to TABLE.
594
- */
595
- this.addExistedRow = function(row)
596
- {
597
- this.table.appendChild(row);
598
- };
599
-
600
-
601
- /**
602
- * Function updates INPUT fields with serialized values
603
- * from this.data values.
604
- *
605
- * Function also adds className 'has-filter' to OPTIONs of this.country_select
606
- * whih have some filters and removes this className from OPTIONs without filters.
607
- *
608
- * Filters will be sorted so that countries with filters preceeds the countries
609
- * without filters.
610
- *
611
- * Format:
612
- *
613
- * COUNTRY_CODE1,DIAL1,FILTER1;COUNTRY_CODE2,DIAL2,FILTER2;COUNTRY_CODE3,DIAL3,FILTER3 ...
614
- */
615
- this.updateField = function()
616
- {
617
- var vals = [];
618
-
619
- // get values for each country
620
- for (var country in this.data) {
621
- NFU.each(this.data[country], function(row) {
622
- vals.push(country+','+self.getValueByRow(row));
623
- });
624
- }
625
-
626
- // set serialized values
627
- this.field.value = vals.join(';');
628
-
629
- // remember selected countries
630
- var selected = '';
631
-
632
- NFU.eachChilds(this.country_select, 'OPTION', function(option)
633
- {
634
- if (option.selected)
635
- selected = option.value;
636
- });
637
-
638
- var with_filters = [];
639
- var without_filters = [];
640
-
641
- // remove filters
642
- NFU.eachChilds(this.country_select, 'OPTION', function(option)
643
- {
644
- if (self.data[option.value] && self.data[option.value].length > 0)
645
- with_filters.push(option);
646
- else
647
- without_filters.push(option);
648
-
649
- self.country_select.removeChild(option);
650
- });
651
-
652
- // sort both lists
653
- var sort_func = function sort(i1, i2) {
654
- return i1.innerHTML < i2.innerHTML ? -1 : i1.innerHTML > i2.innerHTML
655
- };
656
-
657
- with_filters.sort(sort_func);
658
- without_filters.sort(sort_func);
659
-
660
- // append countries with filters
661
- NFU.each(with_filters, function(option) {
662
- NFU.addClassName(option, 'has-filter');
663
- if (option.value == selected)
664
- option.selected = true;
665
- self.country_select.appendChild(option);
666
- });
667
-
668
- // append countries without filters
669
- NFU.each(without_filters, function(option) {
670
- NFU.removeClassName(option, 'has-filter');
671
- self.country_select.appendChild(option);
672
- });
673
-
674
- // select
675
- NFU.eachChilds(this.country_select, 'OPTION', function(option, index) {
676
- if (option.value == selected)
677
- self.country_select.selectedIndex = index;
678
- });
679
-
680
- // set class name for table
681
- if (this.field.value)
682
- NFU.removeClassName(this.filters.div, 'empty-filter');
683
- else
684
- NFU.addClassName(this.filters.div, 'empty-filter');
685
- };
686
-
687
-
688
- /**
689
- * Function get value from this.field and parses it
690
- * and fills the filter rows by this.
691
- *
692
- * Format:
693
- *
694
- * COUNTRY_CODE1,DIAL1,FILTER1;COUNTRY_CODE2,DIAL2,FILTER2;COUNTRY_CODE3,DIAL3,FILTER3 ...
695
- */
696
- this.loadValue = function()
697
- {
698
- // get value
699
- var val = this.field.value;
700
-
701
- // set class name for table
702
- if (val)
703
- NFU.removeClassName(this.filters.div, 'empty-filter');
704
- else
705
- NFU.addClassName(this.filters.div, 'empty-filter');
706
-
707
- // if there is no value does nothing
708
- if (!val)
709
- return;
710
-
711
- // clear internal data
712
- this.data = {};
713
- // remove all TR elements
714
- this.removeAllRows();
715
-
716
- // validator for filter pattern
717
- var validator = new RegExp('^[0-9\?]{0,15}[0-9\?*](-[0-9\?]{0,15}[0-9\?*])?$');
718
-
719
- var vals = val.split(';');
720
-
721
- // walk through all rows
722
- NFU.each(vals, function(val) {
723
-
724
- // split to parts
725
- var parts = val.split(',');
726
-
727
- // if number of parts does not corespond skip row
728
- if (parts.length != 3)
729
- return;
730
-
731
- // extract values
732
- var country = parts[0];
733
- var dial = parts[1];
734
- var filter = parts[2];
735
-
736
- // test filter
737
- if (!validator.test(filter))
738
- return;
739
-
740
- // all is right, add filter
741
- self.addFilter(filter, country+','+dial);
742
- });
743
- };
744
- };
745
-
746
-
747
- /**
748
- *
749
- */
750
- function FilterDialog(id, filters) {
751
-
752
- /* this instance */
753
- var self = this;
754
-
755
-
756
- /* if of element TABLE represented this filters */
757
- this.id = id;
758
-
759
-
760
- /* instance of ancestor object */
761
- this.filters = filters;
762
-
763
- /* DIV dialog */
764
- this.div = document.getElementById(id);
765
- /* DIV with digits in first row (pattern, left side of interval) */
766
- this.digits1 = document.getElementById(this.id+'-digits-1');
767
- /* DIV with digits in second row (right side of interval) */
768
- this.digits2 = document.getElementById(this.id+'-digits-2');
769
- /* INPUT radio for PATTERN */
770
- this.type1 = document.getElementById(this.id+'-type-1');
771
- /* INPUT radio for RANGE */
772
- this.type2 = document.getElementById(this.id+'-type-2');
773
-
774
-
775
- /**
776
- * Set a fliter value to dialog.
777
- *
778
- * Function setup radiobuttons and set digits.
779
- *
780
- * If filter is not specified then there will be used
781
- * '*' value.
782
- */
783
- this.setValue = function(filter)
784
- {
785
- if (!filter)
786
- filter = '*';
787
-
788
- this.clear();
789
-
790
- // parse filter value
791
- var parts = filter.split('-');
792
- var isRange = parts.length == 2;
793
-
794
- this.setType(isRange);
795
- this.setDigits(this.digits1, parts[0]);
796
-
797
- if (isRange)
798
- this.setDigits(this.digits2, parts[1]);
799
- };
800
-
801
-
802
- /**
803
- * Clear dialog (analogy set to '*').
804
- */
805
- this.clear = function()
806
- {
807
- this.setType(false);
808
- this.setDigits(this.digits1, '*');
809
- this.setDigits(this.digits2, '*');
810
- };
811
-
812
-
813
- /**
814
- * Set filter type (RANGE or PATTERN).
815
- *
816
- * Function set radion buttons and show/hide
817
- * the div with second digits (right side of inteval).
818
- */
819
- this.setType = function(isRange)
820
- {
821
- if (isRange) {
822
- this.type1.checked = "";
823
- this.type2.checked = "checked";
824
- this.digits2.style.display = 'block';
825
- } else {
826
- this.type1.checked = "checked";
827
- this.type2.checked = "";
828
- this.digits2.style.display = 'none';
829
- }
830
- };
831
-
832
-
833
- /**
834
- * Set digits.
835
- */
836
- this.setDigits = function(digits, value)
837
- {
838
- // set first digit to '*', it also removes
839
- // all followed digits
840
- var firstSelect = NFU.firstChild(digits, 'SELECT');
841
- firstSelect.selectedIndex = 0;
842
- self.selectDigit(firstSelect);
843
-
844
- // now walk through filter value and select
845
- // correspond digits
846
- NFU.eachChars(value, false, function(char) {
847
- lastSelect = NFU.lastChild(digits, 'SELECT');
848
- // 0 - *, 1-10 - digits [0-9], 11 - ?
849
- lastSelect.selectedIndex = (char == '?') ? 11 : new Number(char)+1;
850
- self.selectDigit(lastSelect);
851
- });
852
- };
853
-
854
-
855
- /**
856
- * Select single digit. Elem is SELECT represented
857
- * the position for the digit.
858
- */
859
- this.selectDigit = function(elem)
860
- {
861
- // get parent element for adding/removing digits
862
- var parent = elem.parentNode;
863
- // count of digits helps to determine whether
864
- // selected digits is last or not
865
- var count_select = NFU.getChilds(parent, 'SELECT').length;
866
-
867
- // get last child and last select
868
- // last child may be a text node i.e last child != last select
869
- var lastChild = NFU.lastChild(parent);
870
- var lastSelect = NFU.lastChild(parent, 'SELECT');
871
-
872
- // user choose '*' and there is a digit (SELECT)
873
- // so we have to remove all followed digits (SELECTs)
874
- if (elem.value == '*' && count_select > 0) {
875
- while (lastChild && lastChild != elem) {
876
- parent.removeChild(lastChild);
877
- lastChild = NFU.lastChild(parent);
878
- }
879
- // user choose a digit or ? for non-last select
880
- // (there is max 16 digits because phone numbers)
881
- // so we have to add next digits
882
- } else if (elem == lastSelect && count_select < 16) {
883
- var select = document.createElement('SELECT');
884
- this.filters.initOptions(select, this.filters.digits, '*');
885
- select.onclick = function() { self.selectDigit(select); };
886
- parent.appendChild(select);
887
- }
888
- };
889
-
890
-
891
- /**
892
- * Get completely value.
893
- */
894
- this.getValue = function()
895
- {
896
- // is selected range or pattern
897
- var isRange = this.type2.checked;
898
-
899
- // build serialize digits
900
- var val1 = "";
901
- var val2 = "";
902
-
903
- NFU.eachChilds(this.digits1, 'SELECT', function(select) {
904
- NFU.eachChilds(select, 'OPTION', function(option) {
905
- if (option.selected)
906
- val1 += option.innerHTML;
907
- });
908
- });
909
-
910
- if (isRange)
911
- {
912
- NFU.eachChilds(this.digits2, 'SELECT', function(select) {
913
- NFU.eachChilds(select, 'OPTION', function(option) {
914
- if (option.selected)
915
- val2 += option.innerHTML;
916
- });
917
- });
918
- }
919
-
920
- // validate interval
921
- if (isRange)
922
- {
923
- // first remove '*' from text
924
- // then chang '?' to '0' for left side and to '9' for right side
925
- var vval1 = val1.replace('*', '').replace('?', '0');
926
- var vval2 = val2.replace('*', '').replace('?', '9');
927
-
928
- // provide that both values have same sizes
929
- if (vval1.length > vval2.length)
930
- while (vval1.length > vval2.length)
931
- vval2 = vval2 + '9';
932
-
933
- if (vval2.length > vval1.length)
934
- while (vval2.length > vval1.length)
935
- vval1 = vval1 + '0';
936
-
937
- // cast to number
938
- var num1 = new Number(vval1);
939
- var num2 = new Number(vval2);
940
-
941
- // test
942
- if (num1 >= num2)
943
- {
944
- alert('Inccorect inteval. Left side ('+val1+') is greater than right side ('+val2+')');
945
- return false;
946
- }
947
- }
948
-
949
- return isRange ? val1 + '-' + val2 : val1;
950
- };
951
-
952
-
953
- /**
954
- * Function shows dialog.
955
- */
956
- this.show = function() {
957
- this.div.style.display = 'block';
958
- };
959
-
960
-
961
- /**
962
- * Function hides dialog
963
- */
964
- this.hide = function() {
965
- this.div.style.display = 'none';
966
- };
967
-
968
- };
969
-
970
-
971
- /**
972
- */
973
- function NumberFilters(id)
974
- {
975
- /* this instance */
976
- var self = this;
977
-
978
-
979
- /* prefix id */
980
- this.prefix_id = id;
981
-
982
- /* */
983
- this.div = document.getElementById(id);
984
-
985
- /* TABLE with include filters */
986
- this.filterTable = new FilterTable(id+'-filterTable', this);
987
- /* TABLE with exclude filters */
988
- //this.exclude = new FilterTable(id+'-exclude', this);
989
- /* DIALOG for set/edit filter */
990
- this.dialog = new FilterDialog(id+'-dialog', this);
991
-
992
- /* filter table current edited in dialog */
993
- this.openFilter = null;
994
- /* filter table row current edited in dialog */
995
- this.openRow = null;
996
-
997
-
998
- /**
999
- *
1000
- */
1001
- this.openDialog = function(filterTable, row)
1002
- {
1003
- if (row)
1004
- row = NFU.firstParent(row, 'TR');
1005
-
1006
- this.openFilter = filterTable;
1007
- this.openRow = row;
1008
-
1009
- var value = row ? filterTable.getValueByRow(row) : '*';
1010
-
1011
- this.dialog.setValue(value);
1012
- this.dialog.show();
1013
- };
1014
-
1015
-
1016
- /**
1017
- * Save dialog. User confirms his choice.
1018
- */
1019
- this.saveDialog = function()
1020
- {
1021
- var value = this.dialog.getValue();
1022
-
1023
- if (!value)
1024
- return;
1025
-
1026
- if (this.openRow)
1027
- this.openFilter.updateFilter(this.openRow, value);
1028
- else
1029
- this.openFilter.addFilter(value);
1030
-
1031
- this.openRow = null;
1032
- this.openFilter = null;
1033
-
1034
- this.dialog.hide();
1035
- };
1036
-
1037
-
1038
- /**
1039
- * Close dialog without saving.
1040
- * This does only hide the dialog.
1041
- */
1042
- this.closeDialog = function()
1043
- {
1044
- this.dialog.hide();
1045
- };
1046
-
1047
-
1048
- /**
1049
- * Load values froh hidden INPUTs to filter table.
1050
- */
1051
- this.loadValues = function()
1052
- {
1053
- this.filterTable.loadValue();
1054
-
1055
- this.filterTable.country_select.selectedIndex = 0;
1056
- this.filterTable.changeCountry();
1057
-
1058
- //this.include.loadValue();
1059
- //this.exclude.loadValue();
1060
- };
1061
-
1062
-
1063
- /**
1064
- * Init SELECT from sources.
1065
- */
1066
- this.initSelects = function(className, sources, defaultValue, label_callback)
1067
- {
1068
- var self = this;
1069
- var selects = NFU.getElementsByClassName(className, 'SELECT');
1070
-
1071
- NFU.each(selects, function(select) {
1072
- if (select.options.length == 0) {
1073
- self.initOptions(select, sources, defaultValue, label_callback);
1074
- }
1075
- });
1076
- };
1077
-
1078
-
1079
- /**
1080
- *
1081
- */
1082
- this.initOptions = function(select, sources, defaultValue, label_callback)
1083
- {
1084
- NFU.each(sources, function(source) {
1085
- var parts = source.split(':');
1086
- var index = parts[0];
1087
- var value = parts[1];
1088
- var label = (label_callback) ? label_callback(index, value) : value;
1089
-
1090
- var option = new Option(label, index);
1091
- if (defaultValue == index)
1092
- option.selected = true;
1093
- select.options[select.options.length] = option;
1094
- });
1095
- };
1096
-
1097
-
1098
- /**
1099
- * Function returns dialing codes for a country.
1100
- */
1101
- this.getDialingCode = function(country)
1102
- {
1103
- var parts = country.split(',');
1104
- return parts[1];
1105
- };
1106
-
1107
-
1108
- this.country_codes = [
1109
- 'AFG,93:Afghanistan',
1110
- 'ALB,355:Albania',
1111
- 'DZA,213:Algeria',
1112
- 'ASM,1684:American Samoa',
1113
- 'AND,376:Andorra',
1114
- 'AGO,244:Angola',
1115
- 'AIA,1264:Anguilla',
1116
- 'ATA,672:Antarctica',
1117
- 'ATG,1268:Antigua and Barbuda',
1118
- 'ARG,54:Argentina',
1119
- 'ARM,374:Armenia',
1120
- 'ABW,297:Aruba',
1121
- 'AUS,61:Australia',
1122
- 'AUT,43:Austria',
1123
- 'AZE,994:Azerbaijan',
1124
- 'BHS,1242:Bahamas',
1125
- 'BHR,973:Bahrain',
1126
- 'BGD,880:Bangladesh',
1127
- 'BRB,1246:Barbados',
1128
- 'BLR,375:Belarus',
1129
- 'BEL,32:Belgium',
1130
- 'BLZ,501:Belize',
1131
- 'BEN,229:Benin',
1132
- 'BMU,1441:Bermuda',
1133
- 'BTN,975:Bhutan',
1134
- 'BOL,591:Bolivia',
1135
- 'BIH,387:Bosnia and Herzegovina',
1136
- 'BWA,267:Botswana',
1137
- 'BRA,55:Brazil',
1138
- 'VGB,1284:British Virgin Islands',
1139
- 'BRN,673:Brunei',
1140
- 'BGR,359:Bulgaria',
1141
- 'BFA,226:Burkina Faso',
1142
- 'MMR,95:Burma (Myanmar)',
1143
- 'BDI,257:Burundi',
1144
- 'KHM,855:Cambodia',
1145
- 'CMR,237:Cameroon',
1146
- 'CAN,1:Canada',
1147
- 'CPV,238:Cape Verde',
1148
- 'CYM,1345:Cayman Islands',
1149
- 'CAF,236:Central African Republic',
1150
- 'TCD,235:Chad',
1151
- 'CHL,56:Chile',
1152
- 'CHN,86:China',
1153
- 'CXR,61:Christmas Island',
1154
- 'CCK,61:Cocos (Keeling) Islands',
1155
- 'COL,57:Colombia',
1156
- 'COM,269:Comoros',
1157
- 'COK,682:Cook Islands',
1158
- 'CRC,506:Costa Rica',
1159
- 'HRV,385:Croatia',
1160
- 'CUB,53:Cuba',
1161
- 'CYP,357:Cyprus',
1162
- 'CZE,420:Czech Republic',
1163
- 'COD,243:Democratic Republic of the Congo',
1164
- 'DNK,45:Denmark',
1165
- 'DJI,253:Djibouti',
1166
- 'DMA,1767:Dominica',
1167
- 'DOM,1809:Dominican Republic',
1168
- 'ECU,593:Ecuador',
1169
- 'EGY,20:Egypt',
1170
- 'SLV,503:El Salvador',
1171
- 'GNQ,240:Equatorial Guinea',
1172
- 'ERI,291:Eritrea',
1173
- 'EST,372:Estonia',
1174
- 'ETH,251:Ethiopia',
1175
- 'FLK,500:Falkland Islands',
1176
- 'FRO,298:Faroe Islands',
1177
- 'FJI,679:Fiji',
1178
- 'FIN,358:Finland',
1179
- 'FRA,33:France',
1180
- 'PYF,689:French Polynesia',
1181
- 'GAB,241:Gabon',
1182
- 'GMB,220:Gambia',
1183
- 'GEO,995:Georgia',
1184
- 'DEU,49:Germany',
1185
- 'GHA,233:Ghana',
1186
- 'GIB,350:Gibraltar',
1187
- 'GRC,30:Greece',
1188
- 'GRL,299:Greenland',
1189
- 'GRD,1473:Grenada',
1190
- 'GUM,1671:Guam',
1191
- 'GTM,502:Guatemala',
1192
- 'GIN,224:Guinea',
1193
- 'GNB,245:Guinea-Bissau',
1194
- 'GUY,592:Guyana',
1195
- 'HTI,509:Haiti',
1196
- 'VAT,39:Holy See (Vatican City)',
1197
- 'HND,504:Honduras',
1198
- 'HKG,852:Hong Kong',
1199
- 'HUN,36:Hungary',
1200
- 'IS,354:Iceland',
1201
- 'IND,91:India',
1202
- 'IDN,62:Indonesia',
1203
- 'IRN,98:Iran',
1204
- 'IRQ,964:Iraq',
1205
- 'IRL,353:Ireland',
1206
- 'IMN,44:Isle of Man',
1207
- 'ISR,972:Israel',
1208
- 'ITA,39:Italy',
1209
- 'CIV,225:Ivory Coast',
1210
- 'JAM,1876:Jamaica',
1211
- 'JPN,81:Japan',
1212
- 'JOR,962:Jordan',
1213
- 'KAZ,7:Kazakhstan',
1214
- 'KEN,254:Kenya',
1215
- 'KIR,686:Kiribati',
1216
- 'KWT,965:Kuwait',
1217
- 'KGZ,996:Kyrgyzstan',
1218
- 'LAO,856:Laos',
1219
- 'LVA,371:Latvia',
1220
- 'LBN,961:Lebanon',
1221
- 'LSO,266:Lesotho',
1222
- 'LBR,231:Liberia',
1223
- 'LBY,218:Libya',
1224
- 'LIE,423:Liechtenstein',
1225
- 'LTU,370:Lithuania',
1226
- 'LUX,352:Luxembourg',
1227
- 'MAC,853:Macau',
1228
- 'MKD,389:Macedonia',
1229
- 'MDG,261:Madagascar',
1230
- 'MWI,265:Malawi',
1231
- 'MYS,60:Malaysia',
1232
- 'MDV,960:Maldives',
1233
- 'MLI,223:Mali',
1234
- 'MLT,356:Malta',
1235
- 'MHL,692:Marshall Islands',
1236
- 'MRT,222:Mauritania',
1237
- 'MUS,230:Mauritius',
1238
- 'MYT,262:Mayotte',
1239
- 'MEX,52:Mexico',
1240
- 'FSM,691:Micronesia',
1241
- 'MDA,373:Moldova',
1242
- 'MCO,377:Monaco',
1243
- 'MNG,976:Mongolia',
1244
- 'MNE,382:Montenegro',
1245
- 'MSR,1664:Montserrat',
1246
- 'MAR,212:Morocco',
1247
- 'MOZ,258:Mozambique',
1248
- 'NAM,264:Namibia',
1249
- 'NRU,674:Nauru',
1250
- 'NPL,977:Nepal',
1251
- 'NLD,31:Netherlands',
1252
- 'ANT,599:Netherlands Antilles',
1253
- 'NCL,687:New Caledonia',
1254
- 'NZL,64:New Zealand',
1255
- 'NIC,505:Nicaragua',
1256
- 'NER,227:Niger',
1257
- 'NGA,234:Nigeria',
1258
- 'NIU,683:Niue',
1259
- 'NFK,672:Norfolk Island',
1260
- 'PRK,850:North Korea',
1261
- 'MNP,1670:Northern Mariana Islands',
1262
- 'NOR,47:Norway',
1263
- 'OMN,968:Oman',
1264
- 'PAK,92:Pakistan',
1265
- 'PLW,680:Palau',
1266
- 'PAN,507:Panama',
1267
- 'PNG,675:Papua New Guinea',
1268
- 'PRY,595:Paraguay',
1269
- 'PER,51:Peru',
1270
- 'PHL,63:Philippines',
1271
- 'PCN,870:Pitcairn Islands',
1272
- 'POL,48:Poland',
1273
- 'PRT,351:Portugal',
1274
- 'PRI,1:Puerto Rico',
1275
- 'QAT,974:Qatar',
1276
- 'COG,242:Republic of the Congo',
1277
- 'ROU,40:Romania',
1278
- 'RUS,7:Russia',
1279
- 'RWA,250:Rwanda',
1280
- 'BLM,590:Saint Barthelemy',
1281
- 'SHN,290:Saint Helena',
1282
- 'KNA,1869:Saint Kitts and Nevis',
1283
- 'LCA,1758:Saint Lucia',
1284
- 'MAF,1599:Saint Martin',
1285
- 'SPM,508:Saint Pierre and Miquelon',
1286
- 'VCT,1784:Saint Vincent and the Grenadines',
1287
- 'WSM,685:Samoa',
1288
- 'SMR,378:San Marino',
1289
- 'STP,239:Sao Tome and Principe',
1290
- 'SAU,966:Saudi Arabia',
1291
- 'SEN,221:Senegal',
1292
- 'SRB,381:Serbia',
1293
- 'SYC,248:Seychelles',
1294
- 'SLE,232:Sierra Leone',
1295
- 'SGP,65:Singapore',
1296
- 'SVK,421:Slovakia',
1297
- 'SVN,386:Slovenia',
1298
- 'SLB,677:Solomon Islands',
1299
- 'SOM,252:Somalia',
1300
- 'ZAF,27:South Africa',
1301
- 'KOR,82:South Korea',
1302
- 'ESP,34:Spain',
1303
- 'LKA,94:Sri Lanka',
1304
- 'SDN,249:Sudan',
1305
- 'SUR,597:Suriname',
1306
- 'SWZ,268:Swaziland',
1307
- 'SWE,46:Sweden',
1308
- 'CHE,41:Switzerland',
1309
- 'SYR,963:Syria',
1310
- 'TWN,886:Taiwan',
1311
- 'TJK,992:Tajikistan',
1312
- 'TZA,255:Tanzania',
1313
- 'THA,66:Thailand',
1314
- 'TLS,670:Timor-Leste',
1315
- 'TGO,228:Togo',
1316
- 'TKL,690:Tokelau',
1317
- 'TON,676:Tonga',
1318
- 'TTO,1868:Trinidad and Tobago',
1319
- 'TUN,216:Tunisia',
1320
- 'TUR,90:Turkey',
1321
- 'TKM,993:Turkmenistan',
1322
- 'TCA,1649:Turks and Caicos Islands',
1323
- 'TUV,688:Tuvalu',
1324
- 'UGA,256:Uganda',
1325
- 'UKR,380:Ukraine',
1326
- 'ARE,971:United Arab Emirates',
1327
- 'GBR,44:United Kingdom',
1328
- 'USA,1:United States',
1329
- 'URY,598:Uruguay',
1330
- 'VIR,1340:US Virgin Islands',
1331
- 'UZB,998:Uzbekistan',
1332
- 'VUT,678:Vanuatu',
1333
- 'VEN,58:Venezuela',
1334
- 'VNM,84:Vietnam',
1335
- 'WLF,681:Wallis and Futuna',
1336
- 'YEM,967:Yemen',
1337
- 'ZMB,260:Zambia',
1338
- 'ZWE,263:Zimbabwe'
1339
- ];
1340
-
1341
- this.max_digits_without_prefix = [
1342
- "0:0",
1343
- "1:1",
1344
- "2:2",
1345
- "3:3",
1346
- "4:4",
1347
- "5:5",
1348
- "6:6",
1349
- "7:7",
1350
- "8:8",
1351
- "9:9",
1352
- "10:10",
1353
- "11:11",
1354
- "12:12",
1355
- "13:13",
1356
- "14:14",
1357
- "15:15"
1358
- ];
1359
-
1360
- this.digits = [
1361
- "*:*", // any digit (a number of)
1362
- "0:0",
1363
- "1:1",
1364
- "2:2",
1365
- "3:3",
1366
- "4:4",
1367
- "5:5",
1368
- "6:6",
1369
- "7:7",
1370
- "8:8",
1371
- "9:9",
1372
- "?:?" // any digit (single)
1373
- ];
1374
-
1375
-
1376
- // intialize procedure
1377
- this.initSelects('max-number-for-prefix', this.max_digits_without_prefix, 9);
1378
- this.initSelects('digits', this.digits, '*');
1379
- this.initSelects('country-codes', this.country_codes, null, function(code, country_name) {
1380
- return country_name + " ("+self.getDialingCode(code)+")";
1381
- });
1382
-
1383
- this.loadValues();
1384
-
1385
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
package.xml CHANGED
@@ -1,7 +1,7 @@
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>SMSNotifier</name>
4
- <version>1.0.0</version>
5
  <stability>stable</stability>
6
  <license uri="http://www.artio.net/general/legal-documents">Copyright 2013, ARTIO s.r.o. All rights reserved.</license>
7
  <channel>community</channel>
@@ -11,9 +11,9 @@
11
  <notes>Visit product homepage at:
12
  http://www.artio.net/e-shop/magento-extensions/magento-sms-notifier</notes>
13
  <authors><author><name>Luk&#xE1;&#x161; Bialo&#x148;</name><user>auto-converted</user><email>lukas.bialon@artio.net</email></author><author><name>Ji&#x159;&#xED; Chmiel</name><user>auto-converted</user><email>jiri.chmiel@artio.net</email></author></authors>
14
- <date>2013-08-30</date>
15
- <time>16:25:03</time>
16
- <contents><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><file name="smsnotify.xml" hash="cb8f765f6a7df728764119b3c87f2308"/></dir><dir name="template"><dir name="smsnotify"><dir name="order"><dir name="view"><file name="history.phtml" hash="9fd5457941b5060da17515447fda18e0"/></dir><dir name="comments"><file name="view.phtml" hash="86154a1c4129198fa576e921fbbb2941"/></dir></dir></dir></dir></dir></dir></dir></target><target name="magecommunity"><dir name="Artio"><dir name="SMSNotifier"><dir name="controllers"><file name="AdminhtmlController.php" hash="8f3109bcc56b1355e7623cfdee183200"/></dir><dir name="Model"><dir name="Sms"><file name="Template.php" hash="64b5b81c69552307af66b3c209a15bc4"/><file name="Observer.php" hash="c628c7295e8ead74d8616e475f194d0c"/></dir><dir name="System"><dir name="Config"><dir name="Source"><file name="CountryFilter.php" hash="cface077f87945702f0f88a1dad54f4c"/><file name="Log.php" hash="c1663898225e6ef2fc73a5b9782b8b75"/><file name="Gateway.php" hash="d450d78264a43dd10f71f218c45d9a5c"/><file name="SendToAdmin.php" hash="30a23357c183f0aa8c098653178dbcd3"/><file name="Addresses.php" hash="506541d6d422a7a4a2e361766c3c2a7b"/></dir></dir></dir><file name="Sms.php" hash="063984eb94351f9aedc0d1eca8d0a09e"/><file name="Service.php" hash="93c0f34a24c119808d70ac140021c568"/><file name="Config.php" hash="ae17bff200f74875ab16e6d12c8dd120"/><file name="Observer.php" hash="790f88d23ba35b832d32458d0afd098b"/></dir><dir name="Block"><dir name="Adminhtml"><dir name="Send"><file name="Form.php" hash="2e6010c3cfa73d728e87558d9f54269a"/></dir><dir name="Data"><dir name="Form"><dir name="Element"><file name="CustomerNumbers.php" hash="5a9c081e4c28efa2db91f41618502a4b"/></dir></dir></dir><file name="Send.php" hash="56cb701ea7ae77b039f566f24d3d2944"/></dir></dir><dir name="etc"><file name="adminhtml.xml" hash="12b4f6eaf98b3ec8bf6c0e1d0fb54d88"/><file name="system.xml" hash="8ca07c1fef801e7af49c8636a83c5453"/><file name="config.xml" hash="76c19693fc13e0e09250f44233823168"/></dir><dir name="Helper"><file name="Data.php" hash="2ea5d0ff331938c387a0b0ae3c2726d4"/><file name="SMSLog.php" hash="e889508e6eea7a5577429d206ac55a6e"/></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Artio_SMSNotifyForMagento.xml" hash="7389e8a15b874b39a1b6a22800939b32"/></dir></target><target name="mage"><dir name="js"><dir name="artio"><file name="numberfilters.js" hash="e93f1c0ac0a0c160574524465571a9b2"/></dir></dir></target><target name="mageskin"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="images"><file name="entry_edit_head_arrow_x.gif" hash="3c49e7bbb6de956a903e6a018ca78477"/><file name="ico_mobil.png" hash="f69f028a51e391f1762bbfe150db8dd9"/></dir><file name="smsnotify.css" hash="31db226a9f2818a324e53d5fb549a6e2"/></dir></dir></dir></target><target name="magelib"><dir name="Varien"><dir name="Data"><dir name="Form"><dir name="Element"><file name="Numberfilters.php" hash="3a0837438a7ecb3b782560fe6a57596e"/><file name="Selectdynamic.php" hash="b525c625719d6489c09d87eb5a7025df"/><file name="Smstextarea.php" hash="ca482cf592bb6527c337b2d8cd1a0dad"/><file name="Accountinfo.php" hash="e3c6c03d33875c4e01c0427e18abcd65"/></dir></dir></dir></dir><dir name="Artio"><dir name="SMSService"><file name="smsservice.php" hash="49bcb6edd9f6fb4253867420d5e8b01b"/><file name="httphelper.php" hash="dea608b37e266a8e0ce1fee336d7a36c"/></dir></dir></target></contents>
17
  <compatible/>
18
  <dependencies/>
19
  </package>
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>SMSNotifier</name>
4
+ <version>1.0.1</version>
5
  <stability>stable</stability>
6
  <license uri="http://www.artio.net/general/legal-documents">Copyright 2013, ARTIO s.r.o. All rights reserved.</license>
7
  <channel>community</channel>
11
  <notes>Visit product homepage at:
12
  http://www.artio.net/e-shop/magento-extensions/magento-sms-notifier</notes>
13
  <authors><author><name>Luk&#xE1;&#x161; Bialo&#x148;</name><user>auto-converted</user><email>lukas.bialon@artio.net</email></author><author><name>Ji&#x159;&#xED; Chmiel</name><user>auto-converted</user><email>jiri.chmiel@artio.net</email></author></authors>
14
+ <date>2014-01-21</date>
15
+ <time>08:41:33</time>
16
+ <contents><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><file name="smsnotify.xml" hash="cb8f765f6a7df728764119b3c87f2308"/></dir><dir name="template"><dir name="smsnotify"><dir name="order"><dir name="view"><file name="history.phtml" hash="9fd5457941b5060da17515447fda18e0"/></dir><dir name="comments"><file name="view.phtml" hash="86154a1c4129198fa576e921fbbb2941"/></dir></dir></dir></dir></dir></dir></dir></target><target name="magecommunity"><dir name="Artio"><dir name="SMSNotifier"><dir name="controllers"><file name="AdminhtmlController.php" hash="2e32616f1c5304c64b7ecfefa8f8b073"/></dir><dir name="Model"><dir name="Sms"><file name="Template.php" hash="64b5b81c69552307af66b3c209a15bc4"/><file name="Observer.php" hash="c628c7295e8ead74d8616e475f194d0c"/></dir><dir name="System"><dir name="Config"><dir name="Source"><file name="CountryFilter.php" hash="cface077f87945702f0f88a1dad54f4c"/><file name="Log.php" hash="c1663898225e6ef2fc73a5b9782b8b75"/><file name="Gateway.php" hash="d450d78264a43dd10f71f218c45d9a5c"/><file name="SendToAdmin.php" hash="30a23357c183f0aa8c098653178dbcd3"/><file name="Addresses.php" hash="506541d6d422a7a4a2e361766c3c2a7b"/></dir></dir></dir><file name="Sms.php" hash="063984eb94351f9aedc0d1eca8d0a09e"/><file name="Service.php" hash="93c0f34a24c119808d70ac140021c568"/><file name="Config.php" hash="ae17bff200f74875ab16e6d12c8dd120"/><file name="Observer.php" hash="790f88d23ba35b832d32458d0afd098b"/></dir><dir name="Block"><dir name="Adminhtml"><dir name="Send"><file name="Form.php" hash="2e6010c3cfa73d728e87558d9f54269a"/></dir><dir name="Data"><dir name="Form"><dir name="Element"><file name="CustomerNumbers.php" hash="362dd8f790cb828f4e98c3658476d7e9"/></dir></dir></dir><file name="Send.php" hash="56cb701ea7ae77b039f566f24d3d2944"/></dir></dir><dir name="etc"><file name="adminhtml.xml" hash="3621cf3a577a2ca0a59443ffe7e740cb"/><file name="system.xml" hash="8ca07c1fef801e7af49c8636a83c5453"/><file name="config.xml" hash="205eb2249eebced10e3aad31f8984227"/></dir><dir name="Helper"><file name="Data.php" hash="2ea5d0ff331938c387a0b0ae3c2726d4"/><file name="SMSLog.php" hash="e889508e6eea7a5577429d206ac55a6e"/></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Artio_SMSNotifyForMagento.xml" hash="7389e8a15b874b39a1b6a22800939b32"/></dir></target><target name="mage"><dir name="js"><dir name="artio"><file name="numberfilters.js" hash=""/></dir></dir></target><target name="mageskin"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="images"><file name="entry_edit_head_arrow_x.gif" hash="3c49e7bbb6de956a903e6a018ca78477"/><file name="ico_mobil.png" hash="f69f028a51e391f1762bbfe150db8dd9"/></dir><file name="smsnotify.css" hash="8df1c8c5beea2c5b4c2bb062b00eb892"/></dir></dir></dir></target><target name="magelib"><dir name="Varien"><dir name="Data"><dir name="Form"><dir name="Element"><file name="Numberfilters.php" hash="3a0837438a7ecb3b782560fe6a57596e"/><file name="Selectdynamic.php" hash="b525c625719d6489c09d87eb5a7025df"/><file name="Smstextarea.php" hash="ca482cf592bb6527c337b2d8cd1a0dad"/><file name="Accountinfo.php" hash="e3c6c03d33875c4e01c0427e18abcd65"/></dir></dir></dir></dir><dir name="Artio"><dir name="SMSService"><file name="smsservice.php" hash="49bcb6edd9f6fb4253867420d5e8b01b"/><file name="httphelper.php" hash="dea608b37e266a8e0ce1fee336d7a36c"/></dir></dir></target></contents>
17
  <compatible/>
18
  <dependencies/>
19
  </package>
skin/adminhtml/default/default/smsnotify.css CHANGED
@@ -46,7 +46,10 @@ button.delete span { background-position-x:3px; }
46
 
47
  div#sendsms_fieldset td.value { width:280px; }
48
 
49
- #table-numbers { width:100%; border-color:#aaa #c8c8c8 #c8c8c8 #aaa; border-width:1px; border-style:solid; }
 
 
 
50
  #table-numbers.empty-table { display:none; }
51
  #table-numbers td { background:#fff; }
52
  #table-numbers td.last { width:20px; }
46
 
47
  div#sendsms_fieldset td.value { width:280px; }
48
 
49
+ #table-numbers-empty-message { margin:3px 0 0; background:#eee; padding:5px 5px 10px; font-style:italic; }
50
+ #table-numbers-empty-message.hidden { display:none; }
51
+
52
+ #table-numbers { width:100%; border-color:#aaa #c8c8c8 #c8c8c8 #aaa; border-width:1px; border-style:solid; margin-top:5px; }
53
  #table-numbers.empty-table { display:none; }
54
  #table-numbers td { background:#fff; }
55
  #table-numbers td.last { width:20px; }