imagine_cms 4.1.4 → 4.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. checksums.yaml +4 -4
  2. data/README.rdoc +2 -1
  3. data/app/assets/images/interface/form_loading.gif +0 -0
  4. data/app/assets/images/management/btn-top-delete.png +0 -0
  5. data/app/assets/images/management/btn-top-edit.png +0 -0
  6. data/app/assets/images/management/btn-top-exterminate.png +0 -0
  7. data/app/assets/images/management/btn-top-new.png +0 -0
  8. data/app/assets/images/management/btn-top-preview.png +0 -0
  9. data/app/assets/images/management/btn-top-properties.png +0 -0
  10. data/app/assets/javascripts/codemirror/modes-custom/imagine_cms.js +87 -0
  11. data/app/assets/javascripts/imagine_cms/core.js +510 -0
  12. data/app/assets/javascripts/imagine_cms/legacy/misc.js +537 -0
  13. data/app/assets/javascripts/imagine_cms/legacy/rollovers.js +193 -0
  14. data/app/assets/javascripts/imagine_cms/legacy/slideshow.js +116 -0
  15. data/app/assets/javascripts/imagine_cms/legacy/textfieldhints.js +55 -0
  16. data/app/assets/javascripts/imagine_cms.js +14 -1
  17. data/app/assets/javascripts/imagine_cms_compat.js +26 -0
  18. data/app/assets/javascripts/jquery-ui.js +16608 -0
  19. data/app/assets/javascripts/tag-it.js +591 -0
  20. data/app/assets/stylesheets/imagine_cms.css.scss +26 -10
  21. data/app/assets/stylesheets/imagine_controls.css.scss +8 -0
  22. data/app/assets/stylesheets/jquery-ui.css +1225 -0
  23. data/app/assets/stylesheets/jquery-ui.structure.css +833 -0
  24. data/app/assets/stylesheets/jquery-ui.theme.css +410 -0
  25. data/app/assets/stylesheets/jquery.tagit.css +69 -0
  26. data/app/assets/stylesheets/management.css.scss +7 -0
  27. data/app/assets/stylesheets/tagit.ui-imagine.css +100 -0
  28. data/app/controllers/cms/content_controller.rb +28 -45
  29. data/app/controllers/management/cms_controller.rb +116 -94
  30. data/app/helpers/cms_application_helper.rb +76 -39
  31. data/app/models/cms_page.rb +32 -14
  32. data/app/models/cms_page_object.rb +1 -1
  33. data/app/models/cms_page_tag.rb +2 -2
  34. data/app/models/cms_template.rb +1 -1
  35. data/app/models/user.rb +6 -6
  36. data/app/models/user_group.rb +1 -1
  37. data/app/views/cms/content/_photo_gallery.html.erb +12 -12
  38. data/app/views/cms/content/_search.html.erb +2 -2
  39. data/app/views/cms/content/_search_result.html.erb +16 -10
  40. data/app/views/layouts/management.html.erb +18 -17
  41. data/app/views/management/cms/_edit_page.html.erb +47 -33
  42. data/app/views/management/cms/_gallery_index.html.erb +4 -4
  43. data/app/views/management/cms/_image.html.erb +3 -3
  44. data/app/views/management/cms/_image_details.html.erb +9 -8
  45. data/app/views/management/cms/_list_page.html.erb +2 -2
  46. data/app/views/management/cms/_list_page_select.html.erb +1 -1
  47. data/app/views/management/cms/_page_list.html.erb +69 -48
  48. data/app/views/management/cms/_page_list_source_folder.html.erb +2 -2
  49. data/app/views/management/cms/_template_options.html.erb +4 -4
  50. data/app/views/management/cms/_template_reference.html.erb +13 -15
  51. data/app/views/management/cms/edit_page_content.html.erb +3 -3
  52. data/app/views/management/cms/edit_snippet.html.erb +19 -41
  53. data/app/views/management/cms/edit_template.html.erb +15 -38
  54. data/app/views/management/cms/pages.html.erb +17 -29
  55. data/app/views/management/cms/snippets.html.erb +2 -2
  56. data/app/views/management/cms/templates.html.erb +2 -2
  57. data/app/views/management/cms/toolbar_edit.html.erb +2 -0
  58. data/app/views/management/cms/toolbar_preview.html.erb +2 -2
  59. data/config/initializers/config_file.rb +1 -1
  60. data/imagine_cms.gemspec +7 -4
  61. data/lib/extensions/action_controller_extensions.rb +50 -19
  62. data/lib/imagine_cms/engine.rb +12 -8
  63. data/lib/imagine_cms/version.rb +1 -1
  64. data/lib/prototype_legacy_helper/lib/prototype_legacy_helper.rb +2 -2
  65. data/lib/tasks/imagine_cms_tasks.rake +8 -0
  66. metadata +69 -91
  67. data/app/assets/images/management/btn_archive.gif +0 -0
  68. data/app/assets/images/management/btn_delete.gif +0 -0
  69. data/app/assets/images/management/btn_duplicate.gif +0 -0
  70. data/app/assets/images/management/btn_edit.gif +0 -0
  71. data/app/assets/images/management/btn_new_page.gif +0 -0
  72. data/app/assets/images/management/btn_preview.gif +0 -0
  73. data/app/assets/images/management/btn_properties.gif +0 -0
  74. data/app/assets/images/management/btn_restore.gif +0 -0
  75. data/app/assets/images/management/btn_top_delete.gif +0 -0
  76. data/app/assets/images/management/btn_top_duplicate.gif +0 -0
  77. data/app/assets/images/management/btn_top_edit.gif +0 -0
  78. data/app/assets/images/management/btn_top_new.gif +0 -0
  79. data/app/assets/images/management/btn_top_preview.gif +0 -0
  80. data/app/assets/images/management/btn_top_properties.gif +0 -0
  81. data/app/assets/javascripts/codepress/codepress.html +0 -36
  82. data/app/assets/javascripts/codepress/codepress.js +0 -130
  83. data/app/assets/javascripts/codepress/engines/gecko.js +0 -240
  84. data/app/assets/javascripts/codepress/engines/khtml.js +0 -0
  85. data/app/assets/javascripts/codepress/engines/msie.js +0 -263
  86. data/app/assets/javascripts/codepress/engines/older.js +0 -0
  87. data/app/assets/javascripts/codepress/engines/opera.js +0 -259
  88. data/app/assets/javascripts/codepress/languages/css.js +0 -23
  89. data/app/assets/javascripts/codepress/languages/generic.js +0 -25
  90. data/app/assets/javascripts/codepress/languages/html.js +0 -63
  91. data/app/assets/javascripts/codepress/languages/java.js +0 -24
  92. data/app/assets/javascripts/codepress/languages/javascript.js +0 -30
  93. data/app/assets/javascripts/codepress/languages/perl.js +0 -27
  94. data/app/assets/javascripts/codepress/languages/php.js +0 -60
  95. data/app/assets/javascripts/codepress/languages/ruby.js +0 -26
  96. data/app/assets/javascripts/codepress/languages/sql.js +0 -30
  97. data/app/assets/javascripts/codepress/languages/text.js +0 -9
  98. data/app/assets/javascripts/imagine.js +0 -1393
  99. data/app/assets/stylesheets/codepress/codepress.css +0 -7
  100. data/app/assets/stylesheets/codepress/languages/css.css +0 -10
  101. data/app/assets/stylesheets/codepress/languages/generic.css +0 -9
  102. data/app/assets/stylesheets/codepress/languages/html.css +0 -18
  103. data/app/assets/stylesheets/codepress/languages/java.css +0 -7
  104. data/app/assets/stylesheets/codepress/languages/javascript.css +0 -8
  105. data/app/assets/stylesheets/codepress/languages/perl.css +0 -11
  106. data/app/assets/stylesheets/codepress/languages/php.css +0 -12
  107. data/app/assets/stylesheets/codepress/languages/ruby.css +0 -10
  108. data/app/assets/stylesheets/codepress/languages/sql.css +0 -10
  109. data/app/assets/stylesheets/codepress/languages/text.css +0 -5
@@ -0,0 +1,537 @@
1
+ function addLoadEvent(func) {
2
+ var oldonload = window.onload;
3
+ if (typeof window.onload != 'function') {
4
+ window.onload = func;
5
+ } else {
6
+ window.onload = function() {
7
+ oldonload();
8
+ func();
9
+ }
10
+ }
11
+ }
12
+
13
+ function addUnloadEvent(func) {
14
+ var oldonunload = window.onunload;
15
+ if (typeof window.onunload != 'function') {
16
+ window.onunload = func;
17
+ } else {
18
+ window.onunload = function() {
19
+ oldonunload();
20
+ func();
21
+ }
22
+ }
23
+ }
24
+
25
+
26
+ /********************************
27
+ * dialog/popup functions *
28
+ ********************************/
29
+
30
+ function openDialog(url, w, h, opts) {
31
+ window.open(url, '_blank', (w && h ? 'width=' + w + ',height=' + h : '') + (typeof(opts) == 'undefined' ? '' : ',' + opts));
32
+ }
33
+
34
+ // resize the window to fit the content
35
+ function autoResize(masterDiv) {
36
+ if (typeof(masterDiv) == 'undefined') {
37
+ masterDiv = $('masterDiv');
38
+ } else {
39
+ masterDiv = $(masterDiv);
40
+ }
41
+ var max = Math.min(screen.height - 100, 800);
42
+ var ht = Math.min(masterDiv.scrollHeight, max);
43
+
44
+ if (typeof(window.innerWidth) == 'number') {
45
+ //Non-IE
46
+ myWidth = window.innerWidth;
47
+ myHeight = window.innerHeight;
48
+ } else if (document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight)) {
49
+ //IE 6+ in 'standards compliant mode'
50
+ myWidth = document.documentElement.clientWidth;
51
+ myHeight = document.documentElement.clientHeight;
52
+ } else if (document.body && (document.body.clientWidth || document.body.clientHeight)) {
53
+ //IE 4 compatible
54
+ myWidth = document.body.clientWidth;
55
+ myHeight = document.body.clientHeight;
56
+ }
57
+
58
+ resizeBy(0, ht - myHeight);
59
+ }
60
+
61
+ // the opposite... resize the content to fit the window
62
+ function autoResizeDiv(masterDiv, adjustment) {
63
+ if (typeof(masterDiv) == 'undefined') {
64
+ masterDiv = $('masterDiv');
65
+ } else {
66
+ masterDiv = $(masterDiv);
67
+ }
68
+ if (typeof(adjustment) == 'undefined') adjustment = 0;
69
+
70
+ var max = Math.min(screen.height - 100, 800);
71
+ var ht = Math.min(masterDiv.scrollHeight, max);
72
+
73
+ if (typeof(window.innerWidth) == 'number') {
74
+ //Non-IE
75
+ myWidth = window.innerWidth;
76
+ myHeight = window.innerHeight;
77
+ } else if (document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight)) {
78
+ //IE 6+ in 'standards compliant mode'
79
+ myWidth = document.documentElement.clientWidth;
80
+ myHeight = document.documentElement.clientHeight;
81
+ } else if (document.body && (document.body.clientWidth || document.body.clientHeight)) {
82
+ //IE 4 compatible
83
+ myWidth = document.body.clientWidth;
84
+ myHeight = document.body.clientHeight;
85
+ }
86
+
87
+ masterDiv.style.height = myHeight - 200 + adjustment + 'px';
88
+ }
89
+
90
+
91
+ /********************************
92
+ * horizontal tab interface *
93
+ ********************************/
94
+
95
+ function setPageVisibility() {
96
+ var opts = $A($('page_select').options);
97
+ opts.each(function (opt) {
98
+ $(opt.value).hide();
99
+ });
100
+ $($F('page_select')).show();
101
+ }
102
+
103
+
104
+ /********************************
105
+ * vertical tab interface *
106
+ ********************************/
107
+
108
+ function selectTab(tabName, tabArray, tabBtnPrefix, tabDivPrefix, hiddenTextFieldId) {
109
+ tabArray._each(function (tab) {
110
+ $(tabBtnPrefix + tab).className = 'tab_normal';
111
+ $(tabDivPrefix + tab).style.display = 'none';
112
+ })
113
+ $('pmtbtn_' + tabName).className = 'tab_selected';
114
+ $('pmtinfo_' + tabName).style.display = '';
115
+ $(hiddenTextFieldId).value = tabName;
116
+ }
117
+
118
+
119
+ function setReportDates(interval) {
120
+ startDateField = $('report_start_date');
121
+ endDateField = $('report_end_date');
122
+ today = startDate = endDate = new Date();
123
+
124
+ switch (interval) {
125
+ case 'yesterday':
126
+ startDate = new Date('' + (today.getMonth()+1) + '/' + (today.getDate()-1) + '/' + today.getYear());
127
+ endDate = startDate;
128
+ break;
129
+
130
+ case 'last_month':
131
+ startDate = new Date('' + today.getMonth() + '/1/' + today.getYear());
132
+ endDate = new Date('' + (today.getMonth()+1) + '/0/' + today.getYear());
133
+ break;
134
+
135
+ case 'last_quarter':
136
+ startMonth = Math.floor(today.getMonth() / 3) * 3 - 3;
137
+ startYear = today.getYear();
138
+ if (startMonth < 0) {
139
+ startMonth += 12;
140
+ startYear--;
141
+ }
142
+ endMonth = startMonth + 3;
143
+ endYear = startYear;
144
+ if (endMonth > 11) {
145
+ endMonth -= 12;
146
+ endYear++;
147
+ }
148
+ startDate = new Date('' + (startMonth+1) + '/1/' + startYear);
149
+ endDate = new Date('' + (endMonth+1) + '/0/' + endYear);
150
+ break;
151
+
152
+ case 'last_year':
153
+ startDate = new Date('1/1/' + (today.getYear()-1));
154
+ endDate = new Date('12/31/' + (today.getYear()-1));
155
+ break;
156
+
157
+ case 'today':
158
+ startDate = new Date('' + (today.getMonth()+1 )+ '/' + today.getDate() + '/' + today.getYear());
159
+ endDate = startDate;
160
+ break;
161
+
162
+ case 'this_month':
163
+ startDate = new Date('' + (today.getMonth()+1) + '/1/' + today.getYear());
164
+ endDate = new Date('' + (today.getMonth()+2) + '/0/' + today.getYear());
165
+ break;
166
+
167
+ case 'this_quarter':
168
+ startMonth = Math.floor(today.getMonth() / 3) * 3;
169
+ endMonth = startMonth + 3;
170
+ endYear = startYear;
171
+ if (endMonth > 11) {
172
+ endMonth -= 12;
173
+ endYear++;
174
+ }
175
+ startDate = new Date('' + (startMonth+1) + '/1/' + today.getYear());
176
+ endDate = new Date('' + (endMonth+1) + '/0/' + endYear);
177
+ break;
178
+
179
+ case 'this_year':
180
+ startDate = new Date('1/1/' + today.getYear());
181
+ endDate = new Date('12/31/' + today.getYear());
182
+ break;
183
+
184
+ case 'all_time':
185
+ startDate = new Date('1/1/' + (today.getYear()-5));
186
+ endDate = new Date('12/31/' + (today.getYear()+50));
187
+ break;
188
+
189
+ default:
190
+ // same as "today"
191
+ startDate = new Date('' + (today.getMonth()+1 )+ '/' + today.getDate() + '/' + today.getYear());
192
+ endDate = startDate;
193
+ break;
194
+ }
195
+
196
+ startDateField.value = startDate.format('mm/dd/yyyy');
197
+ endDateField.value = endDate.format('mm/dd/yyyy');
198
+ }
199
+
200
+
201
+
202
+ /*
203
+ Date Format 1.1
204
+ (c) 2007 Steven Levithan <stevenlevithan.com>
205
+ MIT license
206
+ With code by Scott Trenda (Z and o flags, and enhanced brevity)
207
+ */
208
+
209
+ /*** dateFormat
210
+ Accepts a date, a mask, or a date and a mask.
211
+ Returns a formatted version of the given date.
212
+ The date defaults to the current date/time.
213
+ The mask defaults ``"ddd mmm d yyyy HH:MM:ss"``.
214
+ */
215
+ var dateFormat = function () {
216
+ var token = /d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloZ]|"[^"]*"|'[^']*'/g,
217
+ timezone = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g,
218
+ timezoneClip = /[^-+\dA-Z]/g,
219
+ pad = function (value, length) {
220
+ value = String(value);
221
+ length = parseInt(length) || 2;
222
+ while (value.length < length)
223
+ value = "0" + value;
224
+ return value;
225
+ };
226
+
227
+ // Regexes and supporting functions are cached through closure
228
+ return function (date, mask) {
229
+ // Treat the first argument as a mask if it doesn't contain any numbers
230
+ if (
231
+ arguments.length == 1 &&
232
+ (typeof date == "string" || date instanceof String) &&
233
+ !/\d/.test(date)
234
+ ) {
235
+ mask = date;
236
+ date = undefined;
237
+ }
238
+
239
+ date = date ? new Date(date) : new Date();
240
+ if (isNaN(date))
241
+ throw "invalid date";
242
+
243
+ var dF = dateFormat;
244
+ mask = String(dF.masks[mask] || mask || dF.masks["default"]);
245
+
246
+ var d = date.getDate(),
247
+ D = date.getDay(),
248
+ m = date.getMonth(),
249
+ y = date.getFullYear()+1900,
250
+ H = date.getHours(),
251
+ M = date.getMinutes(),
252
+ s = date.getSeconds(),
253
+ L = date.getMilliseconds(),
254
+ o = date.getTimezoneOffset(),
255
+ flags = {
256
+ d: d,
257
+ dd: pad(d),
258
+ ddd: dF.i18n.dayNames[D],
259
+ dddd: dF.i18n.dayNames[D + 7],
260
+ m: m + 1,
261
+ mm: pad(m + 1),
262
+ mmm: dF.i18n.monthNames[m],
263
+ mmmm: dF.i18n.monthNames[m + 12],
264
+ yy: String(y).slice(2),
265
+ yyyy: y,
266
+ h: H % 12 || 12,
267
+ hh: pad(H % 12 || 12),
268
+ H: H,
269
+ HH: pad(H),
270
+ M: M,
271
+ MM: pad(M),
272
+ s: s,
273
+ ss: pad(s),
274
+ l: pad(L, 3),
275
+ L: pad(L > 99 ? Math.round(L / 10) : L),
276
+ t: H < 12 ? "a" : "p",
277
+ tt: H < 12 ? "am" : "pm",
278
+ T: H < 12 ? "A" : "P",
279
+ TT: H < 12 ? "AM" : "PM",
280
+ Z: (String(date).match(timezone) || [""]).pop().replace(timezoneClip, ""),
281
+ o: (o > 0 ? "-" : "+") + pad(Math.floor(Math.abs(o) / 60) * 100 + Math.abs(o) % 60, 4)
282
+ };
283
+
284
+ return mask.replace(token, function ($0) {
285
+ return ($0 in flags) ? flags[$0] : $0.slice(1, $0.length - 1);
286
+ });
287
+ };
288
+ }();
289
+
290
+ // Some common format strings
291
+ dateFormat.masks = {
292
+ "default": "ddd mmm d yyyy HH:MM:ss",
293
+ shortDate: "m/d/yy",
294
+ mediumDate: "mmm d, yyyy",
295
+ longDate: "mmmm d, yyyy",
296
+ fullDate: "dddd, mmmm d, yyyy",
297
+ shortTime: "h:MM TT",
298
+ mediumTime: "h:MM:ss TT",
299
+ longTime: "h:MM:ss TT Z",
300
+ isoDate: "yyyy-mm-dd",
301
+ isoTime: "HH:MM:ss",
302
+ isoDateTime: "yyyy-mm-dd'T'HH:MM:ss",
303
+ isoFullDateTime: "yyyy-mm-dd'T'HH:MM:ss.lo"
304
+ };
305
+
306
+ // Internationalization strings
307
+ dateFormat.i18n = {
308
+ dayNames: [
309
+ "Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat",
310
+ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
311
+ ],
312
+ monthNames: [
313
+ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
314
+ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
315
+ ]
316
+ };
317
+
318
+ // For convenience...
319
+ Date.prototype.format = function (mask) {
320
+ return dateFormat(this, mask);
321
+ }
322
+
323
+
324
+ // Ultimate client-side JavaScript client sniff. Version 3.03
325
+ // (C) Netscape Communications 1999. Permission granted to reuse and distribute.
326
+ // Revised 17 May 99 to add is.nav5up and is.ie5up (see below).
327
+ // Revised 21 Nov 00 to add is.gecko and is.ie5_5 Also Changed is.nav5 and is.nav5up to is.nav6 and is.nav6up
328
+ // Revised 22 Feb 01 to correct Javascript Detection for IE 5.x, Opera 4,
329
+ // correct Opera 5 detection
330
+ // add support for winME and win2k
331
+ // synch with browser-type-oo.js
332
+ // Revised 26 Mar 01 to correct Opera detection
333
+ // Revised 02 Oct 01 to add IE6 detection
334
+
335
+ // Everything you always wanted to know about your JavaScript client
336
+ // but were afraid to ask ... "Is" is the constructor function for "is" object,
337
+ // which has properties indicating:
338
+ // (1) browser vendor:
339
+ // is.nav, is.ie, is.opera, is.hotjava, is.webtv, is.TVNavigator, is.AOLTV
340
+ // (2) browser version number:
341
+ // is.major (integer indicating major version number: 2, 3, 4 ...)
342
+ // is.minor (float indicating full version number: 2.02, 3.01, 4.04 ...)
343
+ // (3) browser vendor AND major version number
344
+ // is.nav2, is.nav3, is.nav4, is.nav4up, is.nav6, is.nav6up, is.gecko, is.ie3,
345
+ // is.ie4, is.ie4up, is.ie5, is.ie5up, is.ie5_5, is.ie5_5up, is.ie6, is.ie6up, is.hotjava3, is.hotjava3up
346
+ // (4) JavaScript version number:
347
+ // is.js (float indicating full JavaScript version number: 1, 1.1, 1.2 ...)
348
+ // (5) OS platform and version:
349
+ // is.win, is.win16, is.win32, is.win31, is.win95, is.winnt, is.win98, is.winme, is.win2k
350
+ // is.os2
351
+ // is.mac, is.mac68k, is.macppc
352
+ // is.unix
353
+ // is.sun, is.sun4, is.sun5, is.suni86
354
+ // is.irix, is.irix5, is.irix6
355
+ // is.hpux, is.hpux9, is.hpux10
356
+ // is.aix, is.aix1, is.aix2, is.aix3, is.aix4
357
+ // is.linux, is.sco, is.unixware, is.mpras, is.reliant
358
+ // is.dec, is.sinix, is.freebsd, is.bsd
359
+ // is.vms
360
+ //
361
+ // See http://www.it97.de/JavaScript/JS_tutorial/bstat/navobj.html and
362
+ // http://www.it97.de/JavaScript/JS_tutorial/bstat/Browseraol.html
363
+ // for detailed lists of userAgent strings.
364
+ //
365
+ // Note: you don't want your Nav4 or IE4 code to "turn off" or
366
+ // stop working when Nav5 and IE5 (or later) are released, so
367
+ // in conditional code forks, use is.nav4up ("Nav4 or greater")
368
+ // and is.ie4up ("IE4 or greater") instead of is.nav4 or is.ie4
369
+ // to check version in code which you want to work on future
370
+ // versions.
371
+
372
+
373
+ function Is ()
374
+ { // convert all characters to lowercase to simplify testing
375
+ var agt=navigator.userAgent.toLowerCase();
376
+
377
+ // *** BROWSER VERSION ***
378
+ // Note: On IE5, these return 4, so use is.ie5up to detect IE5.
379
+
380
+ this.major = parseInt(navigator.appVersion);
381
+ this.minor = parseFloat(navigator.appVersion);
382
+
383
+ // Note: Opera and WebTV spoof Navigator. We do strict client detection.
384
+ // If you want to allow spoofing, take out the tests for opera and webtv.
385
+ this.nav = ((agt.indexOf('mozilla')!=-1) && (agt.indexOf('spoofer')==-1)
386
+ && (agt.indexOf('compatible') == -1) && (agt.indexOf('opera')==-1)
387
+ && (agt.indexOf('webtv')==-1) && (agt.indexOf('hotjava')==-1));
388
+ this.nav2 = (this.nav && (this.major == 2));
389
+ this.nav3 = (this.nav && (this.major == 3));
390
+ this.nav4 = (this.nav && (this.major == 4));
391
+ this.nav4up = (this.nav && (this.major >= 4));
392
+ this.navonly = (this.nav && ((agt.indexOf(";nav") != -1) ||
393
+ (agt.indexOf("; nav") != -1)) );
394
+ this.nav6 = (this.nav && (this.major == 5));
395
+ this.nav6up = (this.nav && (this.major >= 5));
396
+ this.gecko = (agt.indexOf('gecko') != -1);
397
+
398
+
399
+ this.ie = ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1));
400
+ this.ie3 = (this.ie && (this.major < 4));
401
+ this.ie4 = (this.ie && (this.major == 4) && (agt.indexOf("msie 4")!=-1) );
402
+ this.ie4up = (this.ie && (this.major >= 4));
403
+ this.ie5 = (this.ie && (this.major == 4) && (agt.indexOf("msie 5.0")!=-1) );
404
+ this.ie5_5 = (this.ie && (this.major == 4) && (agt.indexOf("msie 5.5") !=-1));
405
+ this.ie5up = (this.ie && !this.ie3 && !this.ie4);
406
+ this.ie5_5up =(this.ie && !this.ie3 && !this.ie4 && !this.ie5);
407
+ this.ie6 = (this.ie && (this.major == 4) && (agt.indexOf("msie 6.")!=-1) );
408
+ this.ie6up = (this.ie && !this.ie3 && !this.ie4 && !this.ie5 && !this.ie5_5);
409
+ this.ie7 = (this.ie && (this.major == 4) && (agt.indexOf("msie 7.")!=-1) );
410
+ this.ie7up = (this.ie && !this.ie3 && !this.ie4 && !this.ie5 && !this.ie5_5 && !this.ie6);
411
+
412
+ // KNOWN BUG: On AOL4, returns false if IE3 is embedded browser
413
+ // or if this is the first browser window opened. Thus the
414
+ // variables is.aol, is.aol3, and is.aol4 aren't 100% reliable.
415
+ this.aol = (agt.indexOf("aol") != -1);
416
+ this.aol3 = (this.aol && this.ie3);
417
+ this.aol4 = (this.aol && this.ie4);
418
+ this.aol5 = (agt.indexOf("aol 5") != -1);
419
+ this.aol6 = (agt.indexOf("aol 6") != -1);
420
+
421
+ this.opera = (agt.indexOf("opera") != -1);
422
+ this.opera2 = (agt.indexOf("opera 2") != -1 || agt.indexOf("opera/2") != -1);
423
+ this.opera3 = (agt.indexOf("opera 3") != -1 || agt.indexOf("opera/3") != -1);
424
+ this.opera4 = (agt.indexOf("opera 4") != -1 || agt.indexOf("opera/4") != -1);
425
+ this.opera5 = (agt.indexOf("opera 5") != -1 || agt.indexOf("opera/5") != -1);
426
+ this.opera5up = (this.opera && !this.opera2 && !this.opera3 && !this.opera4);
427
+
428
+ this.webtv = (agt.indexOf("webtv") != -1);
429
+
430
+ this.TVNavigator = ((agt.indexOf("navio") != -1) || (agt.indexOf("navio_aoltv") != -1));
431
+ this.AOLTV = this.TVNavigator;
432
+
433
+ this.hotjava = (agt.indexOf("hotjava") != -1);
434
+ this.hotjava3 = (this.hotjava && (this.major == 3));
435
+ this.hotjava3up = (this.hotjava && (this.major >= 3));
436
+
437
+ // *** JAVASCRIPT VERSION CHECK ***
438
+ if (this.nav2 || this.ie3) this.js = 1.0;
439
+ else if (this.nav3) this.js = 1.1;
440
+ else if (this.opera5up) this.js = 1.3;
441
+ else if (this.opera) this.js = 1.1;
442
+ else if ((this.nav4 && (this.minor <= 4.05)) || this.ie4) this.js = 1.2;
443
+ else if ((this.nav4 && (this.minor > 4.05)) || this.ie5) this.js = 1.3;
444
+ else if (this.hotjava3up) this.js = 1.4;
445
+ else if (this.nav6 || this.gecko) this.js = 1.5;
446
+ // NOTE: In the future, update this code when newer versions of JS
447
+ // are released. For now, we try to provide some upward compatibility
448
+ // so that future versions of Nav and IE will show they are at
449
+ // *least* JS 1.x capable. Always check for JS version compatibility
450
+ // with > or >=.
451
+ else if (this.nav6up) this.js = 1.5;
452
+ // note ie5up on mac is 1.4
453
+ else if (this.ie5up) this.js = 1.3
454
+
455
+ // HACK: no idea for other browsers; always check for JS version with > or >=
456
+ else this.js = 0.0;
457
+
458
+ // *** PLATFORM ***
459
+ this.win = ( (agt.indexOf("win")!=-1) || (agt.indexOf("16bit")!=-1) );
460
+ // NOTE: On Opera 3.0, the userAgent string includes "Windows 95/NT4" on all
461
+ // Win32, so you can't distinguish between Win95 and WinNT.
462
+ this.win95 = ((agt.indexOf("win95")!=-1) || (agt.indexOf("windows 95")!=-1));
463
+
464
+ // is this a 16 bit compiled version?
465
+ this.win16 = ((agt.indexOf("win16")!=-1) ||
466
+ (agt.indexOf("16bit")!=-1) || (agt.indexOf("windows 3.1")!=-1) ||
467
+ (agt.indexOf("windows 16-bit")!=-1) );
468
+
469
+ this.win31 = ((agt.indexOf("windows 3.1")!=-1) || (agt.indexOf("win16")!=-1) ||
470
+ (agt.indexOf("windows 16-bit")!=-1));
471
+
472
+ // NOTE: Reliable detection of Win98 may not be possible. It appears that:
473
+ // - On Nav 4.x and before you'll get plain "Windows" in userAgent.
474
+ // - On Mercury client, the 32-bit version will return "Win98", but
475
+ // the 16-bit version running on Win98 will still return "Win95".
476
+ this.win98 = ((agt.indexOf("win98")!=-1) || (agt.indexOf("windows 98")!=-1));
477
+ this.winnt = ((agt.indexOf("winnt")!=-1) || (agt.indexOf("windows nt")!=-1));
478
+ this.win32 = (this.win95 || this.winnt || this.win98 ||
479
+ ((this.major >= 4) && (navigator.platform == "Win32")) ||
480
+ (agt.indexOf("win32")!=-1) || (agt.indexOf("32bit")!=-1));
481
+
482
+ this.winme = ((agt.indexOf("win 9x 4.90")!=-1));
483
+ this.win2k = ((agt.indexOf("windows nt 5.0")!=-1));
484
+
485
+ this.os2 = ((agt.indexOf("os/2")!=-1) ||
486
+ (navigator.appVersion.indexOf("OS/2")!=-1) ||
487
+ (agt.indexOf("ibm-webexplorer")!=-1));
488
+
489
+ this.mac = (agt.indexOf("mac")!=-1);
490
+ // hack ie5 js version for mac
491
+ if (this.mac && this.ie5up) this.js = 1.4;
492
+ this.mac68k = (this.mac && ((agt.indexOf("68k")!=-1) ||
493
+ (agt.indexOf("68000")!=-1)));
494
+ this.macppc = (this.mac && ((agt.indexOf("ppc")!=-1) ||
495
+ (agt.indexOf("powerpc")!=-1)));
496
+
497
+ this.sun = (agt.indexOf("sunos")!=-1);
498
+ this.sun4 = (agt.indexOf("sunos 4")!=-1);
499
+ this.sun5 = (agt.indexOf("sunos 5")!=-1);
500
+ this.suni86= (this.sun && (agt.indexOf("i86")!=-1));
501
+ this.irix = (agt.indexOf("irix") !=-1); // SGI
502
+ this.irix5 = (agt.indexOf("irix 5") !=-1);
503
+ this.irix6 = ((agt.indexOf("irix 6") !=-1) || (agt.indexOf("irix6") !=-1));
504
+ this.hpux = (agt.indexOf("hp-ux")!=-1);
505
+ this.hpux9 = (this.hpux && (agt.indexOf("09.")!=-1));
506
+ this.hpux10= (this.hpux && (agt.indexOf("10.")!=-1));
507
+ this.aix = (agt.indexOf("aix") !=-1); // IBM
508
+ this.aix1 = (agt.indexOf("aix 1") !=-1);
509
+ this.aix2 = (agt.indexOf("aix 2") !=-1);
510
+ this.aix3 = (agt.indexOf("aix 3") !=-1);
511
+ this.aix4 = (agt.indexOf("aix 4") !=-1);
512
+ this.linux = (agt.indexOf("inux")!=-1);
513
+ this.sco = (agt.indexOf("sco")!=-1) || (agt.indexOf("unix_sv")!=-1);
514
+ this.unixware = (agt.indexOf("unix_system_v")!=-1);
515
+ this.mpras = (agt.indexOf("ncr")!=-1);
516
+ this.reliant = (agt.indexOf("reliantunix")!=-1);
517
+ this.dec = ((agt.indexOf("dec")!=-1) || (agt.indexOf("osf1")!=-1) ||
518
+ (agt.indexOf("dec_alpha")!=-1) || (agt.indexOf("alphaserver")!=-1) ||
519
+ (agt.indexOf("ultrix")!=-1) || (agt.indexOf("alphastation")!=-1));
520
+ this.sinix = (agt.indexOf("sinix")!=-1);
521
+ this.freebsd = (agt.indexOf("freebsd")!=-1);
522
+ this.bsd = (agt.indexOf("bsd")!=-1);
523
+ this.unix = ((agt.indexOf("x11")!=-1) || this.sun || this.irix || this.hpux ||
524
+ this.sco ||this.unixware || this.mpras || this.reliant ||
525
+ this.dec || this.sinix || this.aix || this.linux || this.bsd || this.freebsd);
526
+
527
+ this.vms = ((agt.indexOf("vax")!=-1) || (agt.indexOf("openvms")!=-1));
528
+ }
529
+
530
+ var is;
531
+ var isIE3Mac = false;
532
+ // this section is designed specifically for IE3 for the Mac
533
+
534
+ if ((navigator.appVersion.indexOf("Mac")!=-1) && (navigator.userAgent.indexOf("MSIE")!=-1) &&
535
+ (parseInt(navigator.appVersion)==3))
536
+ isIE3Mac = true;
537
+ else is = new Is();