imagine_cms 4.1.4 → 4.2.0

Sign up to get free protection for your applications and to get access to all the features.
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();