raydash 0.5.0 → 2.0.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.
data/Readme CHANGED
@@ -89,7 +89,7 @@ Adds an flash element that plays video and sound
89
89
  - height The height of the videostream
90
90
  - width The width of the videostream
91
91
  - videoOff if "1", it will hide the video, and only stream audio.
92
- === videorecord(token,id,height="640",width="480",hideCamera="0")
92
+ === videorecord(token,id,height="640",width="480",hideCamera="0",videoOff="0")
93
93
  Adds a flash element to record and send to the server video and sound
94
94
 
95
95
  - token The token for the stream. You can generate a new with Raydash.getToken(), or it is done automatically in models generated with "rails g raydash:model".
@@ -1,13 +1,15 @@
1
1
  module RaydashHelper
2
+
2
3
  def raydash_header()
3
- javascript_include_tag 'swfobject.js'
4
+ javascript_include_tag Raydash.getAssetUrl() + '/api/2/swfobject/1'
4
5
  end
6
+
5
7
  # This elements plays video/audio from the server
6
8
  def videostream(token, id,width="640",height="480",videoOff="0")
7
- javascript_tag("swfobject.embedSWF(\"/swfs/raydash/ClientBox.swf\", \"#{id}\",#{width},#{height},\"9.0.0\",\"http://www.adobe.com/products/flashplayer/download\",{autostart:1,token:\"#{token}\",videoOff:\"#{videoOff}\"})") + content_tag(:div, "Video stream not available", :id => id)
9
+ javascript_tag("swfobject.embedSWF(\"" + Raydash.getAssetUrl() + "/api/2/clientbox/1\", \"#{id}\",#{width},#{height},\"9.0.0\",\"http://www.adobe.com/products/flashplayer/download\",{autostart:1,token:\"#{token}\",videoOff:\"#{videoOff}\"});") + content_tag(:div, "Video stream not available", :id => id)
8
10
  end
9
11
  # This element sends video/audio to the server
10
12
  def videorecord(token, id,width="640",height="480",hideCamera="0",videoOff="0")
11
- javascript_tag("function setSize(width,height,id) {if(id==undefined){id=\"#{id}\"; }document.getElementById(id).width=width;document.getElementById(id).height=height;} swfobject.embedSWF(\"/swfs/raydash/RecordBox.swf\", \"#{id}\",#{width},#{height},\"9.0.0\",\"http://www.adobe.com/products/flashplayer/download\",{hideControls:1,hideCamera:\"#{hideCamera}\",autostart:1,token:\"#{token}\",videoOff:\"#{videoOff}\"});") + content_tag(:div, "Video stream not available", :id => id)
13
+ javascript_tag("function setSize(width,height,id) {if(id==undefined){id=\"#{id}\"; }document.getElementById(id).width=width;document.getElementById(id).height=height;}\n" + "\nvar server_version=2;\nvar version=swfobject.getFlashPlayerVersion();if(version.major<10 || version.minor<3) {server_version=1;}" + "else {server_version=2;}\nswfobject.embedSWF(\"" + Raydash.getAssetUrl() + "/api/2/recordbox/\" + server_version , \"#{id}\",#{width},#{height},\"9.0.0\",\"http://www.adobe.com/products/flashplayer/download\",{hideControls:1,hideCamera:\"#{hideCamera}\",autostart:1,token:\"#{token}\",videoOff:\"#{videoOff}\"});" ) + content_tag(:div, "Video stream not available", :id => id)
12
14
  end
13
15
  end
@@ -8,14 +8,6 @@ module Raydash
8
8
  def copy_initializer
9
9
  template "raydash.rb", "config/initializers/raydash.rb"
10
10
  end
11
- def copy_flash
12
- empty_directory "public/swfs/raydash"
13
- copy_file "ClientBox.swf", "public/swfs/raydash/ClientBox.swf"
14
- copy_file "RecordBox.swf", "public/swfs/raydash/RecordBox.swf"
15
- end
16
- def copy_flash_javascript
17
- copy_file "swfobject.js", "public/javascripts/swfobject.js"
18
- end
19
11
  def show_readme
20
12
  readme "README" if behavior == :invoke
21
13
  end
@@ -1,3 +1,3 @@
1
1
  module Raydash
2
- VERSION = "0.5.0"
2
+ VERSION = "2.0.0"
3
3
  end
data/lib/raydash.rb CHANGED
@@ -2,55 +2,117 @@ require 'net/http'
2
2
  require 'app/helpers/raydash_helper'
3
3
  require 'json'
4
4
  module Raydash
5
- RAYDASH_HTTP_SERVER = "api.raydash.com"
5
+ RAYDASH_HTTP_SERVER = "localhost"
6
6
  RAYDASH_HTTP_PORT = 8080
7
+ CLIENTBOX_VERSION = "1"
8
+ RECORDBOX_VERSION = "2"
9
+
7
10
  mattr_accessor :userid
8
11
  mattr_accessor :secret
9
12
  self.userid = ENV['RAYDASH_USERID']
10
13
  self.secret = ENV['RAYDASH_SECRET']
11
14
 
12
-
15
+ def self.getAssetUrl()
16
+ "http://" + RAYDASH_HTTP_SERVER + ":" + RAYDASH_HTTP_PORT.to_s()
17
+ end
13
18
  # Gets a new token for internal or external streams. The same token can be re-used for input and output streams.
14
- def self.getToken(streamName="")
19
+ def self.getToken(streamName="", customGroup="")
15
20
  if streamName!="" then
16
- path="/api/1/authtoken/" + streamName + "?userid=" + self.userid + "&secret=" + self.secret
21
+ result=self.postRequest("/api/2/authtoken",{'userid'=>self.userid,'secret'=>self.secret,'streamName'=>streamName,'customGroup'=>customGroup})
17
22
  else
18
- path="/api/1/authtoken" + "?userid=" + self.userid + "&secret=" + self.secret
23
+ result=self.postRequest("/api/2/authtoken",{'userid'=>self.userid,'secret'=>self.secret,'customGroup'=>customGroup})
19
24
  end
20
- result = self.doRequest(path)
21
- result.value()
22
25
  return result.body
23
26
  end
24
27
  # Changes which input-stream connects to which output-stream token
25
28
  def self.changeStream(output_token,input_token)
26
- path="/api/1/changeStream/" + output_token + "/" + input_token + "?userid=" + self.userid + "&secret=" + self.secret
27
- result = doRequest(path)
28
- result.value()
29
+ result = postRequest("/api/2/authtoken/#{output_token}",{'streamName'=>input_token, 'userid' => self.userid, 'secret' => self.secret, })
29
30
  return result.body
30
31
  end
32
+ def self.changeStreamNext(output_token,params={})
33
+ customGroup=params[:customGroup]
34
+ active=params[:active]
35
+ twoWay=params[:twoWay]
36
+ newCustomGroup=params[:newCustomGroup]
37
+
38
+ path="/api/2/authtoken/#{output_token}/next?userid=#{userid}&secret=#{secret}"
39
+
40
+ if active!=nil then
41
+ path += "&active=#{active}"
42
+ end
43
+ if customGroup!=nil then
44
+ path += "&customGroup=#{customGroup}"
45
+ end
46
+ if twoWay!=nil && (twoWay=="1" || twoWay==true)
47
+ path += "&twoWay=1"
48
+ end
49
+ if newCustomGroup!=nil
50
+ path += "&newCustomGroup=#{customGroup}"
51
+ end
52
+ result = getRequest(path)
53
+ return result.body
54
+ end
55
+
56
+ # Change to a random stream with the specified customGoup
57
+ def self.changeStreamRand(output_token,params={})
58
+ customGroup=params[:customGroup]
59
+ active=params[:active]
60
+ twoWay=params[:twoWay]
61
+ newCustomGroup=params[:newCustomGroup]
62
+
63
+ path="/api/2/authtoken/#{output_token}/randnext?userid=#{userid}&secret=#{secret}"
64
+ if customGroup!=nil then
65
+ path += "&browserSession=#{browserSession}"
66
+ end
67
+ if active!=nil then
68
+ path += "&active=#{active}"
69
+ end
70
+ if twoWay!=nil && (twoWay=="1" || twoWay==true)
71
+ path += "&twoWay=1"
72
+ end
73
+ if newCustomGroup!=nil
74
+ path += "&newCustomGroup=#{customGroup}"
75
+ end
76
+ result = getRequest(path)
77
+ return result.body
78
+ end
79
+
31
80
  # Gets information about the stream
32
81
  def self.getStreamInfo(token)
33
- path="/api/1/streamInfo/" + token + "?userid=" + self.userid + "&secret=" + self.secret
34
- result = doRequest(path)
35
- result.value()
82
+ path="/api/2/authtoken/#{token}" + token + "?userid=" + self.userid + "&secret=" + self.secret
83
+ result = getRequest(path)
36
84
  return JSON.parse(result.body)
37
85
  end
38
86
  # Sets a callback url with three parameters
39
87
  def self.setCallbackUrl(userid, secret, url)
40
- path="/api/1/callbackurl/" + self.userid + "?userid=" + self.userid + "&secret=" + self.secret + "&url=" + CGI::escape(url)
41
- result = doRequest(path)
88
+ path="/api/2/callbackurl/" + "?userid=" + self.userid + "&secret=" + self.secret + "&url=" + CGI::escape(url)
89
+ result = getRequest(path)
42
90
  result.value()
43
91
  return JSON.parse(result.body)
44
92
  end
93
+ def self.startRecord(token)
94
+ path="/api/2/startRecord//#{token}"
95
+ result = self.getRequest(path + "?userid=#{self.userid}&secret=#{self.secret}")
96
+ return result.body
97
+ end
98
+ def self.stopRecord(token,bucket)
99
+ path="/api/2/stopRecord/#{token}"
100
+ result = self.getRequest(path + "?userid=#{self.userid}&secret=#{self.secret}&bucket=#{CGI::escape(bucket)}")
101
+ return result.body
102
+ end
45
103
  # Used for configuration
46
104
  def self.setup
47
105
  yield self
48
106
  end
49
107
 
50
108
  private
51
- def self.doRequest(request)
109
+ def self.getRequest(request)
52
110
  return Net::HTTP.get_response(RAYDASH_HTTP_SERVER, request, RAYDASH_HTTP_PORT)
53
111
  end
112
+ def self.postRequest(path,request)
113
+ return Net::HTTP.post_form(URI.parse("http://" + RAYDASH_HTTP_SERVER + ":" + RAYDASH_HTTP_PORT.to_s() + path), request)
114
+ end
115
+
54
116
 
55
117
  end
56
118
  ActionView::Base.send :include, RaydashHelper
data/raydash.gemspec CHANGED
@@ -8,14 +8,14 @@ Gem::Specification.new do |s|
8
8
  s.platform = Gem::Platform::RUBY
9
9
  s.authors = ["Gershon Bialer"]
10
10
  s.email = ["gershon@raydash.com"]
11
- s.homepage = ""
11
+ s.homepage = "http://www.raydash.com"
12
12
  s.summary = %q{Embed video chat or video streaming via Raydash}
13
13
  s.description = %q{Live video chat or video streams can be hosted on Raydash, and accessed via the API contained within this gem}
14
14
 
15
15
  s.rubyforge_project = "raydash"
16
16
 
17
17
  s.add_dependency('json')
18
-
18
+
19
19
  s.files = `git ls-files`.split("\n")
20
20
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
21
21
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: raydash
3
3
  version: !ruby/object:Gem::Version
4
- hash: 11
4
+ hash: 15
5
5
  prerelease:
6
6
  segments:
7
+ - 2
7
8
  - 0
8
- - 5
9
9
  - 0
10
- version: 0.5.0
10
+ version: 2.0.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Gershon Bialer
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-03-25 00:00:00 -05:00
18
+ date: 2011-05-06 00:00:00 -05:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -50,21 +50,18 @@ files:
50
50
  - lib/app/helpers/raydash_helper.rb
51
51
  - lib/generators/raydash/install_generator.rb
52
52
  - lib/generators/raydash/model_generator.rb
53
- - lib/generators/templates/ClientBox.swf
54
53
  - lib/generators/templates/README
55
- - lib/generators/templates/RecordBox.swf
56
54
  - lib/generators/templates/controller.rb
57
55
  - lib/generators/templates/index.html.erb
58
56
  - lib/generators/templates/migration.rb
59
57
  - lib/generators/templates/model.rb
60
58
  - lib/generators/templates/raydash.rb
61
- - lib/generators/templates/swfobject.js
62
59
  - lib/generators/templates/view.html.erb
63
60
  - lib/raydash.rb
64
61
  - lib/raydash/version.rb
65
62
  - raydash.gemspec
66
63
  has_rdoc: true
67
- homepage: ""
64
+ homepage: http://www.raydash.com
68
65
  licenses: []
69
66
 
70
67
  post_install_message:
Binary file
Binary file
@@ -1,4 +0,0 @@
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
- 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;Y<X;Y++){U[Y]()}}function K(X){if(J){X()}else{U[U.length]=X}}function s(Y){if(typeof O.addEventListener!=D){O.addEventListener("load",Y,false)}else{if(typeof j.addEventListener!=D){j.addEventListener("load",Y,false)}else{if(typeof O.attachEvent!=D){i(O,"onload",Y)}else{if(typeof O.onload=="function"){var X=O.onload;O.onload=function(){X();Y()}}else{O.onload=Y}}}}}function h(){if(T){V()}else{H()}}function V(){var X=j.getElementsByTagName("body")[0];var aa=C(r);aa.setAttribute("type",q);var Z=X.appendChild(aa);if(Z){var Y=0;(function(){if(typeof Z.GetVariable!=D){var ab=Z.GetVariable("$version");if(ab){ab=ab.split(" ")[1].split(",");M.pv=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}else{if(Y<10){Y++;setTimeout(arguments.callee,10);return}}X.removeChild(aa);Z=null;H()})()}else{H()}}function H(){var ag=o.length;if(ag>0){for(var af=0;af<ag;af++){var Y=o[af].id;var ab=o[af].callbackFn;var aa={success:false,id:Y};if(M.pv[0]>0){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<ac;ad++){if(X[ad].getAttribute("name").toLowerCase()!="movie"){ah[X[ad].getAttribute("name")]=X[ad].getAttribute("value")}}P(ai,ah,Y,ab)}else{p(ae);if(ab){ab(aa)}}}}}else{w(Y,true);if(ab){var Z=z(Y);if(Z&&typeof Z.SetVariable!=D){aa.success=true;aa.ref=Z}ab(aa)}}}}}function z(aa){var X=null;var Y=c(aa);if(Y&&Y.nodeName=="OBJECT"){if(typeof Y.SetVariable!=D){X=Y}else{var Z=Y.getElementsByTagName(r)[0];if(Z){X=Z}}}return X}function A(){return !a&&F("6.0.65")&&(M.win||M.mac)&&!(M.wk&&M.wk<312)}function P(aa,ab,X,Z){a=true;E=Z||null;B={success:false,id:X};var ae=c(X);if(ae){if(ae.nodeName=="OBJECT"){l=g(ae);Q=null}else{l=ae;Q=X}aa.id=R;if(typeof aa.width==D||(!/%$/.test(aa.width)&&parseInt(aa.width,10)<310)){aa.width="310"}if(typeof aa.height==D||(!/%$/.test(aa.height)&&parseInt(aa.height,10)<137)){aa.height="137"}j.title=j.title.slice(0,47)+" - Flash Player Installation";var ad=M.ie&&M.win?"ActiveX":"PlugIn",ac="MMredirectURL="+O.location.toString().replace(/&/g,"%26")+"&MMplayerType="+ad+"&MMdoctitle="+j.title;if(typeof ab.flashvars!=D){ab.flashvars+="&"+ac}else{ab.flashvars=ac}if(M.ie&&M.win&&ae.readyState!=4){var Y=C("div");X+="SWFObjectNew";Y.setAttribute("id",X);ae.parentNode.insertBefore(Y,ae);ae.style.display="none";(function(){if(ae.readyState==4){ae.parentNode.removeChild(ae)}else{setTimeout(arguments.callee,10)}})()}u(aa,ab,X)}}function p(Y){if(M.ie&&M.win&&Y.readyState!=4){var X=C("div");Y.parentNode.insertBefore(X,Y);X.parentNode.replaceChild(g(Y),X);Y.style.display="none";(function(){if(Y.readyState==4){Y.parentNode.removeChild(Y)}else{setTimeout(arguments.callee,10)}})()}else{Y.parentNode.replaceChild(g(Y),Y)}}function g(ab){var aa=C("div");if(M.win&&M.ie){aa.innerHTML=ab.innerHTML}else{var Y=ab.getElementsByTagName(r)[0];if(Y){var ad=Y.childNodes;if(ad){var X=ad.length;for(var Z=0;Z<X;Z++){if(!(ad[Z].nodeType==1&&ad[Z].nodeName=="PARAM")&&!(ad[Z].nodeType==8)){aa.appendChild(ad[Z].cloneNode(true))}}}}}return aa}function u(ai,ag,Y){var X,aa=c(Y);if(M.wk&&M.wk<312){return X}if(aa){if(typeof ai.id==D){ai.id=Y}if(M.ie&&M.win){var ah="";for(var ae in ai){if(ai[ae]!=Object.prototype[ae]){if(ae.toLowerCase()=="data"){ag.movie=ai[ae]}else{if(ae.toLowerCase()=="styleclass"){ah+=' class="'+ai[ae]+'"'}else{if(ae.toLowerCase()!="classid"){ah+=" "+ae+'="'+ai[ae]+'"'}}}}}var af="";for(var ad in ag){if(ag[ad]!=Object.prototype[ad]){af+='<param name="'+ad+'" value="'+ag[ad]+'" />'}}aa.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'+ah+">"+af+"</object>";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<ac;ab++){I[ab][0].detachEvent(I[ab][1],I[ab][2])}var Z=N.length;for(var aa=0;aa<Z;aa++){y(N[aa])}for(var Y in M){M[Y]=null}M=null;for(var X in swfobject){swfobject[X]=null}swfobject=null})}}();return{registerObject:function(ab,X,aa,Z){if(M.w3&&ab&&X){var Y={};Y.id=ab;Y.swfVersion=X;Y.expressInstall=aa;Y.callbackFn=Z;o[o.length]=Y;w(ab,false)}else{if(Z){Z({success:false,id:ab})}}},getObjectById:function(X){if(M.w3){return z(X)}},embedSWF:function(ab,ah,ae,ag,Y,aa,Z,ad,af,ac){var X={success:false,id:ah};if(M.w3&&!(M.wk&&M.wk<312)&&ab&&ah&&ae&&ag&&Y){w(ah,false);K(function(){ae+="";ag+="";var aj={};if(af&&typeof af===r){for(var al in af){aj[al]=af[al]}}aj.data=ab;aj.width=ae;aj.height=ag;var am={};if(ad&&typeof ad===r){for(var ak in ad){am[ak]=ad[ak]}}if(Z&&typeof Z===r){for(var ai in Z){if(typeof am.flashvars!=D){am.flashvars+="&"+ai+"="+Z[ai]}else{am.flashvars=ai+"="+Z[ai]}}}if(F(Y)){var an=u(aj,am,ah);if(aj.id==ah){w(ah,true)}X.success=true;X.ref=an}else{if(aa&&A()){aj.data=aa;P(aj,am,ah,ac);return}else{w(ah,true)}}if(ac){ac(X)}})}else{if(ac){ac(X)}}},switchOffAutoHideShow:function(){m=false},ua:M,getFlashPlayerVersion:function(){return{major:M.pv[0],minor:M.pv[1],release:M.pv[2]}},hasFlashPlayerVersion:F,createSWF:function(Z,Y,X){if(M.w3){return u(Z,Y,X)}else{return undefined}},showExpressInstall:function(Z,aa,X,Y){if(M.w3&&A()){P(Z,aa,X,Y)}},removeSWF:function(X){if(M.w3){y(X)}},createCSS:function(aa,Z,Y,X){if(M.w3){v(aa,Z,Y,X)}},addDomLoadEvent:K,addLoadEvent:s,getQueryParamValue:function(aa){var Z=j.location.search||j.location.hash;if(Z){if(/\?/.test(Z)){Z=Z.split("?")[1]}if(aa==null){return L(Z)}var Y=Z.split("&");for(var X=0;X<Y.length;X++){if(Y[X].substring(0,Y[X].indexOf("="))==aa){return L(Y[X].substring((Y[X].indexOf("=")+1)))}}}return""},expressInstallCallback:function(){if(a){var X=c(R);if(X&&l){X.parentNode.replaceChild(l,X);if(Q){w(Q,true);if(M.ie&&M.win){l.style.display="block"}}if(E){E(B)}}a=false}}}}();