')
104 | .parent()
105 | .css({
106 | position:'fixed',
107 | // top:'0px',
108 | width:'1px',
109 | height:'1px',
110 | display:'inline-block',
111 | background:'transparent',
112 | 'z-index':99999
113 | })
114 | // Hands over mouse events to original input for css styles
115 | .on('mouseover mouseout mousedown mouseup', function(evt) {
116 | if(currentTarget) $('#' + currentTarget).trigger(evt.type);
117 | })
118 | .appendTo('body');
119 |
120 | swfobject.embedSWF(o.filereader, o.id, '100%', '100%', '10', o.expressInstall, {debugMode: o.debugMode ? true : ''}, {'wmode':'transparent','allowScriptAccess':'sameDomain'}, {}, function(e) {
121 | self.swfObject = e.ref;
122 | $(self.swfObject)
123 | .css({
124 | display: 'block',
125 | outline: 0
126 | })
127 | .attr('tabindex', 0);
128 | if (self.ready) {
129 | readyCallbacks.fire();
130 | }
131 | self.ready = e.success && typeof e.ref.add === "function";
132 | });
133 | },
134 | swfObject: null,
135 | container: null,
136 | // Inputs Registry
137 | inputs: {},
138 | // Readers Registry
139 | readers: {},
140 | // Receives FileInput events
141 | onFileInputEvent: function(evt) {
142 | if (this.debugMode) console.info('FileInput Event ', evt.type, evt);
143 | if (evt.target in this.inputs) {
144 | var el = this.inputs[evt.target];
145 | evt.target = el[0];
146 | if( evt.type === 'change') {
147 | evt.files = new FileList(evt.files);
148 | evt.target = {files: evt.files};
149 | }
150 | el.trigger(evt);
151 | }
152 | window.focus();
153 | },
154 | // Receives FileReader ProgressEvents
155 | onFileReaderEvent: function(evt) {
156 | if (this.debugMode) console.info('FileReader Event ', evt.type, evt, evt.target in this.readers);
157 | if (evt.target in this.readers) {
158 | var reader = this.readers[evt.target];
159 | evt.target = reader;
160 | reader._handleFlashEvent.call(reader, evt);
161 | }
162 | },
163 | // Receives flash FileReader Error Events
164 | onFileReaderError: function(error) {
165 | if (this.debugMode) console.log(error);
166 | },
167 | onSWFReady: function() {
168 | this.container.css({position: 'absolute'});
169 | this.ready = typeof this.swfObject.add === "function";
170 | if (this.ready) {
171 | readyCallbacks.fire();
172 | }
173 |
174 | return true;
175 | }
176 | };
177 |
178 |
179 | /**
180 | * Add FileReader to the window object
181 | */
182 | window.FileReader = function () {
183 | // states
184 | this.EMPTY = 0;
185 | this.LOADING = 1;
186 | this.DONE = 2;
187 |
188 | this.readyState = 0;
189 |
190 | // File or Blob data
191 | this.result = null;
192 |
193 | this.error = null;
194 |
195 | // event handler attributes
196 | this.onloadstart = null;
197 | this.onprogress = null;
198 | this.onload = null;
199 | this.onabort = null;
200 | this.onerror = null;
201 | this.onloadend = null;
202 |
203 | // Event Listeners handling using JQuery Callbacks
204 | this._callbacks = {
205 | loadstart : $.Callbacks( "unique" ),
206 | progress : $.Callbacks( "unique" ),
207 | abort : $.Callbacks( "unique" ),
208 | error : $.Callbacks( "unique" ),
209 | load : $.Callbacks( "unique" ),
210 | loadend : $.Callbacks( "unique" )
211 | };
212 |
213 | // Custom properties
214 | this._id = null;
215 | };
216 |
217 | window.FileReader.prototype = {
218 | // async read methods
219 | readAsBinaryString: function (file) {
220 | this._start(file);
221 | FileAPIProxy.swfObject.read(file.input, file.name, 'readAsBinaryString');
222 | },
223 | readAsText: function (file, encoding) {
224 | this._start(file);
225 | FileAPIProxy.swfObject.read(file.input, file.name, 'readAsText');
226 | },
227 | readAsDataURL: function (file) {
228 | this._start(file);
229 | FileAPIProxy.swfObject.read(file.input, file.name, 'readAsDataURL');
230 | },
231 | readAsArrayBuffer: function(file){
232 | throw("Whoops FileReader.readAsArrayBuffer is unimplemented");
233 | },
234 |
235 | abort: function () {
236 | this.result = null;
237 | if (this.readyState === this.EMPTY || this.readyState === this.DONE) return;
238 | FileAPIProxy.swfObject.abort(this._id);
239 | },
240 |
241 | // Event Target interface
242 | addEventListener: function (type, listener) {
243 | if (type in this._callbacks) this._callbacks[type].add(listener);
244 | },
245 | removeEventListener: function (type, listener) {
246 | if (type in this._callbacks) this._callbacks[type].remove(listener);
247 | },
248 | dispatchEvent: function (event) {
249 | event.target = this;
250 | if (event.type in this._callbacks) {
251 | var fn = this['on' + event.type];
252 | if ($.isFunction(fn)) fn(event);
253 | this._callbacks[event.type].fire(event);
254 | }
255 | return true;
256 | },
257 |
258 | // Custom private methods
259 |
260 | // Registers FileReader instance for flash callbacks
261 | _register: function(file) {
262 | this._id = file.input + '.' + file.name;
263 | FileAPIProxy.readers[this._id] = this;
264 | },
265 | _start: function(file) {
266 | this._register(file);
267 | if (this.readyState === this.LOADING) throw {type: 'InvalidStateError', code: 11, message: 'The object is in an invalid state.'};
268 | },
269 | _handleFlashEvent: function(evt) {
270 | switch (evt.type) {
271 | case 'loadstart':
272 | this.readyState = this.LOADING;
273 | break;
274 | case 'loadend':
275 | this.readyState = this.DONE;
276 | break;
277 | case 'load':
278 | this.readyState = this.DONE;
279 | this.result = FileAPIProxy.swfObject.result(this._id);
280 | break;
281 | case 'error':
282 | this.result = null;
283 | this.error = {
284 | name: 'NotReadableError',
285 | message: 'The File cannot be read!'
286 | };
287 | }
288 | this.dispatchEvent(new FileReaderEvent(evt));
289 | }
290 | };
291 |
292 | /**
293 | * FileReader ProgressEvent implenting Event interface
294 | */
295 | FileReaderEvent = function (e) {
296 | this.initEvent(e);
297 | };
298 |
299 | FileReaderEvent.prototype = {
300 | initEvent: function (event) {
301 | $.extend(this, {
302 | type: null,
303 | target: null,
304 | currentTarget: null,
305 |
306 | eventPhase: 2,
307 |
308 | bubbles: false,
309 | cancelable: false,
310 |
311 | defaultPrevented: false,
312 |
313 | isTrusted: false,
314 | timeStamp: new Date().getTime()
315 | }, event);
316 | },
317 | stopPropagation: function (){
318 | },
319 | stopImmediatePropagation: function (){
320 | },
321 | preventDefault: function (){
322 | }
323 | };
324 |
325 | /**
326 | * FileList interface (Object with item function)
327 | */
328 | FileList = function(array) {
329 | if (array) {
330 | for (var i = 0; i < array.length; i++) {
331 | this[i] = array[i];
332 | }
333 | this.length = array.length;
334 | } else {
335 | this.length = 0;
336 | }
337 | };
338 |
339 | FileList.prototype = {
340 | item: function(index) {
341 | if (index in this) return this[index];
342 | return null;
343 | }
344 | };
345 |
346 | })( jQuery );
347 |
--------------------------------------------------------------------------------
/vendor/jquery.FileReader.position.ver.js:
--------------------------------------------------------------------------------
1 | (function( $ ){
2 | var readyCallbacks = $.Callbacks('once unique memory'),
3 | inputsCount = 0,
4 | currentTarget = null;
5 |
6 | // if native FileReader support, then dont add the polyfill and make the plugin do nothing
7 | if (window.FileReader) {
8 | $.fn.fileReader = function() { return this; };
9 | return ;
10 | }
11 |
12 | /**
13 | * JQuery Plugin
14 | */
15 | $.fn.fileReader = function( options ) {
16 | options = $.extend({}, $.fn.fileReader.defaults, options);
17 |
18 | var self = this;
19 | readyCallbacks.add(function() {
20 | return main(self, options);
21 | });
22 | if ($.isFunction(options.callback)) readyCallbacks.add(options.callback);
23 |
24 | if (!FileAPIProxy.ready && !FileAPIProxy.hasInitialized) {
25 | FileAPIProxy.init(options);
26 | }
27 | return this;
28 | };
29 |
30 | /**
31 | * Default options
32 | * allows user set default options
33 | */
34 | $.fn.fileReader.defaults = {
35 | id : 'fileReaderSWFObject', // ID for the created swf object container,
36 | multiple : null,
37 | accept : null,
38 | label : null,
39 | extensions : null,
40 | filereader : 'files/filereader.swf', // The path to the filereader swf file
41 | expressInstall : null, // The path to the express install swf file
42 | debugMode : false,
43 | callback : false, // Callback function when Filereader is ready
44 | position : 'fixed',
45 | appendTo : 'body',
46 | offsetCss : function (trigger) {
47 | return trigger.offset();
48 | }
49 | };
50 |
51 | /**
52 | * Plugin callback
53 | * adds an input to registry
54 | */
55 | var main = function(el, options) {
56 | return el.each(function(i, input) {
57 | var trigger = $(options.trigger || input);
58 | input = $(input);
59 | var id = input.attr('id');
60 | if (!id) {
61 | id = 'flashFileInput' + inputsCount;
62 | input.attr('id', id);
63 | inputsCount++;
64 | }
65 | options.multiple = !!(options.multiple === null ? input.attr('multiple') : options.multiple);
66 | options.accept = options.accept === null ? input.attr('accept') : options.accept;
67 |
68 | FileAPIProxy.inputs[id] = input;
69 | FileAPIProxy.swfObject.add(id, options.multiple, options.accept, options.label, options.extensions);
70 |
71 | trigger.add(input)
72 | .css('z-index', 0)
73 | .mouseover(function (e) {
74 | if (id !== currentTarget) {
75 | e = e || window.event;
76 | currentTarget = id;
77 | FileAPIProxy.swfObject.mouseover(id);
78 | }
79 |
80 | FileAPIProxy.container
81 | .height(trigger.outerHeight())
82 | .width(trigger.outerWidth())
83 | .css(options.offsetCss(trigger));
84 | })
85 | .click(function(e) {
86 | e.preventDefault();
87 | e.stopPropagation();
88 | e.stopImmediatePropagation();
89 | return false;
90 | });
91 | });
92 | };
93 |
94 | /**
95 | * Flash FileReader Proxy
96 | */
97 | window.FileAPIProxy = {
98 | ready: false,
99 | hasInitialized: false,
100 | init: function(o) {
101 | var self = this;
102 | this.hasInitialized = true;
103 | this.debugMode = o.debugMode;
104 | this.container = $('
').attr('id', o.id)
105 | .wrap('
')
106 | .parent()
107 | .css({
108 | position: o.position,
109 | // top:'0px',
110 | width:'1px',
111 | height:'1px',
112 | display:'inline-block',
113 | background:'transparent',
114 | 'z-index':99999
115 | })
116 | // Hands over mouse events to original input for css styles
117 | .on('mouseover mouseout mousedown mouseup', function(evt) {
118 | if(currentTarget) $('#' + currentTarget).trigger(evt.type);
119 | })
120 | .appendTo(o.appendTo);
121 |
122 | function swfLoadEvent(e, fn) {
123 | var initialTimeout = setTimeout(function () {
124 | //Ensure Flash Player's PercentLoaded method is available and returns a value
125 | if (typeof e.ref.PercentLoaded !== 'undefined') {
126 | //Set up a timer to periodically check value of PercentLoaded
127 | var loadCheckInterval = setInterval(function () {
128 | if (self.debugMode) console.info('SWF Load Percentage: ', e.ref.PercentLoaded());
129 | //Once value == 100 (fully loaded) we can do whatever we want
130 | if (e.ref.PercentLoaded() === 100) {
131 | fn();
132 | clearInterval(loadCheckInterval);
133 | }
134 | }, 500);
135 | }
136 | }, 200);
137 | }
138 |
139 | swfobject.embedSWF(o.filereader, o.id, '100%', '100%', '10', o.expressInstall, {debugMode: o.debugMode ? true : ''}, {'wmode':'transparent','allowScriptAccess':'sameDomain'}, {}, function(e) {
140 | self.swfObject = e.ref;
141 | $(self.swfObject)
142 | .css({
143 | display: 'block',
144 | outline: 0
145 | })
146 | .attr('tabindex', 0);
147 |
148 | if (e.success) {
149 | swfLoadEvent(e, function () {
150 | if (self.ready) {
151 | readyCallbacks.fire();
152 | }
153 | self.ready = $.isFunction(e.ref.add);
154 | });
155 | } else {
156 | self.hasInitialized = false;
157 | }
158 | });
159 | },
160 | swfObject: null,
161 | container: null,
162 | // Inputs Registry
163 | inputs: {},
164 | // Readers Registry
165 | readers: {},
166 | // Receives FileInput events
167 | onFileInputEvent: function(evt) {
168 | if (this.debugMode) console.info('FileInput Event ', evt.type, evt);
169 | if (evt.target in this.inputs) {
170 | var el = this.inputs[evt.target];
171 | evt.target = el[0];
172 | if( evt.type === 'change') {
173 | evt.files = new FileList(evt.files);
174 | evt.target = {files: evt.files};
175 | }
176 | el.trigger(evt);
177 | }
178 | window.focus();
179 | },
180 | // Receives FileReader ProgressEvents
181 | onFileReaderEvent: function(evt) {
182 | if (this.debugMode) console.info('FileReader Event ', evt.type, evt, evt.target in this.readers);
183 | if (evt.target in this.readers) {
184 | var reader = this.readers[evt.target];
185 | evt.target = reader;
186 | reader._handleFlashEvent.call(reader, evt);
187 | }
188 | },
189 | // Receives flash FileReader Error Events
190 | onFileReaderError: function(error) {
191 | if (this.debugMode) console.log(error);
192 | },
193 | onSWFReady: function () {
194 | this.container.css({position: 'absolute'});
195 | this.ready = $.isFunction(this.swfObject.add);
196 | if (this.ready) {
197 | readyCallbacks.fire();
198 | }
199 |
200 | return true;
201 | }
202 | };
203 |
204 |
205 | /**
206 | * Add FileReader to the window object
207 | */
208 | window.FileReader = function () {
209 | // states
210 | this.EMPTY = 0;
211 | this.LOADING = 1;
212 | this.DONE = 2;
213 |
214 | this.readyState = 0;
215 |
216 | // File or Blob data
217 | this.result = null;
218 |
219 | this.error = null;
220 |
221 | // event handler attributes
222 | this.onloadstart = null;
223 | this.onprogress = null;
224 | this.onload = null;
225 | this.onabort = null;
226 | this.onerror = null;
227 | this.onloadend = null;
228 |
229 | // Event Listeners handling using JQuery Callbacks
230 | this._callbacks = {
231 | loadstart : $.Callbacks( "unique" ),
232 | progress : $.Callbacks( "unique" ),
233 | abort : $.Callbacks( "unique" ),
234 | error : $.Callbacks( "unique" ),
235 | load : $.Callbacks( "unique" ),
236 | loadend : $.Callbacks( "unique" )
237 | };
238 |
239 | // Custom properties
240 | this._id = null;
241 | };
242 |
243 | window.FileReader.prototype = {
244 | // async read methods
245 | readAsBinaryString: function (file) {
246 | this._start(file);
247 | FileAPIProxy.swfObject.read(file.input, file.name, 'readAsBinaryString');
248 | },
249 | readAsText: function (file, encoding) {
250 | this._start(file);
251 | FileAPIProxy.swfObject.read(file.input, file.name, 'readAsText');
252 | },
253 | readAsDataURL: function (file) {
254 | this._start(file);
255 | FileAPIProxy.swfObject.read(file.input, file.name, 'readAsDataURL');
256 | },
257 | readAsArrayBuffer: function(file){
258 | throw("Whoops FileReader.readAsArrayBuffer is unimplemented");
259 | },
260 |
261 | abort: function () {
262 | this.result = null;
263 | if (this.readyState === this.EMPTY || this.readyState === this.DONE) return;
264 | FileAPIProxy.swfObject.abort(this._id);
265 | },
266 |
267 | // Event Target interface
268 | addEventListener: function (type, listener) {
269 | if (type in this._callbacks) this._callbacks[type].add(listener);
270 | },
271 | removeEventListener: function (type, listener) {
272 | if (type in this._callbacks) this._callbacks[type].remove(listener);
273 | },
274 | dispatchEvent: function (event) {
275 | event.target = this;
276 | if (event.type in this._callbacks) {
277 | var fn = this['on' + event.type];
278 | if ($.isFunction(fn)) fn(event);
279 | this._callbacks[event.type].fire(event);
280 | }
281 | return true;
282 | },
283 |
284 | // Custom private methods
285 |
286 | // Registers FileReader instance for flash callbacks
287 | _register: function(file) {
288 | this._id = file.input + '.' + file.name;
289 | FileAPIProxy.readers[this._id] = this;
290 | },
291 | _start: function(file) {
292 | this._register(file);
293 | if (this.readyState === this.LOADING) throw {type: 'InvalidStateError', code: 11, message: 'The object is in an invalid state.'};
294 | },
295 | _handleFlashEvent: function(evt) {
296 | switch (evt.type) {
297 | case 'loadstart':
298 | this.readyState = this.LOADING;
299 | break;
300 | case 'loadend':
301 | this.readyState = this.DONE;
302 | break;
303 | case 'load':
304 | this.readyState = this.DONE;
305 | this.result = FileAPIProxy.swfObject.result(this._id);
306 | break;
307 | case 'error':
308 | this.result = null;
309 | this.error = {
310 | name: 'NotReadableError',
311 | message: 'The File cannot be read!'
312 | };
313 | }
314 | this.dispatchEvent(new FileReaderEvent(evt));
315 | }
316 | };
317 |
318 | /**
319 | * FileReader ProgressEvent implenting Event interface
320 | */
321 | FileReaderEvent = function (e) {
322 | this.initEvent(e);
323 | };
324 |
325 | FileReaderEvent.prototype = {
326 | initEvent: function (event) {
327 | $.extend(this, {
328 | type: null,
329 | target: null,
330 | currentTarget: null,
331 |
332 | eventPhase: 2,
333 |
334 | bubbles: false,
335 | cancelable: false,
336 |
337 | defaultPrevented: false,
338 |
339 | isTrusted: false,
340 | timeStamp: new Date().getTime()
341 | }, event);
342 | },
343 | stopPropagation: function (){
344 | },
345 | stopImmediatePropagation: function (){
346 | },
347 | preventDefault: function (){
348 | }
349 | };
350 |
351 | /**
352 | * FileList interface (Object with item function)
353 | */
354 | FileList = function(array) {
355 | if (array) {
356 | for (var i = 0; i < array.length; i++) {
357 | this[i] = array[i];
358 | }
359 | this.length = array.length;
360 | } else {
361 | this.length = 0;
362 | }
363 | };
364 |
365 | FileList.prototype = {
366 | item: function(index) {
367 | if (index in this) return this[index];
368 | return null;
369 | }
370 | };
371 |
372 | })( jQuery );
373 |
--------------------------------------------------------------------------------
/vendor/swfobject.js:
--------------------------------------------------------------------------------
1 | /* SWFObject v2.2
2 | is released under the MIT License
3 | */
4 | var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y0){for(var af=0;af0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad'}}aa.outerHTML='";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;ab