comment-ripper 0.0.2 → 0.1.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.
@@ -0,0 +1,24 @@
1
+ class Comment < Token; end
2
+
3
+ class SingleLineCommentStart < Comment
4
+ self.symbol = "//"
5
+ end
6
+
7
+ class MultiLineCommentStart < Comment
8
+ self.symbol = "/*"
9
+ end
10
+
11
+ class MultiLineCommentEnd < Comment
12
+ self.symbol = "*/"
13
+ end
14
+
15
+ class PreservedCommentStart < Comment
16
+ self.symbol = "/*!"
17
+ end
18
+
19
+ class MultiLineComment < Comment; end
20
+
21
+ class PreservedComment < Comment; end
22
+
23
+ class SingleLineComment < Comment; end
24
+
@@ -0,0 +1,12 @@
1
+ class QuoteCharacter < Token; end
2
+
3
+ class QuotedString < Token; end
4
+
5
+ class SingleQuote < QuoteCharacter
6
+ self.symbol = "'"
7
+ end
8
+
9
+ class DoubleQuote < QuoteCharacter
10
+ self.symbol = '"'
11
+ end
12
+
@@ -0,0 +1,5 @@
1
+ class RegularExpression < Token; end
2
+
3
+ class Slash < Token
4
+ self.symbol = "/"
5
+ end
@@ -0,0 +1,80 @@
1
+ class Token
2
+ attr_reader :value
3
+ attr_reader :subtokens
4
+ attr_reader :position
5
+
6
+ def initialize(line=nil, character=nil, value=nil)
7
+ @subtokens = []
8
+
9
+ p = Position.new
10
+ p.line = line
11
+ p.character = character
12
+ @position = p
13
+ end
14
+
15
+ def ==(other)
16
+ if(false && other.is_a?(Token))
17
+ return @id == other.id
18
+ elsif(other.is_a?(String))
19
+ return @value == other
20
+ else
21
+ super
22
+ end
23
+ end
24
+
25
+ def <<(subtoken)
26
+ @subtokens << subtoken
27
+ end
28
+
29
+ def unshift(subtoken)
30
+ @subtokens.unshift subtoken
31
+ end
32
+
33
+ def symbol
34
+ @symbol || self.class.symbol
35
+ end
36
+
37
+ def symbol=(sym)
38
+ @symbol = sym
39
+ end
40
+
41
+ class << self
42
+ def match(other)
43
+ other == @symbol
44
+ end
45
+
46
+ def symbol
47
+ @symbol
48
+ end
49
+
50
+ protected
51
+ def symbol=(sym)
52
+ @symbol = sym
53
+ end
54
+ end
55
+
56
+ def to_s
57
+ ret = [symbol]
58
+ ret += subtokens.map{|t| t.symbol} unless subtokens.nil?
59
+ ret.join
60
+ end
61
+
62
+ def inspect
63
+ ins = ["<"]
64
+ ins << self.class.to_s
65
+ ins << ":'"
66
+ ins << symbol
67
+ ins << "':["
68
+ unless subtokens.nil? or subtokens.empty?
69
+ ins << subtokens.map{|d| d.symbol}.join
70
+ end
71
+ ins << "]>"
72
+
73
+ ins.join
74
+ end
75
+
76
+ class Position
77
+ attr_accessor :line
78
+ attr_accessor :character
79
+ end
80
+ end
@@ -0,0 +1,11 @@
1
+ class Newline < Token
2
+ self.symbol = "\n"
3
+ end
4
+
5
+ class Tab < Token
6
+ self.symbol = "\t"
7
+ end
8
+
9
+ class Space < Token
10
+ self.symbol = " "
11
+ end
@@ -0,0 +1,13 @@
1
+ class Character < Token
2
+ def initialize(line, character, text_value)
3
+ super(line, character)
4
+ self.symbol = text_value
5
+ end
6
+ end
7
+
8
+ class EscapeCharacter < Token
9
+ self.symbol = "\\"
10
+ end
11
+
12
+ class Word < Token; end
13
+
@@ -1,36 +1,238 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
- require 'javascript'
2
+ require 'javascript/comment_stripper'
3
3
 
4
- describe JavascriptParser do
5
- before do
6
- @p = JavascriptParser.new
4
+ describe CommentRipper do
5
+ def get_output(input)
6
+ CommentRipper::Javascript.new.strip(input)
7
7
  end
8
8
 
9
9
  it "shouldn't touch non-comment code" do
10
10
  input = <<-JS
11
11
  alert("cat");
12
12
  JS
13
- output = @p.parse(input).text_value
14
13
  expected_output = input
15
-
14
+ output = get_output(input)
16
15
  output.should == expected_output
17
16
  end
18
17
 
19
18
  it "should handle single-line comments on their own line" do
20
19
  input = %Q{// monkey!\nalert("cat");\n// tree!}
21
20
 
22
- expected_output = %q{alert("cat");}
23
- output = @p.parse(input)
21
+ expected_output = %q{alert("cat");} + "\n"
22
+ output = get_output(input)
24
23
 
25
- output.value.should == expected_output
24
+ output.should == expected_output
25
+ end
26
+
27
+ it "should handle multi-line comments on their own line" do
28
+ input = %Q{/* commento */\nnewLine();}
29
+
30
+ expected_output = %Q{newLine();}
31
+ output = get_output(input)
32
+
33
+ output.should == expected_output
26
34
  end
27
35
 
28
36
  it "should handle single-line comments at the end of regular lines" do
29
37
  input = %Q{alert("cat"); // monkey! // banana!}
30
38
 
31
39
  expected_output = %Q{alert("cat");}
32
- output = @p.parse(input)
40
+ output = get_output(input)
41
+
42
+ output.should == expected_output
43
+ end
44
+
45
+
46
+ it "should handle indented single-line comments correctly" do
47
+ input = <<JS
48
+ // monkey
49
+ function(){
50
+ // some logic
51
+ code();
52
+ // end logic
53
+ bar();
54
+ }
55
+ JS
56
+ expected_output = <<JS
57
+ function(){
58
+ code();
59
+ bar();
60
+ }
61
+ JS
62
+ output = get_output(input)
63
+ output.should == expected_output
64
+ end
65
+
66
+ it "should handle indented multi-line comments correctly" do
67
+ input = <<JS
68
+ function red(){
69
+ /* multi-comment */
70
+ baz();
71
+ }
72
+ JS
73
+ expected_output = <<JS
74
+ function red(){
75
+ baz();
76
+ }
77
+ JS
78
+ output = get_output(input)
79
+ output.should == expected_output
80
+ end
81
+
82
+ it "should handle comments at the end of code lines" do
83
+ input = <<JS
84
+ function(){
85
+ end_of_the_line(); // yes, these work too.
86
+ }
87
+ JS
88
+ expected_output = <<JS
89
+ function(){
90
+ end_of_the_line();
91
+ }
92
+ JS
93
+ output = get_output(input)
94
+ output.should == expected_output
95
+ end
96
+
97
+ it "should handle nested comments correctly" do
98
+ input = <<JS
99
+ function disabled_code(){
100
+ /*
101
+ alert("hi");
102
+ //*/
103
+ }
104
+
105
+ function actually_active_code(){
106
+ //*
107
+ alert("bye");
108
+ //*/
109
+ }
110
+ JS
111
+ expected_output = <<JS
112
+ function disabled_code(){
113
+ }
33
114
 
34
- output.value.should == expected_output
115
+ function actually_active_code(){
116
+ alert("bye");
117
+ }
118
+ JS
119
+ output = get_output(input)
120
+ output.should == expected_output
121
+ end
122
+
123
+ it "should handle single-line comments in the middle of strings" do
124
+ input = <<JS
125
+ var red = "tilted//lines";
126
+ var green = 'single//quotes';
127
+ JS
128
+ expected_output = input
129
+ output = get_output(input)
130
+ output.should == expected_output
131
+ end
132
+
133
+ it "should handle multi-line comments in the middle of strings" do
134
+ input = <<JS
135
+ var red = "foo /*bar*/ baz";
136
+ var green = 'foo /* bar */ baz';
137
+ JS
138
+ expected_output = input
139
+ output = get_output(input)
140
+ output.should == expected_output
141
+ end
142
+
143
+ it "should leave important multi-line comments intact" do
144
+ input = <<JS
145
+ /*! Some license agreement or other! */
146
+ function coolCode() {}
147
+ JS
148
+ expected_output = input
149
+ output = get_output(input)
150
+ output.should == expected_output
151
+ end
152
+
153
+ it "should handle multi-line comments in the middle of the line" do
154
+ input = <<JS
155
+ function poorlyNamedFunction(/* thing1 */arg1, /* thing2 */arg2){
156
+ doNothing();
157
+ }
158
+ JS
159
+ expected_output = <<JS
160
+ function poorlyNamedFunction(arg1,arg2){
161
+ doNothing();
162
+ }
163
+ JS
164
+ output = get_output(input)
165
+ output.should == expected_output
166
+ end
167
+
168
+ it "should handle comments in the middle of nefarious multiline strings" do
169
+ input = <<JS
170
+ var animals = "chicken \
171
+ bear // kodiak \
172
+ pig // a pink one";
173
+ JS
174
+ expected_output = input
175
+ output = get_output(input)
176
+ output.should == expected_output
177
+ end
178
+
179
+ it "should handle special characters in the middle of regular expressions" do
180
+ input = <<JS
181
+ function urlEncodeIfNecessary(s) {
182
+ var regex = /[\\\"<>\.;]/;
183
+ var hasBadChars = regex.exec(s) != null;
184
+ return hasBadChars && typeof encodeURIComponent != UNDEF ? encodeURIComponent(s) : s;
185
+ }
186
+ JS
187
+ expected_output = input
188
+ output = get_output(input)
189
+ output.should == expected_output
190
+ end
191
+
192
+ it "should handle divisions" do
193
+ input = <<JS
194
+ var milli = Math.floor(diff % 1000 / 100).toString();
195
+ JS
196
+ expected_output = input
197
+ output = get_output(input)
198
+ output.should == expected_output
199
+ end
200
+
201
+ describe "Unmatched symbol matching" do
202
+ it "should give good error reporting for unmatched single quotes" do
203
+ input = [<<JS, <<JS2, <<JS3]
204
+ var animals = ';
205
+ JS
206
+ //foo
207
+ var moo = ';
208
+ JS2
209
+ /*
210
+ multiline
211
+ */
212
+ function(){ var dog = ' };
213
+ JS3
214
+ output = ["L1 C15", "L2 C11", "L4 C23"]
215
+ (0...input.length).each do |i|
216
+ lambda { get_output(input[i]) }.should raise_exception(CommentRipper::UnmatchedTokenException, "Unmatched token: ' at #{output[i]}")
217
+ end
218
+ end
219
+
220
+ it "should provide good error reporting for unmatched double quotes" do
221
+ input = [<<JS, <<JS2, <<JS3]
222
+ var animals = ";
223
+ JS
224
+ //foo
225
+ var moo = ";
226
+ JS2
227
+ /*
228
+ multiline
229
+ */
230
+ function(){ var dog = " };
231
+ JS3
232
+ output = ["L1 C15", "L2 C11", "L4 C23"]
233
+ (0...input.length).each do |i|
234
+ lambda { get_output(input[i]) }.should raise_exception(CommentRipper::UnmatchedTokenException, "Unmatched token: \" at #{output[i]}")
235
+ end
236
+ end
35
237
  end
36
238
  end
@@ -0,0 +1,708 @@
1
+ /*! SWFObject v2.2 <http://code.google.com/p/swfobject/>
2
+ is released under the MIT License <http://www.opensource.org/licenses/mit-license.php>
3
+ */
4
+
5
+ var swfobject = function() {
6
+
7
+ var UNDEF = "undefined",
8
+ OBJECT = "object",
9
+ SHOCKWAVE_FLASH = "Shockwave Flash",
10
+ SHOCKWAVE_FLASH_AX = "ShockwaveFlash.ShockwaveFlash",
11
+ FLASH_MIME_TYPE = "application/x-shockwave-flash",
12
+ EXPRESS_INSTALL_ID = "SWFObjectExprInst",
13
+ ON_READY_STATE_CHANGE = "onreadystatechange",
14
+
15
+ win = window,
16
+ doc = document,
17
+ nav = navigator,
18
+
19
+ plugin = false,
20
+ domLoadFnArr = [main],
21
+ regObjArr = [],
22
+ objIdArr = [],
23
+ listenersArr = [],
24
+ storedAltContent,
25
+ storedAltContentId,
26
+ storedCallbackFn,
27
+ storedCallbackObj,
28
+ isDomLoaded = false,
29
+ isExpressInstallActive = false,
30
+ dynamicStylesheet,
31
+ dynamicStylesheetMedia,
32
+ autoHideShow = true,
33
+
34
+ ua = function() {
35
+ var w3cdom = typeof doc.getElementById != UNDEF && typeof doc.getElementsByTagName != UNDEF && typeof doc.createElement != UNDEF,
36
+ u = nav.userAgent.toLowerCase(),
37
+ p = nav.platform.toLowerCase(),
38
+ windows = p ? /win/.test(p) : /win/.test(u),
39
+ mac = p ? /mac/.test(p) : /mac/.test(u),
40
+ webkit = /webkit/.test(u) ? parseFloat(u.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : false,
41
+ ie = !+"\v1",
42
+ playerVersion = [0,0,0],
43
+ d = null;
44
+ if (typeof nav.plugins != UNDEF && typeof nav.plugins[SHOCKWAVE_FLASH] == OBJECT) {
45
+ d = nav.plugins[SHOCKWAVE_FLASH].description;
46
+ if (d && !(typeof nav.mimeTypes != UNDEF && nav.mimeTypes[FLASH_MIME_TYPE] && !nav.mimeTypes[FLASH_MIME_TYPE].enabledPlugin)) {
47
+ plugin = true;
48
+ ie = false;
49
+ d = d.replace(/^.*\s+(\S+\s+\S+$)/, "$1");
50
+ playerVersion[0] = parseInt(d.replace(/^(.*)\..*$/, "$1"), 10);
51
+ playerVersion[1] = parseInt(d.replace(/^.*\.(.*)\s.*$/, "$1"), 10);
52
+ playerVersion[2] = /[a-zA-Z]/.test(d) ? parseInt(d.replace(/^.*[a-zA-Z]+(.*)$/, "$1"), 10) : 0;
53
+ }
54
+ }
55
+ else if (typeof win.ActiveXObject != UNDEF) {
56
+ try {
57
+ var a = new ActiveXObject(SHOCKWAVE_FLASH_AX);
58
+ if (a) {
59
+ d = a.GetVariable("$version");
60
+ if (d) {
61
+ ie = true;
62
+ d = d.split(" ")[1].split(",");
63
+ playerVersion = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
64
+ }
65
+ }
66
+ }
67
+ catch(e) {}
68
+ }
69
+ return { w3:w3cdom, pv:playerVersion, wk:webkit, ie:ie, win:windows, mac:mac };
70
+ }(),
71
+
72
+ onDomLoad = function() {
73
+ if (!ua.w3) { return; }
74
+ if ((typeof doc.readyState != UNDEF && doc.readyState == "complete") || (typeof doc.readyState == UNDEF && (doc.getElementsByTagName("body")[0] || doc.body))) {
75
+ callDomLoadFunctions();
76
+ }
77
+ if (!isDomLoaded) {
78
+ if (typeof doc.addEventListener != UNDEF) {
79
+ doc.addEventListener("DOMContentLoaded", callDomLoadFunctions, false);
80
+ }
81
+ if (ua.ie && ua.win) {
82
+ doc.attachEvent(ON_READY_STATE_CHANGE, function() {
83
+ if (doc.readyState == "complete") {
84
+ doc.detachEvent(ON_READY_STATE_CHANGE, arguments.callee);
85
+ callDomLoadFunctions();
86
+ }
87
+ });
88
+ if (win == top) {
89
+ (function(){
90
+ if (isDomLoaded) { return; }
91
+ try {
92
+ doc.documentElement.doScroll("left");
93
+ }
94
+ catch(e) {
95
+ setTimeout(arguments.callee, 0);
96
+ return;
97
+ }
98
+ callDomLoadFunctions();
99
+ })();
100
+ }
101
+ }
102
+ if (ua.wk) {
103
+ (function(){
104
+ if (isDomLoaded) { return; }
105
+ if (!/loaded|complete/.test(doc.readyState)) {
106
+ setTimeout(arguments.callee, 0);
107
+ return;
108
+ }
109
+ callDomLoadFunctions();
110
+ })();
111
+ }
112
+ addLoadEvent(callDomLoadFunctions);
113
+ }
114
+ }();
115
+
116
+ function callDomLoadFunctions() {
117
+ if (isDomLoaded) { return; }
118
+ try {
119
+ var t = doc.getElementsByTagName("body")[0].appendChild(createElement("span"));
120
+ t.parentNode.removeChild(t);
121
+ }
122
+ catch (e) { return; }
123
+ isDomLoaded = true;
124
+ var dl = domLoadFnArr.length;
125
+ for (var i = 0; i < dl; i++) {
126
+ domLoadFnArr[i]();
127
+ }
128
+ }
129
+
130
+ function addDomLoadEvent(fn) {
131
+ if (isDomLoaded) {
132
+ fn();
133
+ }
134
+ else {
135
+ domLoadFnArr[domLoadFnArr.length] = fn;
136
+ }
137
+ }
138
+
139
+ function addLoadEvent(fn) {
140
+ if (typeof win.addEventListener != UNDEF) {
141
+ win.addEventListener("load", fn, false);
142
+ }
143
+ else if (typeof doc.addEventListener != UNDEF) {
144
+ doc.addEventListener("load", fn, false);
145
+ }
146
+ else if (typeof win.attachEvent != UNDEF) {
147
+ addListener(win, "onload", fn);
148
+ }
149
+ else if (typeof win.onload == "function") {
150
+ var fnOld = win.onload;
151
+ win.onload = function() {
152
+ fnOld();
153
+ fn();
154
+ };
155
+ }
156
+ else {
157
+ win.onload = fn;
158
+ }
159
+ }
160
+
161
+ function main() {
162
+ if (plugin) {
163
+ testPlayerVersion();
164
+ }
165
+ else {
166
+ matchVersions();
167
+ }
168
+ }
169
+
170
+ function testPlayerVersion() {
171
+ var b = doc.getElementsByTagName("body")[0];
172
+ var o = createElement(OBJECT);
173
+ o.setAttribute("type", FLASH_MIME_TYPE);
174
+ var t = b.appendChild(o);
175
+ if (t) {
176
+ var counter = 0;
177
+ (function(){
178
+ if (typeof t.GetVariable != UNDEF) {
179
+ var d = t.GetVariable("$version");
180
+ if (d) {
181
+ d = d.split(" ")[1].split(",");
182
+ ua.pv = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
183
+ }
184
+ }
185
+ else if (counter < 10) {
186
+ counter++;
187
+ setTimeout(arguments.callee, 10);
188
+ return;
189
+ }
190
+ b.removeChild(o);
191
+ t = null;
192
+ matchVersions();
193
+ })();
194
+ }
195
+ else {
196
+ matchVersions();
197
+ }
198
+ }
199
+
200
+ function matchVersions() {
201
+ var rl = regObjArr.length;
202
+ if (rl > 0) {
203
+ for (var i = 0; i < rl; i++) {
204
+ var id = regObjArr[i].id;
205
+ var cb = regObjArr[i].callbackFn;
206
+ var cbObj = {success:false, id:id};
207
+ if (ua.pv[0] > 0) {
208
+ var obj = getElementById(id);
209
+ if (obj) {
210
+ if (hasPlayerVersion(regObjArr[i].swfVersion) && !(ua.wk && ua.wk < 312)) {
211
+ setVisibility(id, true);
212
+ if (cb) {
213
+ cbObj.success = true;
214
+ cbObj.ref = getObjectById(id);
215
+ cb(cbObj);
216
+ }
217
+ }
218
+ else if (regObjArr[i].expressInstall && canExpressInstall()) {
219
+ var att = {};
220
+ att.data = regObjArr[i].expressInstall;
221
+ att.width = obj.getAttribute("width") || "0";
222
+ att.height = obj.getAttribute("height") || "0";
223
+ if (obj.getAttribute("class")) { att.styleclass = obj.getAttribute("class"); }
224
+ if (obj.getAttribute("align")) { att.align = obj.getAttribute("align"); }
225
+ var par = {};
226
+ var p = obj.getElementsByTagName("param");
227
+ var pl = p.length;
228
+ for (var j = 0; j < pl; j++) {
229
+ if (p[j].getAttribute("name").toLowerCase() != "movie") {
230
+ par[p[j].getAttribute("name")] = p[j].getAttribute("value");
231
+ }
232
+ }
233
+ showExpressInstall(att, par, id, cb);
234
+ }
235
+ else {
236
+ displayAltContent(obj);
237
+ if (cb) { cb(cbObj); }
238
+ }
239
+ }
240
+ }
241
+ else {
242
+ setVisibility(id, true);
243
+ if (cb) {
244
+ var o = getObjectById(id);
245
+ if (o && typeof o.SetVariable != UNDEF) {
246
+ cbObj.success = true;
247
+ cbObj.ref = o;
248
+ }
249
+ cb(cbObj);
250
+ }
251
+ }
252
+ }
253
+ }
254
+ }
255
+
256
+ function getObjectById(objectIdStr) {
257
+ var r = null;
258
+ var o = getElementById(objectIdStr);
259
+ if (o && o.nodeName == "OBJECT") {
260
+ if (typeof o.SetVariable != UNDEF) {
261
+ r = o;
262
+ }
263
+ else {
264
+ var n = o.getElementsByTagName(OBJECT)[0];
265
+ if (n) {
266
+ r = n;
267
+ }
268
+ }
269
+ }
270
+ return r;
271
+ }
272
+
273
+ function canExpressInstall() {
274
+ return !isExpressInstallActive && hasPlayerVersion("6.0.65") && (ua.win || ua.mac) && !(ua.wk && ua.wk < 312);
275
+ }
276
+
277
+ function showExpressInstall(att, par, replaceElemIdStr, callbackFn) {
278
+ isExpressInstallActive = true;
279
+ storedCallbackFn = callbackFn || null;
280
+ storedCallbackObj = {success:false, id:replaceElemIdStr};
281
+ var obj = getElementById(replaceElemIdStr);
282
+ if (obj) {
283
+ if (obj.nodeName == "OBJECT") {
284
+ storedAltContent = abstractAltContent(obj);
285
+ storedAltContentId = null;
286
+ }
287
+ else {
288
+ storedAltContent = obj;
289
+ storedAltContentId = replaceElemIdStr;
290
+ }
291
+ att.id = EXPRESS_INSTALL_ID;
292
+ if (typeof att.width == UNDEF || (!/%$/.test(att.width) && parseInt(att.width, 10) < 310)) { att.width = "310"; }
293
+ if (typeof att.height == UNDEF || (!/%$/.test(att.height) && parseInt(att.height, 10) < 137)) { att.height = "137"; }
294
+ doc.title = doc.title.slice(0, 47) + " - Flash Player Installation";
295
+ var pt = ua.ie && ua.win ? "ActiveX" : "PlugIn",
296
+ fv = "MMredirectURL=" + win.location.toString().replace(/&/g,"%26") + "&MMplayerType=" + pt + "&MMdoctitle=" + doc.title;
297
+ if (typeof par.flashvars != UNDEF) {
298
+ par.flashvars += "&" + fv;
299
+ }
300
+ else {
301
+ par.flashvars = fv;
302
+ }
303
+ if (ua.ie && ua.win && obj.readyState != 4) {
304
+ var newObj = createElement("div");
305
+ replaceElemIdStr += "SWFObjectNew";
306
+ newObj.setAttribute("id", replaceElemIdStr);
307
+ obj.parentNode.insertBefore(newObj, obj);
308
+ obj.style.display = "none";
309
+ (function(){
310
+ if (obj.readyState == 4) {
311
+ obj.parentNode.removeChild(obj);
312
+ }
313
+ else {
314
+ setTimeout(arguments.callee, 10);
315
+ }
316
+ })();
317
+ }
318
+ createSWF(att, par, replaceElemIdStr);
319
+ }
320
+ }
321
+
322
+ function displayAltContent(obj) {
323
+ if (ua.ie && ua.win && obj.readyState != 4) {
324
+ var el = createElement("div");
325
+ obj.parentNode.insertBefore(el, obj);
326
+ el.parentNode.replaceChild(abstractAltContent(obj), el);
327
+ obj.style.display = "none";
328
+ (function(){
329
+ if (obj.readyState == 4) {
330
+ obj.parentNode.removeChild(obj);
331
+ }
332
+ else {
333
+ setTimeout(arguments.callee, 10);
334
+ }
335
+ })();
336
+ }
337
+ else {
338
+ obj.parentNode.replaceChild(abstractAltContent(obj), obj);
339
+ }
340
+ }
341
+
342
+ function abstractAltContent(obj) {
343
+ var ac = createElement("div");
344
+ if (ua.win && ua.ie) {
345
+ ac.innerHTML = obj.innerHTML;
346
+ }
347
+ else {
348
+ var nestedObj = obj.getElementsByTagName(OBJECT)[0];
349
+ if (nestedObj) {
350
+ var c = nestedObj.childNodes;
351
+ if (c) {
352
+ var cl = c.length;
353
+ for (var i = 0; i < cl; i++) {
354
+ if (!(c[i].nodeType == 1 && c[i].nodeName == "PARAM") && !(c[i].nodeType == 8)) {
355
+ ac.appendChild(c[i].cloneNode(true));
356
+ }
357
+ }
358
+ }
359
+ }
360
+ }
361
+ return ac;
362
+ }
363
+
364
+ function createSWF(attObj, parObj, id) {
365
+ var r, el = getElementById(id);
366
+ if (ua.wk && ua.wk < 312) { return r; }
367
+ if (el) {
368
+ if (typeof attObj.id == UNDEF) {
369
+ attObj.id = id;
370
+ }
371
+ if (ua.ie && ua.win) {
372
+ var att = "";
373
+ for (var i in attObj) {
374
+ if (attObj[i] != Object.prototype[i]) {
375
+ if (i.toLowerCase() == "data") {
376
+ parObj.movie = attObj[i];
377
+ }
378
+ else if (i.toLowerCase() == "styleclass") {
379
+ att += ' class="' + attObj[i] + '"';
380
+ }
381
+ else if (i.toLowerCase() != "classid") {
382
+ att += ' ' + i + '="' + attObj[i] + '"';
383
+ }
384
+ }
385
+ }
386
+ var par = "";
387
+ for (var j in parObj) {
388
+ if (parObj[j] != Object.prototype[j]) {
389
+ par += '<param name="' + j + '" value="' + parObj[j] + '" />';
390
+ }
391
+ }
392
+ el.outerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"' + att + '>' + par + '</object>';
393
+ objIdArr[objIdArr.length] = attObj.id;
394
+ r = getElementById(attObj.id);
395
+ }
396
+ else {
397
+ var o = createElement(OBJECT);
398
+ o.setAttribute("type", FLASH_MIME_TYPE);
399
+ for (var m in attObj) {
400
+ if (attObj[m] != Object.prototype[m]) {
401
+ if (m.toLowerCase() == "styleclass") {
402
+ o.setAttribute("class", attObj[m]);
403
+ }
404
+ else if (m.toLowerCase() != "classid") {
405
+ o.setAttribute(m, attObj[m]);
406
+ }
407
+ }
408
+ }
409
+ for (var n in parObj) {
410
+ if (parObj[n] != Object.prototype[n] && n.toLowerCase() != "movie") {
411
+ createObjParam(o, n, parObj[n]);
412
+ }
413
+ }
414
+ el.parentNode.replaceChild(o, el);
415
+ r = o;
416
+ }
417
+ }
418
+ return r;
419
+ }
420
+
421
+ function createObjParam(el, pName, pValue) {
422
+ var p = createElement("param");
423
+ p.setAttribute("name", pName);
424
+ p.setAttribute("value", pValue);
425
+ el.appendChild(p);
426
+ }
427
+
428
+ function removeSWF(id) {
429
+ var obj = getElementById(id);
430
+ if (obj && obj.nodeName == "OBJECT") {
431
+ if (ua.ie && ua.win) {
432
+ obj.style.display = "none";
433
+ (function(){
434
+ if (obj.readyState == 4) {
435
+ removeObjectInIE(id);
436
+ }
437
+ else {
438
+ setTimeout(arguments.callee, 10);
439
+ }
440
+ })();
441
+ }
442
+ else {
443
+ obj.parentNode.removeChild(obj);
444
+ }
445
+ }
446
+ }
447
+
448
+ function removeObjectInIE(id) {
449
+ var obj = getElementById(id);
450
+ if (obj) {
451
+ for (var i in obj) {
452
+ if (typeof obj[i] == "function") {
453
+ obj[i] = null;
454
+ }
455
+ }
456
+ obj.parentNode.removeChild(obj);
457
+ }
458
+ }
459
+
460
+ function getElementById(id) {
461
+ var el = null;
462
+ try {
463
+ el = doc.getElementById(id);
464
+ }
465
+ catch (e) {}
466
+ return el;
467
+ }
468
+
469
+ function createElement(el) {
470
+ return doc.createElement(el);
471
+ }
472
+
473
+ function addListener(target, eventType, fn) {
474
+ target.attachEvent(eventType, fn);
475
+ listenersArr[listenersArr.length] = [target, eventType, fn];
476
+ }
477
+
478
+ function hasPlayerVersion(rv) {
479
+ var pv = ua.pv, v = rv.split(".");
480
+ v[0] = parseInt(v[0], 10);
481
+ v[1] = parseInt(v[1], 10) || 0;
482
+ v[2] = parseInt(v[2], 10) || 0;
483
+ return (pv[0] > v[0] || (pv[0] == v[0] && pv[1] > v[1]) || (pv[0] == v[0] && pv[1] == v[1] && pv[2] >= v[2])) ? true : false;
484
+ }
485
+
486
+ function createCSS(sel, decl, media, newStyle) {
487
+ if (ua.ie && ua.mac) { return; }
488
+ var h = doc.getElementsByTagName("head")[0];
489
+ if (!h) { return; }
490
+ var m = (media && typeof media == "string") ? media : "screen";
491
+ if (newStyle) {
492
+ dynamicStylesheet = null;
493
+ dynamicStylesheetMedia = null;
494
+ }
495
+ if (!dynamicStylesheet || dynamicStylesheetMedia != m) {
496
+ var s = createElement("style");
497
+ s.setAttribute("type", "text/css");
498
+ s.setAttribute("media", m);
499
+ dynamicStylesheet = h.appendChild(s);
500
+ if (ua.ie && ua.win && typeof doc.styleSheets != UNDEF && doc.styleSheets.length > 0) {
501
+ dynamicStylesheet = doc.styleSheets[doc.styleSheets.length - 1];
502
+ }
503
+ dynamicStylesheetMedia = m;
504
+ }
505
+ if (ua.ie && ua.win) {
506
+ if (dynamicStylesheet && typeof dynamicStylesheet.addRule == OBJECT) {
507
+ dynamicStylesheet.addRule(sel, decl);
508
+ }
509
+ }
510
+ else {
511
+ if (dynamicStylesheet && typeof doc.createTextNode != UNDEF) {
512
+ dynamicStylesheet.appendChild(doc.createTextNode(sel + " {" + decl + "}"));
513
+ }
514
+ }
515
+ }
516
+
517
+ function setVisibility(id, isVisible) {
518
+ if (!autoHideShow) { return; }
519
+ var v = isVisible ? "visible" : "hidden";
520
+ if (isDomLoaded && getElementById(id)) {
521
+ getElementById(id).style.visibility = v;
522
+ }
523
+ else {
524
+ createCSS("#" + id, "visibility:" + v);
525
+ }
526
+ }
527
+
528
+ function urlEncodeIfNecessary(s) {
529
+ var regex = /[\\\"<>\.;]/;
530
+ var hasBadChars = regex.exec(s) != null;
531
+ return hasBadChars && typeof encodeURIComponent != UNDEF ? encodeURIComponent(s) : s;
532
+ }
533
+
534
+ var cleanup = function() {
535
+ if (ua.ie && ua.win) {
536
+ window.attachEvent("onunload", function() {
537
+ var ll = listenersArr.length;
538
+ for (var i = 0; i < ll; i++) {
539
+ listenersArr[i][0].detachEvent(listenersArr[i][1], listenersArr[i][2]);
540
+ }
541
+ var il = objIdArr.length;
542
+ for (var j = 0; j < il; j++) {
543
+ removeSWF(objIdArr[j]);
544
+ }
545
+ for (var k in ua) {
546
+ ua[k] = null;
547
+ }
548
+ ua = null;
549
+ for (var l in swfobject) {
550
+ swfobject[l] = null;
551
+ }
552
+ swfobject = null;
553
+ });
554
+ }
555
+ }();
556
+
557
+ return {
558
+ registerObject: function(objectIdStr, swfVersionStr, xiSwfUrlStr, callbackFn) {
559
+ if (ua.w3 && objectIdStr && swfVersionStr) {
560
+ var regObj = {};
561
+ regObj.id = objectIdStr;
562
+ regObj.swfVersion = swfVersionStr;
563
+ regObj.expressInstall = xiSwfUrlStr;
564
+ regObj.callbackFn = callbackFn;
565
+ regObjArr[regObjArr.length] = regObj;
566
+ setVisibility(objectIdStr, false);
567
+ }
568
+ else if (callbackFn) {
569
+ callbackFn({success:false, id:objectIdStr});
570
+ }
571
+ },
572
+
573
+ getObjectById: function(objectIdStr) {
574
+ if (ua.w3) {
575
+ return getObjectById(objectIdStr);
576
+ }
577
+ },
578
+
579
+ embedSWF: function(swfUrlStr, replaceElemIdStr, widthStr, heightStr, swfVersionStr, xiSwfUrlStr, flashvarsObj, parObj, attObj, callbackFn) {
580
+ var callbackObj = {success:false, id:replaceElemIdStr};
581
+ if (ua.w3 && !(ua.wk && ua.wk < 312) && swfUrlStr && replaceElemIdStr && widthStr && heightStr && swfVersionStr) {
582
+ setVisibility(replaceElemIdStr, false);
583
+ addDomLoadEvent(function() {
584
+ widthStr += "";
585
+ heightStr += "";
586
+ var att = {};
587
+ if (attObj && typeof attObj === OBJECT) {
588
+ for (var i in attObj) {
589
+ att[i] = attObj[i];
590
+ }
591
+ }
592
+ att.data = swfUrlStr;
593
+ att.width = widthStr;
594
+ att.height = heightStr;
595
+ var par = {};
596
+ if (parObj && typeof parObj === OBJECT) {
597
+ for (var j in parObj) {
598
+ par[j] = parObj[j];
599
+ }
600
+ }
601
+ if (flashvarsObj && typeof flashvarsObj === OBJECT) {
602
+ for (var k in flashvarsObj) {
603
+ if (typeof par.flashvars != UNDEF) {
604
+ par.flashvars += "&" + k + "=" + flashvarsObj[k];
605
+ }
606
+ else {
607
+ par.flashvars = k + "=" + flashvarsObj[k];
608
+ }
609
+ }
610
+ }
611
+ if (hasPlayerVersion(swfVersionStr)) {
612
+ var obj = createSWF(att, par, replaceElemIdStr);
613
+ if (att.id == replaceElemIdStr) {
614
+ setVisibility(replaceElemIdStr, true);
615
+ }
616
+ callbackObj.success = true;
617
+ callbackObj.ref = obj;
618
+ }
619
+ else if (xiSwfUrlStr && canExpressInstall()) {
620
+ att.data = xiSwfUrlStr;
621
+ showExpressInstall(att, par, replaceElemIdStr, callbackFn);
622
+ return;
623
+ }
624
+ else {
625
+ setVisibility(replaceElemIdStr, true);
626
+ }
627
+ if (callbackFn) { callbackFn(callbackObj); }
628
+ });
629
+ }
630
+ else if (callbackFn) { callbackFn(callbackObj); }
631
+ },
632
+
633
+ switchOffAutoHideShow: function() {
634
+ autoHideShow = false;
635
+ },
636
+
637
+ ua: ua,
638
+
639
+ getFlashPlayerVersion: function() {
640
+ return { major:ua.pv[0], minor:ua.pv[1], release:ua.pv[2] };
641
+ },
642
+
643
+ hasFlashPlayerVersion: hasPlayerVersion,
644
+
645
+ createSWF: function(attObj, parObj, replaceElemIdStr) {
646
+ if (ua.w3) {
647
+ return createSWF(attObj, parObj, replaceElemIdStr);
648
+ }
649
+ else {
650
+ return undefined;
651
+ }
652
+ },
653
+
654
+ showExpressInstall: function(att, par, replaceElemIdStr, callbackFn) {
655
+ if (ua.w3 && canExpressInstall()) {
656
+ showExpressInstall(att, par, replaceElemIdStr, callbackFn);
657
+ }
658
+ },
659
+
660
+ removeSWF: function(objElemIdStr) {
661
+ if (ua.w3) {
662
+ removeSWF(objElemIdStr);
663
+ }
664
+ },
665
+
666
+ createCSS: function(selStr, declStr, mediaStr, newStyleBoolean) {
667
+ if (ua.w3) {
668
+ createCSS(selStr, declStr, mediaStr, newStyleBoolean);
669
+ }
670
+ },
671
+
672
+ addDomLoadEvent: addDomLoadEvent,
673
+
674
+ addLoadEvent: addLoadEvent,
675
+
676
+ getQueryParamValue: function(param) {
677
+ var q = doc.location.search || doc.location.hash;
678
+ if (q) {
679
+ if (/\?/.test(q)) { q = q.split("?")[1]; }
680
+ if (param == null) {
681
+ return urlEncodeIfNecessary(q);
682
+ }
683
+ var pairs = q.split("&");
684
+ for (var i = 0; i < pairs.length; i++) {
685
+ if (pairs[i].substring(0, pairs[i].indexOf("=")) == param) {
686
+ return urlEncodeIfNecessary(pairs[i].substring((pairs[i].indexOf("=") + 1)));
687
+ }
688
+ }
689
+ }
690
+ return "";
691
+ },
692
+
693
+ expressInstallCallback: function() {
694
+ if (isExpressInstallActive) {
695
+ var obj = getElementById(EXPRESS_INSTALL_ID);
696
+ if (obj && storedAltContent) {
697
+ obj.parentNode.replaceChild(storedAltContent, obj);
698
+ if (storedAltContentId) {
699
+ setVisibility(storedAltContentId, true);
700
+ if (ua.ie && ua.win) { storedAltContent.style.display = "block"; }
701
+ }
702
+ if (storedCallbackFn) { storedCallbackFn(storedCallbackObj); }
703
+ }
704
+ isExpressInstallActive = false;
705
+ }
706
+ }
707
+ };
708
+ }();