Merge branch 'master' of github.com:bigbluebutton/bigbluebutton into fix-typos

This commit is contained in:
Anton Georgiev 2015-01-16 20:45:06 +00:00
commit 75798be97d
58 changed files with 738 additions and 22431 deletions

View File

@ -13,49 +13,36 @@ task resolveDeps(type: Copy) {
}
repositories {
add(new org.apache.ivy.plugins.resolver.ChainResolver()) {
name = 'remote'
returnFirst = true
add(new org.apache.ivy.plugins.resolver.URLResolver()) {
name = "googlecode"
addArtifactPattern "http://red5.googlecode.com/svn/repository/[artifact](-[revision]).[ext]"
addArtifactPattern "http://red5.googlecode.com/svn/repository/[organisation]/[artifact](-[revision]).[ext]"
}
add(new org.apache.ivy.plugins.resolver.URLResolver()) {
name = "blindside-repos"
addArtifactPattern "http://blindside.googlecode.com/svn/repository/[artifact](-[revision]).[ext]"
addArtifactPattern "http://blindside.googlecode.com/svn/repository/[organisation]/[artifact](-[revision]).[ext]"
}
mavenCentral()
add(new org.apache.ivy.plugins.resolver.ChainResolver()) {
name = 'remote'
returnFirst = true
add(new org.apache.ivy.plugins.resolver.URLResolver()) {
name = "maven2-central"
m2compatible = true
addArtifactPattern "http://repo1.maven.org/maven2/[organisation]/[module]/[revision]/[artifact](-[revision]).[ext]"
addArtifactPattern "http://repo1.maven.org/maven2/[organisation]/[artifact]/[revision]/[artifact](-[revision]).[ext]"
}
name = "googlecode"
addArtifactPattern "http://red5.googlecode.com/svn/repository/[artifact](-[revision]).[ext]"
addArtifactPattern "http://red5.googlecode.com/svn/repository/[organisation]/[artifact](-[revision]).[ext]"
}
add(new org.apache.ivy.plugins.resolver.URLResolver()) {
name = "testng_ibiblio_maven2"
m2compatible = true
addArtifactPattern "http://repo1.maven.org/maven2/[organisation]/[module]/[revision]/[artifact](-[revision])-jdk15.[ext]"
addArtifactPattern "http://repo1.maven.org/maven2/[organisation]/[artifact]/[revision]/[artifact](-[revision])-jdk15.[ext]"
}
add(new org.apache.ivy.plugins.resolver.URLResolver()) {
name = "netty-dependency"
m2compatible = true
addArtifactPattern "http://repository.jboss.org/nexus/content/groups/public-jboss/[organisation]/[module]/[revision]/[artifact](-[revision]).[ext]"
addArtifactPattern "http://repo1.maven.org/maven2/[organisation]/[artifact]/[revision]/[artifact](-[revision]).[ext]"
}
add(new org.apache.ivy.plugins.resolver.URLResolver()) {
name = "spring-bundles"
m2compatible = true
addArtifactPattern "http://repository.springsource.com/maven/bundles/external/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"
addArtifactPattern "http://repository.springsource.com/maven/bundles/release/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"
}
add(new org.apache.ivy.plugins.resolver.URLResolver()) {
name = "Red5"
m2compatible = true
addArtifactPattern "http://red5.googlecode.com/svn/repository/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"
addArtifactPattern "http://red5.googlecode.com/svn/repository/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"
}
name = "blindside-repos"
addArtifactPattern "http://blindside.googlecode.com/svn/repository/[artifact](-[revision]).[ext]"
addArtifactPattern "http://blindside.googlecode.com/svn/repository/[organisation]/[artifact](-[revision]).[ext]"
}
add(new org.apache.ivy.plugins.resolver.URLResolver()) {
name = "testng_ibiblio_maven2"
m2compatible = true
addArtifactPattern "http://repo1.maven.org/maven2/[organisation]/[module]/[revision]/[artifact](-[revision])-jdk15.[ext]"
addArtifactPattern "http://repo1.maven.org/maven2/[organisation]/[artifact]/[revision]/[artifact](-[revision])-jdk15.[ext]"
}
add(new org.apache.ivy.plugins.resolver.URLResolver()) {
name = "spring-bundles"
m2compatible = true
addArtifactPattern "http://repository.springsource.com/maven/bundles/external/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"
addArtifactPattern "http://repository.springsource.com/maven/bundles/release/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"
}
mavenRepo name: "jboss", urls: "http://repository.jboss.org/nexus/content/groups/public-jboss"
mavenRepo name: "sonatype-snapshot", urls: "http://oss.sonatype.org/content/repositories/snapshots"
mavenRepo name: "sonatype-releases", urls: "http://oss.sonatype.org/content/repositories/releases"
}
}
@ -75,10 +62,10 @@ dependencies {
providedCompile 'org.springframework:spring-core:4.0.7.RELEASE@jar'
// Red5
providedCompile 'org/red5:red5-server:1.0.4-RELEASE@jar'
providedCompile 'org.red5:red5-io:1.0.4-RELEASE@jar'
providedCompile 'org/red5:red5-server-common:1.0.4-RELEASE@jar'
providedCompile 'org/red5:red5-server:1.0.5-jan122015-SNAPSHOT@jar'
providedCompile 'org.red5:red5-server-common:1.0.5-SNAPSHOT@jar'
providedCompile 'org.red5:red5-io:1.0.5-SNAPSHOT@jar'
// Logging
providedCompile 'ch.qos.logback:logback-core:1.1.2@jar'
providedCompile 'ch.qos.logback:logback-classic:1.1.2@jar'
@ -96,7 +83,7 @@ dependencies {
providedCompile 'net.jcip:jcip-annotations:1.0@jar'
// Testing
compile 'org.testng:testng:5.8@jar'
// compile 'org.testng:testng:5.8@jar'
compile 'org.easymock:easymock:2.4@jar'
//redis

View File

@ -13,52 +13,40 @@ task resolveDeps(type: Copy) {
}
repositories {
add(new org.apache.ivy.plugins.resolver.ChainResolver()) {
name = 'remote'
returnFirst = true
add(new org.apache.ivy.plugins.resolver.URLResolver()) {
name = "googlecode"
addArtifactPattern "http://red5.googlecode.com/svn/repository/[artifact](-[revision]).[ext]"
addArtifactPattern "http://red5.googlecode.com/svn/repository/[organisation]/[artifact](-[revision]).[ext]"
}
add(new org.apache.ivy.plugins.resolver.URLResolver()) {
name = "blindside-repos"
addArtifactPattern "http://blindside.googlecode.com/svn/repository/[artifact](-[revision]).[ext]"
addArtifactPattern "http://blindside.googlecode.com/svn/repository/[organisation]/[artifact](-[revision]).[ext]"
}
mavenCentral()
add(new org.apache.ivy.plugins.resolver.ChainResolver()) {
name = 'remote'
returnFirst = true
add(new org.apache.ivy.plugins.resolver.URLResolver()) {
name = "maven2-central"
m2compatible = true
addArtifactPattern "http://repo1.maven.org/maven2/[organisation]/[module]/[revision]/[artifact](-[revision]).[ext]"
addArtifactPattern "http://repo1.maven.org/maven2/[organisation]/[artifact]/[revision]/[artifact](-[revision]).[ext]"
}
name = "googlecode"
addArtifactPattern "http://red5.googlecode.com/svn/repository/[artifact](-[revision]).[ext]"
addArtifactPattern "http://red5.googlecode.com/svn/repository/[organisation]/[artifact](-[revision]).[ext]"
}
add(new org.apache.ivy.plugins.resolver.URLResolver()) {
name = "testng_ibiblio_maven2"
m2compatible = true
addArtifactPattern "http://repo1.maven.org/maven2/[organisation]/[module]/[revision]/[artifact](-[revision])-jdk15.[ext]"
addArtifactPattern "http://repo1.maven.org/maven2/[organisation]/[artifact]/[revision]/[artifact](-[revision])-jdk15.[ext]"
}
add(new org.apache.ivy.plugins.resolver.URLResolver()) {
name = "netty-dependency"
m2compatible = true
addArtifactPattern "http://repository.jboss.org/nexus/content/groups/public-jboss/[organisation]/[module]/[revision]/[artifact](-[revision]).[ext]"
addArtifactPattern "http://repo1.maven.org/maven2/[organisation]/[artifact]/[revision]/[artifact](-[revision]).[ext]"
}
add(new org.apache.ivy.plugins.resolver.URLResolver()) {
name = "spring-bundles"
m2compatible = true
addArtifactPattern "http://repository.springsource.com/maven/bundles/external/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"
addArtifactPattern "http://repository.springsource.com/maven/bundles/release/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"
}
add(new org.apache.ivy.plugins.resolver.URLResolver()) {
name = "Red5"
m2compatible = true
addArtifactPattern "http://red5.googlecode.com/svn/repository/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"
addArtifactPattern "http://red5.googlecode.com/svn/repository/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"
}
}
name = "blindside-repos"
addArtifactPattern "http://blindside.googlecode.com/svn/repository/[artifact](-[revision]).[ext]"
addArtifactPattern "http://blindside.googlecode.com/svn/repository/[organisation]/[artifact](-[revision]).[ext]"
}
add(new org.apache.ivy.plugins.resolver.URLResolver()) {
name = "testng_ibiblio_maven2"
m2compatible = true
addArtifactPattern "http://repo1.maven.org/maven2/[organisation]/[module]/[revision]/[artifact](-[revision])-jdk15.[ext]"
addArtifactPattern "http://repo1.maven.org/maven2/[organisation]/[artifact]/[revision]/[artifact](-[revision])-jdk15.[ext]"
}
add(new org.apache.ivy.plugins.resolver.URLResolver()) {
name = "spring-bundles"
m2compatible = true
addArtifactPattern "http://repository.springsource.com/maven/bundles/external/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"
addArtifactPattern "http://repository.springsource.com/maven/bundles/release/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"
}
mavenRepo name: "jboss", urls: "http://repository.jboss.org/nexus/content/groups/public-jboss"
mavenRepo name: "sonatype-snapshot", urls: "http://oss.sonatype.org/content/repositories/snapshots"
mavenRepo name: "sonatype-releases", urls: "http://oss.sonatype.org/content/repositories/releases"
}
}
dependencies {
// Servlet
providedCompile 'javax.servlet:servlet-api:2.5@jar'
@ -74,10 +62,9 @@ dependencies {
providedCompile 'org.springframework:spring-context:4.0.8.RELEASE@jar'
providedCompile 'org.springframework:spring-core:4.0.8.RELEASE@jar'
// Red5
providedCompile 'org/red5:red5-server:1.0.4-RELEASE@jar'
providedCompile 'org.red5:red5-io:1.0.4-RELEASE@jar'
providedCompile 'org/red5:red5-server-common:1.0.4-RELEASE@jar'
providedCompile 'org/red5:red5-server:1.0.5-jan122015-SNAPSHOT@jar'
providedCompile 'org.red5:red5-server-common:1.0.5-SNAPSHOT@jar'
providedCompile 'org.red5:red5-io:1.0.5-SNAPSHOT@jar'
// Logging
providedCompile 'ch.qos.logback:logback-core:1.1.2@jar'
@ -96,11 +83,11 @@ dependencies {
//providedCompile 'net.jcip:jcip-annotations:1.0@jar'
// Testing
compile 'org.testng:testng:5.8@jar'
// compile 'org.testng:testng:5.8@jar'
compile 'org.easymock:easymock:2.4@jar'
// Testing
testRuntime 'org/testng:testng:5.8@jar'
// testRuntime 'org/testng:testng:5.8@jar'
testRuntime 'org.easymock:easymock:2.4@jar'
compile 'javax/media:jmf:2.1.1e@jar'

View File

@ -17,6 +17,7 @@ task resolveDeps(type: Copy) {
}
repositories {
mavenCentral()
add(new org.apache.ivy.plugins.resolver.ChainResolver()) {
name = 'remote'
returnFirst = true
@ -29,31 +30,23 @@ repositories {
name = "blindside-repos"
addArtifactPattern "http://blindside.googlecode.com/svn/repository/[artifact](-[revision]).[ext]"
addArtifactPattern "http://blindside.googlecode.com/svn/repository/[organisation]/[artifact](-[revision]).[ext]"
}
add(new org.apache.ivy.plugins.resolver.URLResolver()) {
name = "maven2-central"
m2compatible = true
addArtifactPattern "http://repo1.maven.org/maven2/[organisation]/[module]/[revision]/[artifact](-[revision]).[ext]"
addArtifactPattern "http://repo1.maven.org/maven2/[organisation]/[artifact]/[revision]/[artifact](-[revision]).[ext]"
}
}
add(new org.apache.ivy.plugins.resolver.URLResolver()) {
name = "testng_ibiblio_maven2"
m2compatible = true
addArtifactPattern "http://repo1.maven.org/maven2/[organisation]/[module]/[revision]/[artifact](-[revision])-jdk15.[ext]"
addArtifactPattern "http://repo1.maven.org/maven2/[organisation]/[artifact]/[revision]/[artifact](-[revision])-jdk15.[ext]"
}
add(new org.apache.ivy.plugins.resolver.URLResolver()) {
name = "netty-dependency"
m2compatible = true
addArtifactPattern "http://repository.jboss.org/nexus/content/groups/public-jboss/[organisation]/[module]/[revision]/[artifact](-[revision]).[ext]"
addArtifactPattern "http://repo1.maven.org/maven2/[organisation]/[artifact]/[revision]/[artifact](-[revision]).[ext]"
}
add(new org.apache.ivy.plugins.resolver.URLResolver()) {
name = "spring-bundles"
m2compatible = true
addArtifactPattern "http://repository.springsource.com/maven/bundles/external/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"
addArtifactPattern "http://repository.springsource.com/maven/bundles/release/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"
}
mavenRepo name: "jboss", urls: "http://repository.jboss.org/nexus/content/groups/public-jboss"
mavenRepo name: "sonatype-snapshot", urls: "http://oss.sonatype.org/content/repositories/snapshots"
mavenRepo name: "sonatype-releases", urls: "http://oss.sonatype.org/content/repositories/releases"
}
}
@ -73,8 +66,8 @@ dependencies {
providedCompile 'org.springframework:spring-core:4.0.8.RELEASE@jar'
// Red5
providedCompile 'org/red5:red5-server:1.0.4-RELEASE@jar'
providedCompile 'org/red5:red5-server-common:1.0.4-RELEASE@jar'
providedCompile 'org/red5:red5-server:1.0.5-jan122015-SNAPSHOT@jar'
providedCompile 'org.red5:red5-server-common:1.0.5-SNAPSHOT@jar'
// Logging
providedCompile 'ch.qos.logback:logback-core:1.1.2@jar'
@ -98,7 +91,7 @@ dependencies {
compile 'aopalliance:aopalliance:1.0@jar'
// Testing
compile 'org.testng:testng:5.8@jar'
//compile 'org.testng:testng:5.8-jdk15@jar'
compile 'org.easymock:easymock:2.4@jar'
//redis

View File

@ -29,6 +29,10 @@ ToolTip {
cornerRadius : 3;
}
.errorTip {
borderColor : #3b3b3b;
}
.mypanelTitle {
color: #444444;
fontFamily: Arial;
@ -827,3 +831,24 @@ Alert {
.recordButtonStyleStop {
icon: Embed('assets/images/control-record-stop.png');
}
.statusImageStyle {
successImage: Embed(source='assets/images/status_success.png');
warningImage: Embed(source='assets/images/status_warning.png');
failImage: Embed(source='assets/images/status_fail.png');
}
.warningButtonStyle {
icon: Embed('assets/images/status_warning_20.png');
}
.statusTitleStyle {
fontWeight: bold;
fontSize: 12;
paddingBottom: 0;
}
.statusMessageStyle {
fontSize: 12;
paddingTop: 0;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 382 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 485 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 774 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 529 B

View File

@ -16,19 +16,25 @@
* with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
*
*/
// Most of the source is adapted from the ToolTipBorder class and the functionality is replicated here for performance reasons
package org.bigbluebutton.skins
{
import flash.display.Graphics;
import flash.events.Event;
import flash.geom.Point;
import mx.core.EdgeMetrics;
import flash.filters.DropShadowFilter;
import mx.graphics.RectangularDropShadow;
import mx.managers.ToolTipManager;
import mx.skins.halo.ToolTipBorder;
import mx.skins.RectangularBorder;
public class ToolTipSkin extends ToolTipBorder
public class ToolTipSkin extends RectangularBorder
{
private static const TOP : String = "top";
private static const LOG : String = "ToolTipSkin - ";
private static const TOP : String = "top";
private static const BOTTOM : String = "bottom";
private var _arrowPosition : String = TOP;
@ -38,11 +44,219 @@ package org.bigbluebutton.skins
visible = false;
addEventListener(Event.ENTER_FRAME, this.enterFrameHandler);
}
//--------------------------------------------------------------------------
//
// Overridden properties
//
//--------------------------------------------------------------------------
//----------------------------------
// borderMetrics
//----------------------------------
/**
* @private
* Storage for the borderMetrics property.
*/
private var _borderMetrics:EdgeMetrics;
/**
* @private
*/
override public function get borderMetrics():EdgeMetrics
{
if (_borderMetrics)
return _borderMetrics;
var borderStyle:String = getStyle("borderStyle");
switch (borderStyle)
{
case "errorTipRight":
{
_borderMetrics = new EdgeMetrics(15, 1, 3, 3);
break;
}
case "errorTipAbove":
{
_borderMetrics = new EdgeMetrics(3, 1, 3, 15);
break;
}
case "errorTipBelow":
{
_borderMetrics = new EdgeMetrics(3, 13, 3, 3);
break;
}
default: // "toolTip"
{
_borderMetrics = new EdgeMetrics(3, 1, 3, 3);
break;
}
}
return _borderMetrics;
}
//--------------------------------------------------------------------------
//
// Overridden methods
//
//--------------------------------------------------------------------------
/**
* @private
* If borderStyle may have changed, clear the cached border metrics.
*/
override public function styleChanged(styleProp:String):void
{
super.styleChanged(styleProp);
if (styleProp == "borderStyle" ||
styleProp == "styleName" ||
styleProp == null)
{
_borderMetrics = null;
var borderStyle:String = getStyle("borderStyle");
switch (borderStyle)
{
case "errorTipRight":
case "errorTipAbove":
case "errorTipBelow":
{
visible = true;
break;
}
}
}
}
/**
* @private
* Draw the background and border.
*/
override protected function updateDisplayList(w:Number, h:Number):void
{
super.updateDisplayList(w, h);
var borderStyle:String = getStyle("borderStyle");
var backgroundColor:uint = getStyle("backgroundColor");
var backgroundAlpha:Number= getStyle("backgroundAlpha");
var borderColor:uint = getStyle("borderColor");
var cornerRadius:Number = getStyle("cornerRadius");
var g:Graphics = graphics;
g.clear();
filters = [];
switch (borderStyle)
{
case "none":
{
// Don't draw anything
break;
}
case "errorTipRight":
{
// border
drawRoundRect(
11, 0, w - 11, h - 2, 3,
borderColor, backgroundAlpha);
// left pointer
g.beginFill(borderColor, backgroundAlpha);
g.moveTo(11, 7);
g.lineTo(0, 13);
g.lineTo(11, 19);
g.moveTo(11, 7);
g.endFill();
filters = [ new DropShadowFilter(2, 90, 0, 0.4) ];
break;
}
case "errorTipAbove":
{
// border
drawRoundRect(
0, 0, w, h - 13, 3,
borderColor, backgroundAlpha);
// bottom pointer
g.beginFill(borderColor, backgroundAlpha);
g.moveTo(w/2-6, h - 13);
g.lineTo(w/2, h - 2);
g.lineTo(w/2+6, h - 13);
g.moveTo(w/2-6, h - 13);
g.endFill();
filters = [ new DropShadowFilter(2, 90, 0, 0.4) ];
break;
}
case "errorTipBelow":
{
// border
drawRoundRect(
0, 11, w, h - 13, 3,
borderColor, backgroundAlpha);
// top pointer
g.beginFill(borderColor, backgroundAlpha);
g.moveTo(9, 11);
g.lineTo(15, 0);
g.lineTo(21, 11);
g.moveTo(10, 11);
g.endFill();
filters = [ new DropShadowFilter(2, 90, 0, 0.4) ];
break;
}
default: //Tooltip
{
// face
drawRoundRect(
3, 1, w - 6, h - 4, cornerRadius,
backgroundColor, backgroundAlpha)
// top pointer
if (_arrowPosition == TOP) {
g.beginFill(backgroundColor, backgroundAlpha);
g.moveTo((w / 2) - 6, 1);
g.lineTo((w / 2), -10);
g.lineTo((w / 2) + 6, 1);
g.moveTo((w / 2) - 5, -10);
g.endFill();
}
else {
g.beginFill(backgroundColor, backgroundAlpha);
g.moveTo((w / 2) - 6, h - 3);
g.lineTo((w / 2), h + 7);
g.lineTo((w / 2) + 6, h - 3);
g.moveTo((w / 2) - 5, h + 7);
g.endFill();
}
break;
}
}
}
//--------------------------------------------------------------------------
//
// Methods
//
//--------------------------------------------------------------------------
private function enterFrameHandler( event : Event ) : void {
this.position();
}
private function position() : void {
if (!stage || !ToolTipManager.currentToolTip || !ToolTipManager.currentTarget)
{
@ -54,11 +268,11 @@ package org.bigbluebutton.skins
var globalPoint : Point = ToolTipManager.currentTarget.localToGlobal(parentCoords);
var xp : Number = globalPoint.x + 5 - (ToolTipManager.currentToolTip.width / 2);
var yp : Number = globalPoint.y + ToolTipManager.currentToolTip.height;
var overhangRight : Number = ToolTipManager.currentToolTip.width + xp;
var overhangBottom : Number = ToolTipManager.currentToolTip.height + yp;
updateArrowPosition(TOP);
if (overhangRight > stage.stageWidth) {
xp = stage.stageWidth - ToolTipManager.currentToolTip.width;
}
@ -81,61 +295,14 @@ package org.bigbluebutton.skins
ToolTipManager.currentToolTip.y = yp;
visible = true;
}
}
private function updateArrowPosition( value : String ) : void {
if (_arrowPosition != value) {
_arrowPosition = value;
validateDisplayList();
}
}
//--------------------------------------------------------------------------
//
// Overridden methods
//
//--------------------------------------------------------------------------
override protected function updateDisplayList( w : Number, h : Number ) : void {
super.updateDisplayList(w, h);
var backgroundColor : uint = getStyle("backgroundColor");
var backgroundAlpha : Number = getStyle("backgroundAlpha");
var borderColor : uint = getStyle("borderColor");
var cornerRadius : Number = getStyle("cornerRadius");
var g : Graphics = graphics;
g.clear();
filters = [];
// face
drawRoundRect(
3, 1, w - 6, h - 4, cornerRadius,
backgroundColor, backgroundAlpha)
// top pointer
if (_arrowPosition == TOP) {
g.beginFill(backgroundColor, backgroundAlpha);
g.moveTo((w / 2) - 6, 1);
g.lineTo((w / 2), -10);
g.lineTo((w / 2) + 6, 1);
g.moveTo((w / 2) - 5, -10);
g.endFill();
}
else {
g.beginFill(backgroundColor, backgroundAlpha);
g.moveTo((w / 2) - 6, h - 3);
g.lineTo((w / 2), h + 7);
g.lineTo((w / 2) + 6, h - 3);
g.moveTo((w / 2) - 5, h + 7);
g.endFill();
}
}
}
}

View File

@ -418,10 +418,7 @@
</copy>
<copy todir="${OUTPUT_DIR}/lib/" >
<fileset dir="${PROD_RESOURCES_DIR}/lib"/>
</copy>
<copy todir="${OUTPUT_DIR}/check/" >
<fileset dir="${PROD_RESOURCES_DIR}/check"/>
</copy>
</copy>
<copy file="${PROD_RESOURCES_DIR}/BigBlueButtonTest.html" todir="${OUTPUT_DIR}" overwrite="true"/>
<copy file="${PROD_RESOURCES_DIR}/BigBlueButton.html" todir="${OUTPUT_DIR}" overwrite="true"/>
<copy file="${PROD_RESOURCES_DIR}/DeskshareStandalone.html" todir="${OUTPUT_DIR}" overwrite="true"/>

View File

@ -64,9 +64,7 @@ bbb.micWarning.joinBtn.label = Join anyway
bbb.micWarning.testAgain.label = Test again
bbb.micWarning.message = Your microphone did not show any activity, others probably won't be able to hear you during the session.
bbb.webrtcWarning.message = Detected the following WebRTC issue: {0}. Do you want to try Flash instead?
bbb.webrtcWarning.mediamessage = Could not get your microphone for a WebRTC call. Do you want to try Flash instead?
bbb.webrtcWarning.endedunexpectedly = The WebRTC echo test ended unexpectedly. Do you want to try Flash instead?
bbb.webrtcWarning.title = WebRTC Connection Failed
bbb.webrtcWarning.title = WebRTC Audio Failure
bbb.webrtcWarning.failedError.1001 = Error 1001: WebSocket disconnected
bbb.webrtcWarning.failedError.1002 = Error 1002: Could not make a WebSocket connection
bbb.webrtcWarning.failedError.1003 = Error 1003: Browser version not supported
@ -75,6 +73,8 @@ bbb.webrtcWarning.failedError.1005 = Error 1005: Call ended unexpectedly
bbb.webrtcWarning.failedError.1006 = Error 1006: Call timed out
bbb.webrtcWarning.failedError.1007 = Error 1007: ICE negotiation failed
bbb.webrtcWarning.failedError.unknown = Error {0}: Unknown error code
bbb.webrtcWarning.failedError.mediamissing = Could not get your microphone for a WebRTC call
bbb.webrtcWarning.failedError.endedunexpectedly = The WebRTC echo test ended unexpectedly
bbb.mainToolbar.helpBtn = Help
bbb.mainToolbar.logoutBtn = Logout
bbb.mainToolbar.logoutBtn.toolTip = Log Out
@ -95,6 +95,16 @@ bbb.mainToolbar.recordBtn..notification.message1 = You can record this meeting.
bbb.mainToolbar.recordBtn..notification.message2 = You must click the Start/Stop Recording button in the title bar to begin/end recording.
bbb.mainToolbar.recordingLabel.recording = (Recording)
bbb.mainToolbar.recordingLabel.notRecording = Not Recording
bbb.clientstatus.title = Configuration Warnings
bbb.clientstatus.notification = There is an unread notification
bbb.clientstatus.tunneling.title = Firewall
bbb.clientstatus.tunneling.message = A firewall is preventing your client from connecting directly on port 1935 to the remote server. Recommend joining a less restrictive network for a more stable connection
bbb.clientstatus.browser.title = Browser Version
bbb.clientstatus.browser.message = Your browser ({0}) is not up-to-date. Recommend updating to the latest version.
bbb.clientstatus.flash.title = Flash Player Version
bbb.clientstatus.flash.message = Your Flash Player plugin ({0}) is out of date. Recommend updating to the latest version.
bbb.clientstatus.webrtc.title = Audio
bbb.clientstatus.webrtc.message = Your browser doesn't support higher quality audio (WebRTC). Recommend you use an up-to-date version of either Firefox or Chrome.
bbb.window.minimizeBtn.toolTip = Minimize
bbb.window.maximizeRestoreBtn.toolTip = Maximize
bbb.window.closeBtn.toolTip = Close

View File

@ -10,6 +10,7 @@
<language userSelectionEnabled="true" />
<skinning enabled="true" url="http://HOST/client/branding/css/BBBDefault.css.swf" />
<shortcutKeys showButton="true" />
<browserVersions chrome="CHROME_VERSION" firefox="FIREFOX_VERSION" flash="FLASH_VERSION" />
<layout showLogButton="false" showVideoLayout="false" showResetLayout="true" defaultLayout="bbb.layout.name.defaultlayout"
showToolbar="true" showFooter="true" showMeetingName="true" showHelpButton="true"
showLogoutWindow="true" showLayoutTools="true" showNetworkMonitor="false" confirmLogout="true"

View File

@ -1,89 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<style type="text/css" media="screen">
html, body, #flashclient { height:100%; }
body { margin:0; padding:0; overflow:hidden; }
#altContent { /* style alt content */ }
</style>
<script type="text/javascript" src="../swfobject/swfobject.js"></script>
<script type="text/javascript">
swfobject.registerObject("MicrophoneCheck", "11", "expressInstall.swf");
swfobject.registerObject("RTMPConnCheck", "11", "expressInstall.swf");
</script>
<script type="text/javascript" src="../lib/jquery-1.5.1.min.js" language="javascript"></script>
<script type="text/javascript" src="lib/deployJava.js" language="javascript"></script>
<script type="text/javascript" src="lib/bbb_check.js" language="javascript"></script>
<script type="text/javascript" src="lib/pre_flight_check.js" language="javascript"></script>
<script>
var testJava = function() {
window.open("http://www.java.com/en/download/testjava.jsp")
}
window.onload = function() {
registerListeners();
}
</script>
</head>
<body>
<div id="controls">
<button type="button" onclick="bbbCheckFlashVersion()">Check Flash Version</button>
<button type="button" onclick="bbbHasMinFlashVersion('9.0.18')">Min Version</button>
<button type="button" onclick="bbbGetBrowser()">Get browser</button>
<button type="button" onclick="bbbGetJREs()">Get JREs</button>
<button type="button" onclick="testJava()">test Java</button>
<button type="button" onclick="bbbCheckShowMicSettings()">show mic settings</button>
<button type="button" onclick="bbbCheckStartTestMic()">Start Mic</button>
<button type="button" onclick="bbbCheckStopTestMic()">Stop Mic</button>
<button type="button" onclick="bbbCheckShowCamSettings()">show cam settings</button>
<button type="button" onclick="bbbCheckTestRTMPConnection('192.168.0.249', 'video/portTest')">Test RTMP</button>
<button type="button" onclick="bbbCheckSetSocketPolicyFileURL('http://192.168.0.249/socketpolicy.xml')">Load Socket Policy File</button>
<button type="button" onclick="bbbCheckTestSocketConnection('192.168.0.249', 9123)">Test Deskshare conn</button>
</div>
<div id="webcamview" style="background-color:#FFD700;height:215px;width:138px;float:left;">
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540002" width="215" height="138" id="MicrophoneCheck" name="MicrophoneCheck" align="middle">
<param name="movie" value="http://192.168.0.249/client/MicrophoneCheck.swf?v=VERSION" />
<param name="quality" value="high" />
<param name="allowfullscreen" value="true" />
<param name="bgcolor" value="#869ca7" />
<param name="wmode" value="window" />
<param name="allowScriptAccess" value="always" />
<!--[if !IE]>-->
<object type="application/x-shockwave-flash" data="http://192.168.0.249/client/MicrophoneCheck.swf?v=VERSION" width="215" height="138" align="middle">
<param name="quality" value="high" />
<param name="bgcolor" value="#869ca7" />
<param name="allowScriptAccess" value="always" />
<!--<![endif]-->
<a href="http://www.adobe.com/go/getflashplayer">
<img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" />
</a>
<!--[if !IE]>-->
</object>
<!--<![endif]-->
</object>
</div>
<div id="webcamview" style="background-color:#FFD700;height:215px;width:138px;float:left;">
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540002" width="215" height="138" id="RTMPConnCheck" name="RTMPConnCheck" align="middle">
<param name="movie" value="http://192.168.0.249/client/RTMPConnCheck.swf?v=VERSION" />
<param name="quality" value="high" />
<param name="allowfullscreen" value="true" />
<param name="bgcolor" value="#869ca7" />
<param name="wmode" value="window" />
<param name="allowScriptAccess" value="always" />
<!--[if !IE]>-->
<object type="application/x-shockwave-flash" data="http://192.168.0.249/client/RTMPConnCheck.swf?v=VERSION" width="215" height="138" align="middle">
<param name="quality" value="high" />
<param name="bgcolor" value="#869ca7" />
<param name="allowScriptAccess" value="always" />
<!--<![endif]-->
<a href="http://www.adobe.com/go/getflashplayer">
<img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" />
</a>
<!--[if !IE]>-->
</object>
<!--<![endif]-->
</object>
</div>
</body>
</html>

View File

@ -1,215 +0,0 @@
(function(window, undefined) {
var BBBCheck = {};
/**
* Internal function to get the BBB embed object. Seems like we have to do this
* each time and can't create a var for it.
*
* To get the object, see https://code.google.com/p/swfobject/wiki/api
*/
function getSwfObj() {
return swfobject.getObjectById("MicrophoneCheck");
}
function getConnObj() {
return swfobject.getObjectById("RTMPConnCheck");
}
BBBCheck.getFlashPlayerVersion = function() {
return swfobject.getFlashPlayerVersion();
}
BBBCheck.hasMinFlashPlayerVersion = function(flashVersion) {
return swfobject.hasFlashPlayerVersion(flashVersion);
}
BBBCheck.getBrowser = function() {
return deployJava.getBrowser();
}
BBBCheck.getJREs = function() {
return deployJava.getJREs();
}
BBBCheck.installJRE = function(version) {
deployJava.installJRE(version);
}
BBBCheck.installLatestJRE = function() {
deployJava.installLatestJRE();
}
BBBCheck.runApplet = function(attributes, parameters, minimumVersion) {
deployJava.runApplet(attributes, parameters, minimumVersion);
}
BBBCheck.runApplet = function(attributes, parameters, minimumVersion) {
deployJava.runApplet(attributes, parameters, minimumVersion);
}
BBBCheck.showCamSettings = function() {
var swfObj = getSwfObj();
if (swfObj) {
swfObj.showCamSettings();
}
}
BBBCheck.showMicSettings = function() {
var swfObj = getSwfObj();
if (swfObj) {
swfObj.showMicSettings();
}
}
BBBCheck.startTestMicrophone = function() {
var swfObj = getSwfObj();
if (swfObj) {
swfObj.startTestMicrophone();
}
}
BBBCheck.stopTestMicrophone = function() {
var swfObj = getSwfObj();
if (swfObj) {
swfObj.stopTestMicrophone();
}
}
BBBCheck.testRTMPConnection = function(host, app) {
var swfObj = getConnObj();
if (swfObj) {
swfObj.testRTMPConnection(host, app);
}
}
BBBCheck.testSocketConnection = function(host, port) {
var swfObj = getConnObj();
if (swfObj) {
swfObj.testSocketConnection(host, port);
}
}
BBBCheck.setSocketPolicyFileURL = function(url) {
var swfObj = getConnObj();
if (swfObj) {
swfObj.setPolicyFileURL(url);
}
}
/*** Callbacks from Flash test apps **/
BBBCheck.microphoneCheckAppReady = function() {
console.log("microphone check app ready.");
broadcast("MicCheckAppReadyEvent");
}
BBBCheck.noAvailableMicrophoneError = function() {
console.log("no available microphone");
}
BBBCheck.microphoneAccessDenied = function() {
console.log("Mic access has been denied.");
}
BBBCheck.microphoneAccessAllowed = function() {
console.log("Mic access has been allowed.");
}
BBBCheck.camAccessDenied = function() {
console.log("Cam access has been denied.");
}
BBBCheck.camAccessAllowed = function() {
console.log("Cam access has been allowed.");
}
BBBCheck.invalidParamsForRtmpConnectionTest = function() {
console.log("Invalid host or app for rtmp connection test.");
}
BBBCheck.rtmpConnectionTestSuccess = function(rtmp, server, application) {
console.log("Connection succeeded using rtmp[" + rtmp + "]");
}
BBBCheck.rtmpConnectionTestFailed = function(host, app) {
console.log("Failed to connect to [" + host + "][" + app + "]");
}
BBBCheck.socketConnTestFailed = function(host, port) {
console.log("Failed to connect to [" + host + "][" + port + "]");
}
BBBCheck.socketConnTestClosed = function(host, port) {
console.log("Connection closed to [" + host + "][" + port + "]");
}
BBBCheck.socketConnTestSuccess = function(host, port) {
console.log("Connection success to [" + host + "][" + port + "]");
}
BBBCheck.socketConnTestIOError = function(host, port) {
console.log("Connection IO error to [" + host + "][" + port + "]");
}
BBBCheck.socketConnTestSecurityError = function(host, port) {
console.log("Connection security error to [" + host + "][" + port + "]");
}
/* ***********************************************************************************
* Broadcasting of events to 3rd-party apps.
*************************************************************************************/
/** Stores the 3rd-party app event listeners ***/
var listeners = {};
/**
* 3rd-party apps should user this method to register to listen for events.
*/
BBBCheck.listen = function(eventName, handler) {
if (typeof listeners[eventName] === 'undefined')
listeners[eventName] = [];
listeners[eventName].push(handler);
};
/**
* 3rd-party app should use this method to unregister listener for a given event.
*/
BBBCheck.unlisten = function(eventName, handler) {
if (!listeners[eventName])
return;
for (var i = 0; i < listeners[eventName].length; i++) {
if (listeners[eventName][i] === handler) {
listeners.splice(i, 1);
break;
}
}
};
/**
* Private function to broadcast received event from the BigBlueButton Flash client to
* 3rd-parties.
*/
function broadcast(eventName, params) {
if (!listeners[eventName]) {
console.log("No listeners for [" + eventName + "]");
return;
}
for (var i = 0; i < listeners[eventName].length; i++) {
console.log("Notifying listeners for [" + eventName + "]");
if (params == null) {
listeners[eventName][i]();
} else {
listeners[eventName][i](params);
}
}
};
window.BBBCheck = BBBCheck;
})(this);

View File

@ -1,567 +0,0 @@
var deployJava = {
debug: null,
firefoxJavaVersion: null,
myInterval: null,
preInstallJREList: null,
returnPage: null,
brand: null,
locale: null,
installType: null,
EAInstallEnabled: false,
EarlyAccessURL: null,
getJavaURL: 'http://java.sun.com/webapps/getjava/BrowserRedirect?host=java.com',
appleRedirectPage: 'http://www.apple.com/support/downloads/',
oldMimeType: 'application/npruntime-scriptable-plugin;DeploymentToolkit',
mimeType: 'application/java-deployment-toolkit',
launchButtonPNG: 'http://java.sun.com/products/jfc/tsc/articles/swing2d/webstart.png',
browserName: null,
browserName2: null,
getJREs: function() {
var list = new Array();
if (deployJava.isPluginInstalled()) {
var plugin = deployJava.getPlugin();
var VMs = plugin.jvms;
for (var i = 0; i < VMs.getLength(); i++) {
list[i] = VMs.get(i).version;
}
} else {
var browser = deployJava.getBrowser();
if (browser == 'MSIE') {
if (deployJava.testUsingActiveX('1.7.0')) {
list[0] = '1.7.0';
} else if (deployJava.testUsingActiveX('1.6.0')) {
list[0] = '1.6.0';
} else if (deployJava.testUsingActiveX('1.5.0')) {
list[0] = '1.5.0';
} else if (deployJava.testUsingActiveX('1.4.2')) {
list[0] = '1.4.2';
} else if (deployJava.testForMSVM()) {
list[0] = '1.1';
}
} else if (browser == 'Netscape Family') {
deployJava.getJPIVersionUsingMimeType();
if (deployJava.firefoxJavaVersion != null) {
list[0] = deployJava.firefoxJavaVersion;
} else if (deployJava.testUsingMimeTypes('1.7')) {
list[0] = '1.7.0';
} else if (deployJava.testUsingMimeTypes('1.6')) {
list[0] = '1.6.0';
} else if (deployJava.testUsingMimeTypes('1.5')) {
list[0] = '1.5.0';
} else if (deployJava.testUsingMimeTypes('1.4.2')) {
list[0] = '1.4.2';
} else if (deployJava.browserName2 == 'Safari') {
if (deployJava.testUsingPluginsArray('1.7.0')) {
list[0] = '1.7.0';
} else if (deployJava.testUsingPluginsArray('1.6')) {
list[0] = '1.6.0';
} else if (deployJava.testUsingPluginsArray('1.5')) {
list[0] = '1.5.0';
} else if (deployJava.testUsingPluginsArray('1.4.2')) {
list[0] = '1.4.2';
}
}
}
}
if (deployJava.debug) {
for (var i = 0; i < list.length; ++i) {
alert('We claim to have detected Java SE ' + list[i]);
}
}
return list;
},
installJRE: function(requestVersion) {
var ret = false;
if (deployJava.isPluginInstalled()) {
if (deployJava.getPlugin().installJRE(requestVersion)) {
deployJava.refresh();
if (deployJava.returnPage != null) {
document.location = deployJava.returnPage;
}
return true;
} else {
return false;
}
} else {
return deployJava.installLatestJRE();
}
},
installLatestJRE: function() {
if (deployJava.isPluginInstalled()) {
if (deployJava.getPlugin().installLatestJRE()) {
deployJava.refresh();
if (deployJava.returnPage != null) {
document.location = deployJava.returnPage;
}
return true;
} else {
return false;
}
} else {
var browser = deployJava.getBrowser();
var platform = navigator.platform.toLowerCase();
if ((deployJava.EAInstallEnabled == 'true') && (platform.indexOf('win') != -1) && (deployJava.EarlyAccessURL != null)) {
deployJava.preInstallJREList = deployJava.getJREs();
if (deployJava.returnPage != null) {
deployJava.myInterval = setInterval("deployJava.poll()", 3000);
}
location.href = deployJava.EarlyAccessURL;
return false;
} else {
if (browser == 'MSIE') {
return deployJava.IEInstall();
} else if ((browser == 'Netscape Family') && (platform.indexOf('win32') != -1)) {
return deployJava.FFInstall();
} else {
location.href = deployJava.getJavaURL + ((deployJava.returnPage != null) ? ('&returnPage=' + deployJava.returnPage) : '') + ((deployJava.locale != null) ? ('&locale=' + deployJava.locale) : '') + ((deployJava.brand != null) ? ('&brand=' + deployJava.brand) : '');
}
return false;
}
}
},
runApplet: function(attributes, parameters, minimumVersion) {
if (minimumVersion == 'undefined' || minimumVersion == null) {
minimumVersion = '1.1';
}
var regex = "^(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)(?:_(\\d+))?)?)?$";
var matchData = minimumVersion.match(regex);
if (deployJava.returnPage == null) {
deployJava.returnPage = document.location;
}
if (matchData != null) {
var browser = deployJava.getBrowser();
if ((browser != '?') && ('Safari' != deployJava.browserName2)) {
if (deployJava.versionCheck(minimumVersion + '+')) {
deployJava.writeAppletTag(attributes, parameters);
} else if (deployJava.installJRE(minimumVersion + '+')) {
deployJava.refresh();
location.href = document.location;
deployJava.writeAppletTag(attributes, parameters);
}
} else {
deployJava.writeAppletTag(attributes, parameters);
}
} else {
if (deployJava.debug) {
alert('Invalid minimumVersion argument to runApplet():' + minimumVersion);
}
}
},
writeAppletTag: function(attributes, parameters) {
var s = '<' + 'applet ';
var codeAttribute = false;
for (var attribute in attributes) {
s += (' ' + attribute + '="' + attributes[attribute] + '"');
if (attribute == 'code') {
codeAttribute = true;
}
}
if (!codeAttribute) {
s += (' code="dummy"');
}
s += '>';
document.write(s);
if (parameters != 'undefined' && parameters != null) {
var codebaseParam = false;
for (var parameter in parameters) {
if (parameter == 'codebase_lookup') {
codebaseParam = true;
}
s = '<param name="' + parameter + '" value="' + parameters[parameter] + '">';
document.write(s);
}
if (!codebaseParam) {
document.write('<param name="codebase_lookup" value="false">');
}
}
document.write('<' + '/' + 'applet' + '>');
},
versionCheck: function(versionPattern) {
var index = 0;
var regex = "^(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)(?:_(\\d+))?)?)?(\\*|\\+)?$";
var matchData = versionPattern.match(regex);
if (matchData != null) {
var familyMatch = true;
var patternArray = new Array();
for (var i = 1; i < matchData.length; ++i) {
if ((typeof matchData[i] == 'string') && (matchData[i] != '')) {
patternArray[index] = matchData[i];
index++;
}
}
if (patternArray[patternArray.length - 1] == '+') {
familyMatch = false;
patternArray.length--;
} else {
if (patternArray[patternArray.length - 1] == '*') {
patternArray.length--;
}
}
var list = deployJava.getJREs();
for (var i = 0; i < list.length; ++i) {
if (deployJava.compareVersionToPattern(list[i], patternArray, familyMatch)) {
return true;
}
}
return false;
} else {
alert('Invalid versionPattern passed to versionCheck: ' + versionPattern);
return false;
}
},
isWebStartInstalled: function(minimumVersion) {
var browser = deployJava.getBrowser();
if ((browser == '?') || ('Safari' == deployJava.browserName2)) {
return true;
}
if (minimumVersion == 'undefined' || minimumVersion == null) {
minimumVersion = '1.4.2';
}
var retval = false;
var regex = "^(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)(?:_(\\d+))?)?)?$";
var matchData = minimumVersion.match(regex);
if (matchData != null) {
retval = deployJava.versionCheck(minimumVersion + '+');
} else {
if (deployJava.debug) {
alert('Invalid minimumVersion argument to isWebStartInstalled(): ' + minimumVersion);
}
retval = deployJava.versionCheck('1.4.2+');
}
return retval;
},
getJPIVersionUsingMimeType: function() {
for (var i = 0; i < navigator.mimeTypes.length; ++i) {
var s = navigator.mimeTypes[i].type;
var m = s.match(/^application\/x-java-applet;jpi-version=(.*)$/);
if (m != null) {
deployJava.firefoxJavaVersion = m[1];
if ('Opera' != deployJava.browserName2) {
break;
}
}
}
},
launchWebStartApplication: function(jnlp) {
return false;
},
createWebStartLaunchButtonEx: function(jnlp, minimumVersion) {
if (deployJava.returnPage == null) {
deployJava.returnPage = jnlp;
}
var url = 'javascript:deployJava.launchWebStartApplication(\'' + jnlp + '\');';
document.write('<' + 'a href="' + url + '" onMouseOver="window.status=\'\'; ' + 'return true;"><' + 'img ' + 'src="' + deployJava.launchButtonPNG + '" ' + 'border="0" /><' + '/' + 'a' + '>');
},
createWebStartLaunchButton: function(jnlp, minimumVersion) {
if (deployJava.returnPage == null) {
deployJava.returnPage = jnlp;
}
var url = 'javascript:' + 'if (!deployJava.isWebStartInstalled(&quot;' + minimumVersion + '&quot;)) {' + 'if (deployJava.installLatestJRE()) {' + 'if (deployJava.launch(&quot;' + jnlp + '&quot;)) {}' + '}' + '} else {' + 'if (deployJava.launch(&quot;' + jnlp + '&quot;)) {}' + '}';
document.write('<' + 'a href="' + url + '" onMouseOver="window.status=\'\'; ' + 'return true;"><' + 'img ' + 'src="' + deployJava.launchButtonPNG + '" ' + 'border="0" /><' + '/' + 'a' + '>');
},
launch: function(jnlp) {
document.location = jnlp;
return true;
},
isPluginInstalled: function() {
var plugin = deployJava.getPlugin();
if (plugin && plugin.jvms) {
return true;
} else {
return false;
}
},
isAutoUpdateEnabled: function() {
if (deployJava.isPluginInstalled()) {
return deployJava.getPlugin().isAutoUpdateEnabled();
}
return false;
},
setAutoUpdateEnabled: function() {
if (deployJava.isPluginInstalled()) {
return deployJava.getPlugin().setAutoUpdateEnabled();
}
return false;
},
setInstallerType: function(type) {
deployJava.installType = type;
if (deployJava.isPluginInstalled()) {
return deployJava.getPlugin().setInstallerType(type);
}
return false;
},
setAdditionalPackages: function(packageList) {
if (deployJava.isPluginInstalled()) {
return deployJava.getPlugin().setAdditionalPackages(packageList);
}
return false;
},
setEarlyAccess: function(enabled) {
deployJava.EAInstallEnabled = enabled;
},
isPlugin2: function() {
if (deployJava.isPluginInstalled()) {
if (deployJava.versionCheck('1.6.0_10+')) {
try {
return deployJava.getPlugin().isPlugin2();
} catch (err) {}
}
}
return false;
},
allowPlugin: function() {
deployJava.getBrowser();
var ret = ('Safari' != deployJava.browserName2 && 'Opera' != deployJava.browserName2);
return ret;
},
getPlugin: function() {
deployJava.refresh();
var ret = null;
if (deployJava.allowPlugin()) {
ret = document.getElementById('deployJavaPlugin');
}
return ret;
},
compareVersionToPattern: function(version, patternArray, familyMatch) {
var regex = "^(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)(?:_(\\d+))?)?)?$";
var matchData = version.match(regex);
if (matchData != null) {
var index = 0;
var result = new Array();
for (var i = 1; i < matchData.length; ++i) {
if ((typeof matchData[i] == 'string') && (matchData[i] != '')) {
result[index] = matchData[i];
index++;
}
}
var l = Math.min(result.length, patternArray.length);
if (familyMatch) {
for (var i = 0; i < l; ++i) {
if (result[i] != patternArray[i]) return false;
}
return true;
} else {
for (var i = 0; i < l; ++i) {
if (result[i] < patternArray[i]) {
return false;
} else if (result[i] > patternArray[i]) {
return true;
}
}
return true;
}
} else {
return false;
}
},
getBrowser: function() {
if (deployJava.browserName == null) {
var browser = navigator.userAgent.toLowerCase();
if (deployJava.debug) {
alert('userAgent -> ' + browser);
}
if (browser.indexOf('msie') != -1) {
deployJava.browserName = 'MSIE';
deployJava.browserName2 = 'MSIE';
} else if (browser.indexOf('firefox') != -1) {
deployJava.browserName = 'Netscape Family';
deployJava.browserName2 = 'Firefox';
} else if (browser.indexOf('chrome') != -1) {
deployJava.browserName = 'Netscape Family';
deployJava.browserName2 = 'Chrome';
} else if (browser.indexOf('safari') != -1) {
deployJava.browserName = 'Netscape Family';
deployJava.browserName2 = 'Safari';
} else if (browser.indexOf('mozilla') != -1) {
deployJava.browserName = 'Netscape Family';
deployJava.browserName2 = 'Other';
} else if (browser.indexOf('opera') != -1) {
deployJava.browserName = 'Netscape Family';
deployJava.browserName2 = 'Opera';
} else {
deployJava.browserName = '?';
deployJava.browserName2 = 'unknown';
}
if (deployJava.debug) {
alert('Detected browser name:' + deployJava.browserName + ', ' + deployJava.browserName2);
}
}
return deployJava.browserName;
},
testUsingActiveX: function(version) {
var objectName = 'JavaWebStart.isInstalled.' + version + '.0';
if (!ActiveXObject) {
if (deployJava.debug) {
alert('Browser claims to be IE, but no ActiveXObject object?');
}
return false;
}
try {
return (new ActiveXObject(objectName) != null);
} catch (exception) {
return false;
}
},
testForMSVM: function() {
var clsid = '{08B0E5C0-4FCB-11CF-AAA5-00401C608500}';
if (typeof oClientCaps != 'undefined') {
var v = oClientCaps.getComponentVersion(clsid, "ComponentID");
if ((v == '') || (v == '5,0,5000,0')) {
return false;
} else {
return true;
}
} else {
return false;
}
},
testUsingMimeTypes: function(version) {
if (!navigator.mimeTypes) {
if (deployJava.debug) {
alert('Browser claims to be Netscape family, but no mimeTypes[] array?');
}
return false;
}
for (var i = 0; i < navigator.mimeTypes.length; ++i) {
s = navigator.mimeTypes[i].type;
var m = s.match(/^application\/x-java-applet\x3Bversion=(1\.8|1\.7|1\.6|1\.5|1\.4\.2)$/);
if (m != null) {
if (deployJava.compareVersions(m[1], version)) {
return true;
}
}
}
return false;
},
testUsingPluginsArray: function(version) {
if ((!navigator.plugins) || (!navigator.plugins.length)) {
return false;
}
var platform = navigator.platform.toLowerCase();
for (var i = 0; i < navigator.plugins.length; ++i) {
s = navigator.plugins[i].description;
if (s.search(/^Java Switchable Plug-in (Cocoa)/) != -1) {
if (deployJava.compareVersions("1.5.0", version)) {
return true;
}
} else if (s.search(/^Java/) != -1) {
if (platform.indexOf('win') != -1) {
if (deployJava.compareVersions("1.5.0", version) || deployJava.compareVersions("1.6.0", version)) {
return true;
}
}
}
}
if (deployJava.compareVersions("1.5.0", version)) {
return true;
}
return false;
},
IEInstall: function() {
location.href = deployJava.getJavaURL + ((deployJava.returnPage != null) ? ('&returnPage=' + deployJava.returnPage) : '') + ((deployJava.locale != null) ? ('&locale=' + deployJava.locale) : '') + ((deployJava.brand != null) ? ('&brand=' + deployJava.brand) : '') + ((deployJava.installType != null) ? ('&type=' + deployJava.installType) : '');
return false;
},
done: function(name, result) {},
FFInstall: function() {
location.href = deployJava.getJavaURL + ((deployJava.returnPage != null) ? ('&returnPage=' + deployJava.returnPage) : '') + ((deployJava.locale != null) ? ('&locale=' + deployJava.locale) : '') + ((deployJava.brand != null) ? ('&brand=' + deployJava.brand) : '') + ((deployJava.installType != null) ? ('&type=' + deployJava.installType) : '');
return false;
},
compareVersions: function(installed, required) {
var a = installed.split('.');
var b = required.split('.');
for (var i = 0; i < a.length; ++i) {
a[i] = Number(a[i]);
}
for (var i = 0; i < b.length; ++i) {
b[i] = Number(b[i]);
}
if (a.length == 2) {
a[2] = 0;
}
if (a[0] > b[0]) return true;
if (a[0] < b[0]) return false;
if (a[1] > b[1]) return true;
if (a[1] < b[1]) return false;
if (a[2] > b[2]) return true;
if (a[2] < b[2]) return false;
return true;
},
enableAlerts: function() {
deployJava.browserName = null;
deployJava.debug = true;
},
poll: function() {
deployJava.refresh();
var postInstallJREList = deployJava.getJREs();
if ((deployJava.preInstallJREList.length == 0) && (postInstallJREList.length != 0)) {
clearInterval(deployJava.myInterval);
if (deployJava.returnPage != null) {
location.href = deployJava.returnPage;
};
}
if ((deployJava.preInstallJREList.length != 0) && (postInstallJREList.length != 0) && (deployJava.preInstallJREList[0] != postInstallJREList[0])) {
clearInterval(deployJava.myInterval);
if (deployJava.returnPage != null) {
location.href = deployJava.returnPage;
}
}
},
writePluginTag: function() {
var browser = deployJava.getBrowser();
if (browser == 'MSIE') {
document.write('<' + 'object classid="clsid:CAFEEFAC-DEC7-0000-0000-ABCDEFFEDCBA" ' + 'id="deployJavaPlugin" width="0" height="0">' + '<' + '/' + 'object' + '>');
} else if (browser == 'Netscape Family' && deployJava.allowPlugin()) {
deployJava.writeEmbedTag();
}
},
refresh: function() {
navigator.plugins.refresh(false);
var browser = deployJava.getBrowser();
if (browser == 'Netscape Family' && deployJava.allowPlugin()) {
var plugin = document.getElementById('deployJavaPlugin');
if (plugin == null) {
deployJava.writeEmbedTag();
}
}
},
writeEmbedTag: function() {
var written = false;
if (navigator.mimeTypes != null) {
for (var i = 0; i < navigator.mimeTypes.length; i++) {
if (navigator.mimeTypes[i].type == deployJava.mimeType) {
if (navigator.mimeTypes[i].enabledPlugin) {
document.write('<' + 'embed id="deployJavaPlugin" type="' + deployJava.mimeType + '" hidden="true" />');
written = true;
}
}
}
if (!written) for (var i = 0; i < navigator.mimeTypes.length; i++) {
if (navigator.mimeTypes[i].type == deployJava.oldMimeType) {
if (navigator.mimeTypes[i].enabledPlugin) {
document.write('<' + 'embed id="deployJavaPlugin" type="' + deployJava.oldMimeType + '" hidden="true" />');
}
}
}
}
},
do_initialize: function() {
deployJava.writePluginTag();
if (deployJava.locale == null) {
var loc = null;
if (loc == null) try {
loc = navigator.userLanguage;
} catch (err) {}
if (loc == null) try {
loc = navigator.systemLanguage;
} catch (err) {}
if (loc == null) try {
loc = navigator.language;
} catch (err) {}
if (loc != null) {
loc.replace("-", "_")
deployJava.locale = loc;
}
}
}
};
deployJava.do_initialize();

View File

@ -1,55 +0,0 @@
var registerListeners = function() {
console.log("Listening for events.");
BBBCheck.listen("MicCheckAppReadyEvent", function() {
console.log("Received [MicCheckAppReadyEvent].");
});
BBBCheck.listen("NewRoleEvent", function(bbbCheckEvent) {
console.log("New Role Event [amIPresenter=" + bbbCheckEvent.amIPresenter + ",role=" + bbbCheckEvent.role + ",newPresenterUserID=" + bbbCheckEvent.newPresenterUserID + "].");
});
}
var bbbCheckFlashVersion = function() {
var playerVersion = BBBCheck.getFlashPlayerVersion();
console.log("You have Flash player " + playerVersion.major + "." + playerVersion.minor + "." + playerVersion.release + " installed");
}
var bbbHasMinFlashVersion = function(version) {
console.log("Q: Do I have Flash player 9.0.18 or higher installed?\nA: " + BBBCheck.hasMinFlashPlayerVersion(version));
}
var bbbGetBrowser = function() {
console.log("Browser = " + BBBCheck.getBrowser());
}
var bbbGetJREs = function() {
console.log("JREs = " + BBBCheck.getJREs());
}
var bbbCheckShowMicSettings = function() {
BBBCheck.showMicSettings();
}
var bbbCheckStartTestMic = function() {
BBBCheck.startTestMicrophone();
}
var bbbCheckStopTestMic = function() {
BBBCheck.stopTestMicrophone();
}
var bbbCheckShowCamSettings = function() {
BBBCheck.showCamSettings();
}
var bbbCheckTestRTMPConnection = function(host, app) {
BBBCheck.testRTMPConnection(host, app);
}
var bbbCheckTestSocketConnection = function(host, port) {
BBBCheck.testSocketConnection(host, port);
}
var bbbCheckSetSocketPolicyFileURL = function(url) {
BBBCheck.setSocketPolicyFileURL(url);
}

View File

@ -1,39 +0,0 @@
// Backbone.js 0.9.2
// (c) 2010-2012 Jeremy Ashkenas, DocumentCloud Inc.
// Backbone may be freely distributed under the MIT license.
// For all details and documentation:
// http://backbonejs.org
(function(h,g){typeof exports!=="undefined"?g(h,exports,require("underscore")):typeof define==="function"&&define.amd?define(["underscore","jquery","exports"],function(f,i,p){h.Backbone=g(h,p,f,i)}):h.Backbone=g(h,{},h._,h.jQuery||h.Zepto||h.ender)})(this,function(h,g,f,i){var p=h.Backbone,y=Array.prototype.slice,z=Array.prototype.splice;g.VERSION="0.9.2";g.setDomLibrary=function(a){i=a};g.noConflict=function(){h.Backbone=p;return g};g.emulateHTTP=false;g.emulateJSON=false;var q=/\s+/,l=g.Events=
{on:function(a,b,c){var d,e,f,g,j;if(!b)return this;a=a.split(q);for(d=this._callbacks||(this._callbacks={});e=a.shift();)f=(j=d[e])?j.tail:{},f.next=g={},f.context=c,f.callback=b,d[e]={tail:g,next:j?j.next:f};return this},off:function(a,b,c){var d,e,k,g,j,h;if(e=this._callbacks){if(!a&&!b&&!c)return delete this._callbacks,this;for(a=a?a.split(q):f.keys(e);d=a.shift();)if(k=e[d],delete e[d],k&&(b||c))for(g=k.tail;(k=k.next)!==g;)if(j=k.callback,h=k.context,b&&j!==b||c&&h!==c)this.on(d,j,h);return this}},
trigger:function(a){var b,c,d,e,f,g;if(!(d=this._callbacks))return this;f=d.all;a=a.split(q);for(g=y.call(arguments,1);b=a.shift();){if(c=d[b])for(e=c.tail;(c=c.next)!==e;)c.callback.apply(c.context||this,g);if(c=f){e=c.tail;for(b=[b].concat(g);(c=c.next)!==e;)c.callback.apply(c.context||this,b)}}return this}};l.bind=l.on;l.unbind=l.off;var o=g.Model=function(a,b){var c;a||(a={});b&&b.parse&&(a=this.parse(a));if(c=n(this,"defaults"))a=f.extend({},c,a);if(b&&b.collection)this.collection=b.collection;
this.attributes={};this._escapedAttributes={};this.cid=f.uniqueId("c");this.changed={};this._silent={};this._pending={};this.set(a,{silent:true});this.changed={};this._silent={};this._pending={};this._previousAttributes=f.clone(this.attributes);this.initialize.apply(this,arguments)};f.extend(o.prototype,l,{changed:null,_silent:null,_pending:null,idAttribute:"id",initialize:function(){},toJSON:function(){return f.clone(this.attributes)},get:function(a){return this.attributes[a]},escape:function(a){var b;
if(b=this._escapedAttributes[a])return b;b=this.get(a);return this._escapedAttributes[a]=f.escape(b==null?"":""+b)},has:function(a){return this.get(a)!=null},set:function(a,b,c){var d,e;f.isObject(a)||a==null?(d=a,c=b):(d={},d[a]=b);c||(c={});if(!d)return this;if(d instanceof o)d=d.attributes;if(c.unset)for(e in d)d[e]=void 0;if(!this._validate(d,c))return false;if(this.idAttribute in d)this.id=d[this.idAttribute];var b=c.changes={},g=this.attributes,h=this._escapedAttributes,j=this._previousAttributes||
{};for(e in d){a=d[e];if(!f.isEqual(g[e],a)||c.unset&&f.has(g,e))delete h[e],(c.silent?this._silent:b)[e]=true;c.unset?delete g[e]:g[e]=a;!f.isEqual(j[e],a)||f.has(g,e)!=f.has(j,e)?(this.changed[e]=a,c.silent||(this._pending[e]=true)):(delete this.changed[e],delete this._pending[e])}c.silent||this.change(c);return this},unset:function(a,b){(b||(b={})).unset=true;return this.set(a,null,b)},clear:function(a){(a||(a={})).unset=true;return this.set(f.clone(this.attributes),a)},fetch:function(a){var a=
a?f.clone(a):{},b=this,c=a.success;a.success=function(d,e,f){if(!b.set(b.parse(d,f),a))return false;c&&c(b,d)};a.error=g.wrapError(a.error,b,a);return(this.sync||g.sync).call(this,"read",this,a)},save:function(a,b,c){var d,e;f.isObject(a)||a==null?(d=a,c=b):(d={},d[a]=b);c=c?f.clone(c):{};if(c.wait){if(!this._validate(d,c))return false;e=f.clone(this.attributes)}a=f.extend({},c,{silent:true});if(d&&!this.set(d,c.wait?a:c))return false;var k=this,h=c.success;c.success=function(a,b,e){b=k.parse(a,e);
c.wait&&(delete c.wait,b=f.extend(d||{},b));if(!k.set(b,c))return false;h?h(k,a):k.trigger("sync",k,a,c)};c.error=g.wrapError(c.error,k,c);b=this.isNew()?"create":"update";b=(this.sync||g.sync).call(this,b,this,c);c.wait&&this.set(e,a);return b},destroy:function(a){var a=a?f.clone(a):{},b=this,c=a.success,d=function(){b.trigger("destroy",b,b.collection,a)};if(this.isNew())return d(),false;a.success=function(e){a.wait&&d();c?c(b,e):b.trigger("sync",b,e,a)};a.error=g.wrapError(a.error,b,a);var e=(this.sync||
g.sync).call(this,"delete",this,a);a.wait||d();return e},url:function(){var a=n(this,"urlRoot")||n(this.collection,"url")||t();return this.isNew()?a:a+(a.charAt(a.length-1)=="/"?"":"/")+encodeURIComponent(this.id)},parse:function(a){return a},clone:function(){return new this.constructor(this.attributes)},isNew:function(){return this.id==null},change:function(a){a||(a={});var b=this._changing;this._changing=true;for(var c in this._silent)this._pending[c]=true;var d=f.extend({},a.changes,this._silent);
this._silent={};for(c in d)this.trigger("change:"+c,this,this.get(c),a);if(b)return this;for(;!f.isEmpty(this._pending);){this._pending={};this.trigger("change",this,a);for(c in this.changed)!this._pending[c]&&!this._silent[c]&&delete this.changed[c];this._previousAttributes=f.clone(this.attributes)}this._changing=false;return this},hasChanged:function(a){return!arguments.length?!f.isEmpty(this.changed):f.has(this.changed,a)},changedAttributes:function(a){if(!a)return this.hasChanged()?f.clone(this.changed):
false;var b,c=false,d=this._previousAttributes,e;for(e in a)if(!f.isEqual(d[e],b=a[e]))(c||(c={}))[e]=b;return c},previous:function(a){return!arguments.length||!this._previousAttributes?null:this._previousAttributes[a]},previousAttributes:function(){return f.clone(this._previousAttributes)},isValid:function(){return!this.validate(this.attributes)},_validate:function(a,b){if(b.silent||!this.validate)return true;var a=f.extend({},this.attributes,a),c=this.validate(a,b);if(!c)return true;b&&b.error?
b.error(this,c,b):this.trigger("error",this,c,b);return false}});var r=g.Collection=function(a,b){b||(b={});if(b.model)this.model=b.model;if(b.comparator)this.comparator=b.comparator;this._reset();this.initialize.apply(this,arguments);a&&this.reset(a,{silent:true,parse:b.parse})};f.extend(r.prototype,l,{model:o,initialize:function(){},toJSON:function(a){return this.map(function(b){return b.toJSON(a)})},add:function(a,b){var c,d,e,g,h,j={},i={},l=[];b||(b={});a=f.isArray(a)?a.slice():[a];for(c=0,d=
a.length;c<d;c++){if(!(e=a[c]=this._prepareModel(a[c],b)))throw Error("Can't add an invalid model to a collection");g=e.cid;h=e.id;j[g]||this._byCid[g]||h!=null&&(i[h]||this._byId[h])?l.push(c):j[g]=i[h]=e}for(c=l.length;c--;)a.splice(l[c],1);for(c=0,d=a.length;c<d;c++)(e=a[c]).on("all",this._onModelEvent,this),this._byCid[e.cid]=e,e.id!=null&&(this._byId[e.id]=e);this.length+=d;z.apply(this.models,[b.at!=null?b.at:this.models.length,0].concat(a));this.comparator&&this.sort({silent:true});if(b.silent)return this;
for(c=0,d=this.models.length;c<d;c++)if(j[(e=this.models[c]).cid])b.index=c,e.trigger("add",e,this,b);return this},remove:function(a,b){var c,d,e,g;b||(b={});a=f.isArray(a)?a.slice():[a];for(c=0,d=a.length;c<d;c++)if(g=this.getByCid(a[c])||this.get(a[c])){delete this._byId[g.id];delete this._byCid[g.cid];e=this.indexOf(g);this.models.splice(e,1);this.length--;if(!b.silent)b.index=e,g.trigger("remove",g,this,b);this._removeReference(g)}return this},push:function(a,b){a=this._prepareModel(a,b);this.add(a,
b);return a},pop:function(a){var b=this.at(this.length-1);this.remove(b,a);return b},unshift:function(a,b){a=this._prepareModel(a,b);this.add(a,f.extend({at:0},b));return a},shift:function(a){var b=this.at(0);this.remove(b,a);return b},get:function(a){return a==null?void 0:this._byId[a.id!=null?a.id:a]},getByCid:function(a){return a&&this._byCid[a.cid||a]},at:function(a){return this.models[a]},where:function(a){return f.isEmpty(a)?[]:this.filter(function(b){for(var c in a)if(a[c]!==b.get(c))return false;
return true})},sort:function(a){a||(a={});if(!this.comparator)throw Error("Cannot sort a set without a comparator");var b=f.bind(this.comparator,this);this.comparator.length==1?this.models=this.sortBy(b):this.models.sort(b);a.silent||this.trigger("reset",this,a);return this},pluck:function(a){return f.map(this.models,function(b){return b.get(a)})},reset:function(a,b){a||(a=[]);b||(b={});for(var c=0,d=this.models.length;c<d;c++)this._removeReference(this.models[c]);this._reset();this.add(a,f.extend({silent:true},
b));b.silent||this.trigger("reset",this,b);return this},fetch:function(a){a=a?f.clone(a):{};if(a.parse===void 0)a.parse=true;var b=this,c=a.success;a.success=function(d,e,f){b[a.add?"add":"reset"](b.parse(d,f),a);c&&c(b,d)};a.error=g.wrapError(a.error,b,a);return(this.sync||g.sync).call(this,"read",this,a)},create:function(a,b){var c=this,b=b?f.clone(b):{},a=this._prepareModel(a,b);if(!a)return false;b.wait||c.add(a,b);var d=b.success;b.success=function(e,f){b.wait&&c.add(e,b);d?d(e,f):e.trigger("sync",
a,f,b)};a.save(null,b);return a},parse:function(a){return a},chain:function(){return f(this.models).chain()},_reset:function(){this.length=0;this.models=[];this._byId={};this._byCid={}},_prepareModel:function(a,b){b||(b={});if(a instanceof o){if(!a.collection)a.collection=this}else{var c;b.collection=this;a=new this.model(a,b);a._validate(a.attributes,b)||(a=false)}return a},_removeReference:function(a){this==a.collection&&delete a.collection;a.off("all",this._onModelEvent,this)},_onModelEvent:function(a,
b,c,d){(a=="add"||a=="remove")&&c!=this||(a=="destroy"&&this.remove(b,d),b&&a==="change:"+b.idAttribute&&(delete this._byId[b.previous(b.idAttribute)],this._byId[b.id]=b),this.trigger.apply(this,arguments))}});f.each("forEach,each,map,reduce,reduceRight,find,detect,filter,select,reject,every,all,some,any,include,contains,invoke,max,min,sortBy,sortedIndex,toArray,size,first,initial,rest,last,without,indexOf,shuffle,lastIndexOf,isEmpty,groupBy".split(","),function(a){r.prototype[a]=function(){return f[a].apply(f,
[this.models].concat(f.toArray(arguments)))}});var u=g.Router=function(a){a||(a={});if(a.routes)this.routes=a.routes;this._bindRoutes();this.initialize.apply(this,arguments)},A=/:\w+/g,B=/\*\w+/g,C=/[-[\]{}()+?.,\\^$|#\s]/g;f.extend(u.prototype,l,{initialize:function(){},route:function(a,b,c){g.history||(g.history=new m);f.isRegExp(a)||(a=this._routeToRegExp(a));c||(c=this[b]);g.history.route(a,f.bind(function(d){d=this._extractParameters(a,d);c&&c.apply(this,d);this.trigger.apply(this,["route:"+
b].concat(d));g.history.trigger("route",this,b,d)},this));return this},navigate:function(a,b){g.history.navigate(a,b)},_bindRoutes:function(){if(this.routes){var a=[],b;for(b in this.routes)a.unshift([b,this.routes[b]]);b=0;for(var c=a.length;b<c;b++)this.route(a[b][0],a[b][1],this[a[b][1]])}},_routeToRegExp:function(a){a=a.replace(C,"\\$&").replace(A,"([^/]+)").replace(B,"(.*?)");return RegExp("^"+a+"$")},_extractParameters:function(a,b){return a.exec(b).slice(1)}});var m=g.History=function(){this.handlers=
[];f.bindAll(this,"checkUrl")},s=/^[#\/]/,D=/msie [\w.]+/;m.started=false;f.extend(m.prototype,l,{interval:50,getHash:function(a){return(a=(a?a.location:window.location).href.match(/#(.*)$/))?a[1]:""},getFragment:function(a,b){if(a==null)if(this._hasPushState||b){var a=window.location.pathname,c=window.location.search;c&&(a+=c)}else a=this.getHash();a.indexOf(this.options.root)||(a=a.substr(this.options.root.length));return a.replace(s,"")},start:function(a){if(m.started)throw Error("Backbone.history has already been started");
m.started=true;this.options=f.extend({},{root:"/"},this.options,a);this._wantsHashChange=this.options.hashChange!==false;this._wantsPushState=!!this.options.pushState;this._hasPushState=!(!this.options.pushState||!window.history||!window.history.pushState);var a=this.getFragment(),b=document.documentMode;if(b=D.exec(navigator.userAgent.toLowerCase())&&(!b||b<=7))this.iframe=i('<iframe src="javascript:0" tabindex="-1" />').hide().appendTo("body")[0].contentWindow,this.navigate(a);if(this._hasPushState)i(window).bind("popstate",
this.checkUrl);else if(this._wantsHashChange&&"onhashchange"in window&&!b)i(window).bind("hashchange",this.checkUrl);else if(this._wantsHashChange)this._checkUrlInterval=setInterval(this.checkUrl,this.interval);this.fragment=a;a=window.location;b=a.pathname==this.options.root;if(this._wantsHashChange&&this._wantsPushState&&!this._hasPushState&&!b)return this.fragment=this.getFragment(null,true),window.location.replace(this.options.root+"#"+this.fragment),true;else if(this._wantsPushState&&this._hasPushState&&
b&&a.hash)this.fragment=this.getHash().replace(s,""),window.history.replaceState({},document.title,a.protocol+"//"+a.host+this.options.root+this.fragment);if(!this.options.silent)return this.loadUrl()},stop:function(){i(window).unbind("popstate",this.checkUrl).unbind("hashchange",this.checkUrl);clearInterval(this._checkUrlInterval);m.started=false},route:function(a,b){this.handlers.unshift({route:a,callback:b})},checkUrl:function(){var a=this.getFragment();a==this.fragment&&this.iframe&&(a=this.getFragment(this.getHash(this.iframe)));
if(a==this.fragment)return false;this.iframe&&this.navigate(a);this.loadUrl()||this.loadUrl(this.getHash())},loadUrl:function(a){var b=this.fragment=this.getFragment(a);return f.any(this.handlers,function(a){if(a.route.test(b))return a.callback(b),true})},navigate:function(a,b){if(!m.started)return false;if(!b||b===true)b={trigger:b};var c=(a||"").replace(s,"");if(this.fragment!=c)this._hasPushState?(c.indexOf(this.options.root)!=0&&(c=this.options.root+c),this.fragment=c,window.history[b.replace?
"replaceState":"pushState"]({},document.title,c)):this._wantsHashChange?(this.fragment=c,this._updateHash(window.location,c,b.replace),this.iframe&&c!=this.getFragment(this.getHash(this.iframe))&&(b.replace||this.iframe.document.open().close(),this._updateHash(this.iframe.location,c,b.replace))):window.location.assign(this.options.root+a),b.trigger&&this.loadUrl(a)},_updateHash:function(a,b,c){c?a.replace(a.toString().replace(/(javascript:|#).*$/,"")+"#"+b):a.hash=b}});var v=g.View=function(a){this.cid=
f.uniqueId("view");this._configure(a||{});this._ensureElement();this.initialize.apply(this,arguments);this.delegateEvents()},E=/^(\S+)\s*(.*)$/,w="model,collection,el,id,attributes,className,tagName".split(",");f.extend(v.prototype,l,{tagName:"div",$:function(a){return this.$el.find(a)},initialize:function(){},render:function(){return this},remove:function(){this.$el.remove();return this},make:function(a,b,c){a=document.createElement(a);b&&i(a).attr(b);c!=null&&i(a).html(c);return a},setElement:function(a,
b){this.$el&&this.undelegateEvents();this.$el=a instanceof i?a:i(a);this.el=this.$el[0];b!==false&&this.delegateEvents();return this},delegateEvents:function(a){if(a||(a=n(this,"events"))){this.undelegateEvents();for(var b in a){var c=a[b];f.isFunction(c)||(c=this[a[b]]);if(!c)throw Error('Method "'+a[b]+'" does not exist');var d=b.match(E),e=d[1],d=d[2],c=f.bind(c,this);e+=".delegateEvents"+this.cid;d===""?this.$el.bind(e,c):this.$el.delegate(d,e,c)}}},undelegateEvents:function(){this.$el.unbind(".delegateEvents"+
this.cid)},_configure:function(a){this.options&&(a=f.extend({},this.options,a));for(var b=0,c=w.length;b<c;b++){var d=w[b];a[d]&&(this[d]=a[d])}this.options=a},_ensureElement:function(){if(this.el)this.setElement(this.el,false);else{var a=n(this,"attributes")||{};if(this.id)a.id=this.id;if(this.className)a["class"]=this.className;this.setElement(this.make(this.tagName,a),false)}}});o.extend=r.extend=u.extend=v.extend=function(a,b){var c=F(this,a,b);c.extend=this.extend;return c};var G={create:"POST",
update:"PUT","delete":"DELETE",read:"GET"};g.sync=function(a,b,c){var d=G[a];c||(c={});var e={type:d,dataType:"json"};if(!c.url)e.url=n(b,"url")||t();if(!c.data&&b&&(a=="create"||a=="update"))e.contentType="application/json",e.data=JSON.stringify(b.toJSON());if(g.emulateJSON)e.contentType="application/x-www-form-urlencoded",e.data=e.data?{model:e.data}:{};if(g.emulateHTTP&&(d==="PUT"||d==="DELETE")){if(g.emulateJSON)e.data._method=d;e.type="POST";e.beforeSend=function(a){a.setRequestHeader("X-HTTP-Method-Override",
d)}}if(e.type!=="GET"&&!g.emulateJSON)e.processData=false;return i.ajax(f.extend(e,c))};g.wrapError=function(a,b,c){return function(d,e){e=d===b?e:d;a?a(b,e,c):b.trigger("error",b,e,c)}};var x=function(){},F=function(a,b,c){var d;d=b&&b.hasOwnProperty("constructor")?b.constructor:function(){a.apply(this,arguments)};f.extend(d,a);x.prototype=a.prototype;d.prototype=new x;b&&f.extend(d.prototype,b);c&&f.extend(d,c);d.prototype.constructor=d;d.__super__=a.prototype;return d},n=function(a,b){return!a||
!a[b]?null:f.isFunction(a[b])?a[b]():a[b]},t=function(){throw Error('A "url" property or function must be specified');};return g});

View File

@ -1,34 +0,0 @@
/*
RequireJS 2.1.1 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.
Available via the MIT or new BSD license.
see: http://github.com/jrburke/requirejs for details
*/
var requirejs,require,define;
(function(W){function D(b){return M.call(b)==="[object Function]"}function E(b){return M.call(b)==="[object Array]"}function t(b,c){if(b){var d;for(d=0;d<b.length;d+=1)if(b[d]&&c(b[d],d,b))break}}function N(b,c){if(b){var d;for(d=b.length-1;d>-1;d-=1)if(b[d]&&c(b[d],d,b))break}}function A(b,c){for(var d in b)if(b.hasOwnProperty(d)&&c(b[d],d))break}function O(b,c,d,g){c&&A(c,function(c,j){if(d||!F.call(b,j))g&&typeof c!=="string"?(b[j]||(b[j]={}),O(b[j],c,d,g)):b[j]=c});return b}function r(b,c){return function(){return c.apply(b,
arguments)}}function X(b){if(!b)return b;var c=W;t(b.split("."),function(b){c=c[b]});return c}function G(b,c,d,g){c=Error(c+"\nhttp://requirejs.org/docs/errors.html#"+b);c.requireType=b;c.requireModules=g;if(d)c.originalError=d;return c}function ba(){if(H&&H.readyState==="interactive")return H;N(document.getElementsByTagName("script"),function(b){if(b.readyState==="interactive")return H=b});return H}var g,s,u,y,q,B,H,I,Y,Z,ca=/(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg,da=/[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g,
$=/\.js$/,ea=/^\.\//;s=Object.prototype;var M=s.toString,F=s.hasOwnProperty,fa=Array.prototype.splice,v=!!(typeof window!=="undefined"&&navigator&&document),aa=!v&&typeof importScripts!=="undefined",ga=v&&navigator.platform==="PLAYSTATION 3"?/^complete$/:/^(complete|loaded)$/,R=typeof opera!=="undefined"&&opera.toString()==="[object Opera]",w={},n={},P=[],J=!1;if(typeof define==="undefined"){if(typeof requirejs!=="undefined"){if(D(requirejs))return;n=requirejs;requirejs=void 0}typeof require!=="undefined"&&
!D(require)&&(n=require,require=void 0);g=requirejs=function(b,c,d,p){var i,j="_";!E(b)&&typeof b!=="string"&&(i=b,E(c)?(b=c,c=d,d=p):b=[]);if(i&&i.context)j=i.context;(p=w[j])||(p=w[j]=g.s.newContext(j));i&&p.configure(i);return p.require(b,c,d)};g.config=function(b){return g(b)};g.nextTick=typeof setTimeout!=="undefined"?function(b){setTimeout(b,4)}:function(b){b()};require||(require=g);g.version="2.1.1";g.jsExtRegExp=/^\/|:|\?|\.js$/;g.isBrowser=v;s=g.s={contexts:w,newContext:function(b){function c(a,
f,x){var e,m,b,c,d,h,i,g=f&&f.split("/");e=g;var j=k.map,l=j&&j["*"];if(a&&a.charAt(0)===".")if(f){e=k.pkgs[f]?g=[f]:g.slice(0,g.length-1);f=a=e.concat(a.split("/"));for(e=0;f[e];e+=1)if(m=f[e],m===".")f.splice(e,1),e-=1;else if(m==="..")if(e===1&&(f[2]===".."||f[0]===".."))break;else e>0&&(f.splice(e-1,2),e-=2);e=k.pkgs[f=a[0]];a=a.join("/");e&&a===f+"/"+e.main&&(a=f)}else a.indexOf("./")===0&&(a=a.substring(2));if(x&&(g||l)&&j){f=a.split("/");for(e=f.length;e>0;e-=1){b=f.slice(0,e).join("/");if(g)for(m=
g.length;m>0;m-=1)if(x=j[g.slice(0,m).join("/")])if(x=x[b]){c=x;d=e;break}if(c)break;!h&&l&&l[b]&&(h=l[b],i=e)}!c&&h&&(c=h,d=i);c&&(f.splice(0,d,c),a=f.join("/"))}return a}function d(a){v&&t(document.getElementsByTagName("script"),function(f){if(f.getAttribute("data-requiremodule")===a&&f.getAttribute("data-requirecontext")===h.contextName)return f.parentNode.removeChild(f),!0})}function p(a){var f=k.paths[a];if(f&&E(f)&&f.length>1)return d(a),f.shift(),h.require.undef(a),h.require([a]),!0}function i(a){var f,
b=a?a.indexOf("!"):-1;b>-1&&(f=a.substring(0,b),a=a.substring(b+1,a.length));return[f,a]}function j(a,f,b,e){var m,K,d=null,g=f?f.name:null,j=a,l=!0,k="";a||(l=!1,a="_@r"+(M+=1));a=i(a);d=a[0];a=a[1];d&&(d=c(d,g,e),K=o[d]);a&&(d?k=K&&K.normalize?K.normalize(a,function(a){return c(a,g,e)}):c(a,g,e):(k=c(a,g,e),a=i(k),d=a[0],k=a[1],b=!0,m=h.nameToUrl(k)));b=d&&!K&&!b?"_unnormalized"+(N+=1):"";return{prefix:d,name:k,parentMap:f,unnormalized:!!b,url:m,originalName:j,isDefine:l,id:(d?d+"!"+k:k)+b}}function n(a){var f=
a.id,b=l[f];b||(b=l[f]=new h.Module(a));return b}function q(a,f,b){var e=a.id,m=l[e];if(F.call(o,e)&&(!m||m.defineEmitComplete))f==="defined"&&b(o[e]);else n(a).on(f,b)}function z(a,f){var b=a.requireModules,e=!1;if(f)f(a);else if(t(b,function(f){if(f=l[f])f.error=a,f.events.error&&(e=!0,f.emit("error",a))}),!e)g.onError(a)}function s(){P.length&&(fa.apply(C,[C.length-1,0].concat(P)),P=[])}function u(a,f,b){var e=a.map.id;a.error?a.emit("error",a.error):(f[e]=!0,t(a.depMaps,function(e,c){var d=e.id,
g=l[d];g&&!a.depMatched[c]&&!b[d]&&(f[d]?(a.defineDep(c,o[d]),a.check()):u(g,f,b))}),b[e]=!0)}function w(){var a,f,b,e,m=(b=k.waitSeconds*1E3)&&h.startTime+b<(new Date).getTime(),c=[],g=[],i=!1,j=!0;if(!S){S=!0;A(l,function(b){a=b.map;f=a.id;if(b.enabled&&(a.isDefine||g.push(b),!b.error))if(!b.inited&&m)p(f)?i=e=!0:(c.push(f),d(f));else if(!b.inited&&b.fetched&&a.isDefine&&(i=!0,!a.prefix))return j=!1});if(m&&c.length)return b=G("timeout","Load timeout for modules: "+c,null,c),b.contextName=h.contextName,
z(b);j&&t(g,function(a){u(a,{},{})});if((!m||e)&&i)if((v||aa)&&!T)T=setTimeout(function(){T=0;w()},50);S=!1}}function y(a){n(j(a[0],null,!0)).init(a[1],a[2])}function B(a){var a=a.currentTarget||a.srcElement,b=h.onScriptLoad;a.detachEvent&&!R?a.detachEvent("onreadystatechange",b):a.removeEventListener("load",b,!1);b=h.onScriptError;a.detachEvent&&!R||a.removeEventListener("error",b,!1);return{node:a,id:a&&a.getAttribute("data-requiremodule")}}function I(){var a;for(s();C.length;)if(a=C.shift(),a[0]===
null)return z(G("mismatch","Mismatched anonymous define() module: "+a[a.length-1]));else y(a)}var S,U,h,L,T,k={waitSeconds:7,baseUrl:"./",paths:{},pkgs:{},shim:{},map:{},config:{}},l={},V={},C=[],o={},Q={},M=1,N=1;L={require:function(a){return a.require?a.require:a.require=h.makeRequire(a.map)},exports:function(a){a.usingExports=!0;if(a.map.isDefine)return a.exports?a.exports:a.exports=o[a.map.id]={}},module:function(a){return a.module?a.module:a.module={id:a.map.id,uri:a.map.url,config:function(){return k.config&&
k.config[a.map.id]||{}},exports:o[a.map.id]}}};U=function(a){this.events=V[a.id]||{};this.map=a;this.shim=k.shim[a.id];this.depExports=[];this.depMaps=[];this.depMatched=[];this.pluginMaps={};this.depCount=0};U.prototype={init:function(a,b,c,e){e=e||{};if(!this.inited){this.factory=b;if(c)this.on("error",c);else this.events.error&&(c=r(this,function(a){this.emit("error",a)}));this.depMaps=a&&a.slice(0);this.errback=c;this.inited=!0;this.ignore=e.ignore;e.enabled||this.enabled?this.enable():this.check()}},
defineDep:function(a,b){this.depMatched[a]||(this.depMatched[a]=!0,this.depCount-=1,this.depExports[a]=b)},fetch:function(){if(!this.fetched){this.fetched=!0;h.startTime=(new Date).getTime();var a=this.map;if(this.shim)h.makeRequire(this.map,{enableBuildCallback:!0})(this.shim.deps||[],r(this,function(){return a.prefix?this.callPlugin():this.load()}));else return a.prefix?this.callPlugin():this.load()}},load:function(){var a=this.map.url;Q[a]||(Q[a]=!0,h.load(this.map.id,a))},check:function(){if(this.enabled&&
!this.enabling){var a,b,c=this.map.id;b=this.depExports;var e=this.exports,m=this.factory;if(this.inited)if(this.error)this.emit("error",this.error);else{if(!this.defining){this.defining=!0;if(this.depCount<1&&!this.defined){if(D(m)){if(this.events.error)try{e=h.execCb(c,m,b,e)}catch(d){a=d}else e=h.execCb(c,m,b,e);if(this.map.isDefine)if((b=this.module)&&b.exports!==void 0&&b.exports!==this.exports)e=b.exports;else if(e===void 0&&this.usingExports)e=this.exports;if(a)return a.requireMap=this.map,
a.requireModules=[this.map.id],a.requireType="define",z(this.error=a)}else e=m;this.exports=e;if(this.map.isDefine&&!this.ignore&&(o[c]=e,g.onResourceLoad))g.onResourceLoad(h,this.map,this.depMaps);delete l[c];this.defined=!0}this.defining=!1;if(this.defined&&!this.defineEmitted)this.defineEmitted=!0,this.emit("defined",this.exports),this.defineEmitComplete=!0}}else this.fetch()}},callPlugin:function(){var a=this.map,b=a.id,d=j(a.prefix);this.depMaps.push(d);q(d,"defined",r(this,function(e){var m,
d;d=this.map.name;var x=this.map.parentMap?this.map.parentMap.name:null,i=h.makeRequire(a.parentMap,{enableBuildCallback:!0,skipMap:!0});if(this.map.unnormalized){if(e.normalize&&(d=e.normalize(d,function(a){return c(a,x,!0)})||""),e=j(a.prefix+"!"+d,this.map.parentMap),q(e,"defined",r(this,function(a){this.init([],function(){return a},null,{enabled:!0,ignore:!0})})),d=l[e.id]){this.depMaps.push(e);if(this.events.error)d.on("error",r(this,function(a){this.emit("error",a)}));d.enable()}}else m=r(this,
function(a){this.init([],function(){return a},null,{enabled:!0})}),m.error=r(this,function(a){this.inited=!0;this.error=a;a.requireModules=[b];A(l,function(a){a.map.id.indexOf(b+"_unnormalized")===0&&delete l[a.map.id]});z(a)}),m.fromText=r(this,function(b,e){var f=a.name,c=j(f),d=J;e&&(b=e);d&&(J=!1);n(c);try{g.exec(b)}catch(x){throw Error("fromText eval for "+f+" failed: "+x);}d&&(J=!0);this.depMaps.push(c);h.completeLoad(f);i([f],m)}),e.load(a.name,i,m,k)}));h.enable(d,this);this.pluginMaps[d.id]=
d},enable:function(){this.enabling=this.enabled=!0;t(this.depMaps,r(this,function(a,b){var c,e;if(typeof a==="string"){a=j(a,this.map.isDefine?this.map:this.map.parentMap,!1,!this.skipMap);this.depMaps[b]=a;if(c=L[a.id]){this.depExports[b]=c(this);return}this.depCount+=1;q(a,"defined",r(this,function(a){this.defineDep(b,a);this.check()}));this.errback&&q(a,"error",this.errback)}c=a.id;e=l[c];!L[c]&&e&&!e.enabled&&h.enable(a,this)}));A(this.pluginMaps,r(this,function(a){var b=l[a.id];b&&!b.enabled&&
h.enable(a,this)}));this.enabling=!1;this.check()},on:function(a,b){var c=this.events[a];c||(c=this.events[a]=[]);c.push(b)},emit:function(a,b){t(this.events[a],function(a){a(b)});a==="error"&&delete this.events[a]}};h={config:k,contextName:b,registry:l,defined:o,urlFetched:Q,defQueue:C,Module:U,makeModuleMap:j,nextTick:g.nextTick,configure:function(a){a.baseUrl&&a.baseUrl.charAt(a.baseUrl.length-1)!=="/"&&(a.baseUrl+="/");var b=k.pkgs,c=k.shim,e={paths:!0,config:!0,map:!0};A(a,function(a,b){e[b]?
b==="map"?O(k[b],a,!0,!0):O(k[b],a,!0):k[b]=a});if(a.shim)A(a.shim,function(a,b){E(a)&&(a={deps:a});if(a.exports&&!a.exportsFn)a.exportsFn=h.makeShimExports(a);c[b]=a}),k.shim=c;if(a.packages)t(a.packages,function(a){a=typeof a==="string"?{name:a}:a;b[a.name]={name:a.name,location:a.location||a.name,main:(a.main||"main").replace(ea,"").replace($,"")}}),k.pkgs=b;A(l,function(a,b){if(!a.inited&&!a.map.unnormalized)a.map=j(b)});if(a.deps||a.callback)h.require(a.deps||[],a.callback)},makeShimExports:function(a){return function(){var b;
a.init&&(b=a.init.apply(W,arguments));return b||X(a.exports)}},makeRequire:function(a,f){function d(e,c,i){var k,p;if(f.enableBuildCallback&&c&&D(c))c.__requireJsBuild=!0;if(typeof e==="string"){if(D(c))return z(G("requireargs","Invalid require call"),i);if(a&&L[e])return L[e](l[a.id]);if(g.get)return g.get(h,e,a);k=j(e,a,!1,!0);k=k.id;return!F.call(o,k)?z(G("notloaded",'Module name "'+k+'" has not been loaded yet for context: '+b+(a?"":". Use require([])"))):o[k]}I();h.nextTick(function(){I();p=
n(j(null,a));p.skipMap=f.skipMap;p.init(e,c,i,{enabled:!0});w()});return d}f=f||{};O(d,{isBrowser:v,toUrl:function(b){var d=b.lastIndexOf("."),f=null;d!==-1&&(f=b.substring(d,b.length),b=b.substring(0,d));return h.nameToUrl(c(b,a&&a.id,!0),f)},defined:function(b){b=j(b,a,!1,!0).id;return F.call(o,b)},specified:function(b){b=j(b,a,!1,!0).id;return F.call(o,b)||F.call(l,b)}});if(!a)d.undef=function(b){s();var c=j(b,a,!0),d=l[b];delete o[b];delete Q[c.url];delete V[b];if(d){if(d.events.defined)V[b]=
d.events;delete l[b]}};return d},enable:function(a){l[a.id]&&n(a).enable()},completeLoad:function(a){var b,c,d=k.shim[a]||{},g=d.exports;for(s();C.length;){c=C.shift();if(c[0]===null){c[0]=a;if(b)break;b=!0}else c[0]===a&&(b=!0);y(c)}c=l[a];if(!b&&!o[a]&&c&&!c.inited)if(k.enforceDefine&&(!g||!X(g)))if(p(a))return;else return z(G("nodefine","No define call for "+a,null,[a]));else y([a,d.deps||[],d.exportsFn]);w()},nameToUrl:function(a,b){var c,d,i,h,j,l;if(g.jsExtRegExp.test(a))h=a+(b||"");else{c=
k.paths;d=k.pkgs;h=a.split("/");for(j=h.length;j>0;j-=1)if(l=h.slice(0,j).join("/"),i=d[l],l=c[l]){E(l)&&(l=l[0]);h.splice(0,j,l);break}else if(i){c=a===i.name?i.location+"/"+i.main:i.location;h.splice(0,j,c);break}h=h.join("/");h+=b||(/\?/.test(h)?"":".js");h=(h.charAt(0)==="/"||h.match(/^[\w\+\.\-]+:/)?"":k.baseUrl)+h}return k.urlArgs?h+((h.indexOf("?")===-1?"?":"&")+k.urlArgs):h},load:function(a,b){g.load(h,a,b)},execCb:function(a,b,c,d){return b.apply(d,c)},onScriptLoad:function(a){if(a.type===
"load"||ga.test((a.currentTarget||a.srcElement).readyState))H=null,a=B(a),h.completeLoad(a.id)},onScriptError:function(a){var b=B(a);if(!p(b.id))return z(G("scripterror","Script error",a,[b.id]))}};h.require=h.makeRequire();return h}};g({});t(["toUrl","undef","defined","specified"],function(b){g[b]=function(){var c=w._;return c.require[b].apply(c,arguments)}});if(v&&(u=s.head=document.getElementsByTagName("head")[0],y=document.getElementsByTagName("base")[0]))u=s.head=y.parentNode;g.onError=function(b){throw b;
};g.load=function(b,c,d){var g=b&&b.config||{},i;if(v)return i=g.xhtml?document.createElementNS("http://www.w3.org/1999/xhtml","html:script"):document.createElement("script"),i.type=g.scriptType||"text/javascript",i.charset="utf-8",i.async=!0,i.setAttribute("data-requirecontext",b.contextName),i.setAttribute("data-requiremodule",c),i.attachEvent&&!(i.attachEvent.toString&&i.attachEvent.toString().indexOf("[native code")<0)&&!R?(J=!0,i.attachEvent("onreadystatechange",b.onScriptLoad)):(i.addEventListener("load",
b.onScriptLoad,!1),i.addEventListener("error",b.onScriptError,!1)),i.src=d,I=i,y?u.insertBefore(i,y):u.appendChild(i),I=null,i;else aa&&(importScripts(d),b.completeLoad(c))};v&&N(document.getElementsByTagName("script"),function(b){if(!u)u=b.parentNode;if(q=b.getAttribute("data-main")){if(!n.baseUrl)B=q.split("/"),Y=B.pop(),Z=B.length?B.join("/")+"/":"./",n.baseUrl=Z,q=Y;q=q.replace($,"");n.deps=n.deps?n.deps.concat(q):[q];return!0}});define=function(b,c,d){var g,i;typeof b!=="string"&&(d=c,c=b,b=
null);E(c)||(d=c,c=[]);!c.length&&D(d)&&d.length&&(d.toString().replace(ca,"").replace(da,function(b,d){c.push(d)}),c=(d.length===1?["require"]:["require","exports","module"]).concat(c));if(J&&(g=I||ba()))b||(b=g.getAttribute("data-requiremodule")),i=w[g.getAttribute("data-requirecontext")];(i?i.defQueue:P).push([b,c,d])};define.amd={jQuery:!0};g.exec=function(b){return eval(b)};g(n)}})(this);

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -1,99 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
This program is free software; you can redistribute it and/or modify it under the
terms of the GNU Lesser General Public License as published by the Free Software
Foundation; either version 3.0 of the License, or (at your option) any later
version.
BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along
with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
-->
<mx:Module xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
implements="org.bigbluebutton.common.IBigBlueButtonModule"
creationComplete="init()" xmlns:mate="http://mate.asfusion.com/">
<mx:Script>
<![CDATA[
import com.asfusion.mate.events.Dispatcher;
import mx.core.FlexGlobals;
import mx.managers.PopUpManager;
import org.bigbluebutton.common.LogUtil;
import org.bigbluebutton.main.events.SettingsEvent;
import org.bigbluebutton.modules.settings.SettingsPanel;
import org.bigbluebutton.modules.settings.util.PersistUserPreferences;
import org.bigbluebutton.modules.settings.util.Requirements;
private var _moduleName:String = "Settings Module";
private var _attributes:Object;
private var globalDispatcher:Dispatcher;
private function init():void{
LogUtil.debug("SettingsModule::init");
}
public function get moduleName():String {
return _moduleName;
}
public function get uri():String {
return _attributes.uri + "/" + _attributes.room;
}
public function get username():String {
return _attributes.username;
}
public function get userid():Number {
return _attributes.userid as Number;
}
public function get role():String {
return _attributes.userrole as String;
}
public function start(attributes:Object):void {
_attributes = attributes;
globalDispatcher = new Dispatcher();
Requirements.setRequirements(attributes);
globalDispatcher.dispatchEvent(new SettingsEvent(SettingsEvent.SETTINGS_MODULE_LOADED));
var sharedObject:SharedObject = SharedObject.getLocal("bbbUserProperties", "/");
var firstTime:Boolean = sharedObject.data["previouslyvisited"] as Boolean;
if (!firstTime) openSettingsPanel();
}
public function stop():void {
}
private function openSettingsPanel(e:SettingsEvent = null):void{
var settingsPanel:SettingsPanel = SettingsPanel(PopUpManager.createPopUp(FlexGlobals.topLevelApplication as DisplayObject, SettingsPanel, true));
var point1:Point = new Point();
// Calculate position of TitleWindow in Application's coordinates.
settingsPanel.x = 0;
settingsPanel.y = 0;
// settingsPanel.x = FlexGlobals.topLevelApplication.mx_internal.Application.width/2 - settingsPanel.width/2;
// settingsPanel.y = FlexGlobals.topLevelApplication.mx_internal.Application.height/2 - settingsPanel.height/2;
PersistUserPreferences.saveSettingsVisited();
}
]]>
</mx:Script>
<mate:Listener type="{SettingsEvent.OPEN_SETTINGS_PANEL}" method="openSettingsPanel" />
</mx:Module>

View File

@ -83,6 +83,10 @@ package org.bigbluebutton.core.model
a.url = config.skinning.@url;
return a
}
public function get browserVersions():XML {
return new XML(config.browserVersions.toXMLString());
}
public function get layout():XML {
return new XML(config.layout.toXMLString());

View File

@ -1,37 +1,40 @@
/**
* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
*
* Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation; either version 3.0 of the License, or (at your option) any later
* version.
*
* BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along
* with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
*
*/
package org.bigbluebutton.modules.settings.uihelpers
{
import flash.events.Event;
public class WarningEvent extends Event
{
public static const WARNING_EVENT:String = "BBB_CHECKER_WARNING";
public var warningLabel:String;
public var warningText:String;
public var optionalCommandText:String;
public var optionalCallbackFunction:Function;
public function WarningEvent(type:String)
{
super(type, true, false);
}
}
/**
* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
*
* Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation; either version 3.0 of the License, or (at your option) any later
* version.
*
* BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along
* with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
*
*/
package org.bigbluebutton.main.events
{
import flash.events.Event;
public class ClientStatusEvent extends Event
{
public static const SUCCESS_MESSAGE_EVENT:String = "SUCCESS_MESSAGE_EVENT";
public static const WARNING_MESSAGE_EVENT:String = "WARNING_MESSAGE_EVENT";
public static const FAIL_MESSAGE_EVENT:String = "FAIL_MESSAGE_EVENT";
public var title:String;
public var message:String;
public function ClientStatusEvent(type:String, title:String, message:String)
{
super(type);
this.title = title;
this.message = message;
}
}
}

View File

@ -132,25 +132,7 @@ package org.bigbluebutton.main.model.users
_conferenceParameters.internalUserID
); //_netConnection.call
}
private function joinMeeting():void {
sendMessage(
"joinMeeting",// Remote function name
// result - On successful result
function(result:Object):void {
trace(LOG + "joining meeting for [" + _conferenceParameters.internalUserID + "]");
},
// status - On error occurred
function(status:Object):void {
LogUtil.error(LOG + "Error occurred:");
for (var x:Object in status) {
LogUtil.error(x + " : " + status[x]);
}
},
_conferenceParameters.internalUserID
); //_netConnection.call
}
private function handleValidateAuthTokenReply(msg: Object):void {
trace(LOG + "*** handleValidateAuthTokenReply " + msg.msg + " **** \n");
var map:Object = JSON.parse(msg.msg);
@ -160,7 +142,6 @@ package org.bigbluebutton.main.model.users
if (tokenValid) {
authenticated = true;
trace(LOG + "*** handleValidateAuthTokenReply. valid=[ " + tokenValid + "] **** \n");
joinMeeting();
} else {
trace(LOG + "*** handleValidateAuthTokenReply. valid=[ " + tokenValid + "] **** \n");
dispatcher.dispatchEvent(new InvalidAuthTokenEvent());

View File

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml"
verticalScrollPolicy="off" horizontalScrollPolicy="off" verticalAlign="middle">
<mx:Script>
<![CDATA[
override public function set data(value:Object):void {
super.data = value;
if (value == null) return;
switch (value.type) {
case "success":
typeImg.source = typeImg.getStyle("successImage");
break;
case "warning":
typeImg.source = typeImg.getStyle("warningImage");
break;
case "fail":
typeImg.source = typeImg.getStyle("failImage");
break
}
titleLbl.text = value.title;
messageTxt.text = value.message;
validateNow();
}
]]>
</mx:Script>
<mx:Image id="typeImg" width="34" height="34" styleName="statusImageStyle" />
<mx:VBox width="100%" verticalGap="0">
<mx:Label id="titleLbl" width="100%" styleName="statusTitleStyle"/>
<mx:Text id="messageTxt" width="100%" styleName="statusMessageStyle"/>
</mx:VBox>
</mx:HBox>

View File

@ -1,44 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
This program is free software; you can redistribute it and/or modify it under the
terms of the GNU Lesser General Public License as published by the Free Software
Foundation; either version 3.0 of the License, or (at your option) any later
version.
BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along
with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
-->
<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml" width="300" height="300"
paddingTop="10" paddingBottom="10" paddingLeft="10" paddingRight="10">
<mx:Script>
<![CDATA[
import org.bigbluebutton.util.i18n.ResourceUtil;
public function addWarning(e:WarningEvent):void{
//Remove the No Issues label if an issue comes in.
if (lblNoIssues.visible){
//here i'm just using visible as a flag so I don't have to create another local variable.
lblNoIssues.visible = false;
this.removeChild(lblNoIssues);
}
var warningItem:WarningItem = new WarningItem();
this.addChild(warningItem);
warningItem.setWarning(e);
}
]]>
</mx:Script>
<mx:Label text="Possible Issues:" />
<mx:Label id="lblNoIssues" text="{ResourceUtil.getInstance().getString('bbb.settings.noissues')}" />
</mx:VBox>
<?xml version="1.0" encoding="utf-8"?>
<!--
BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
This program is free software; you can redistribute it and/or modify it under the
terms of the GNU Lesser General Public License as published by the Free Software
Foundation; either version 3.0 of the License, or (at your option) any later
version.
BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along
with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
-->
<mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:chat="org.bigbluebutton.modules.chat.views.*"
width="500" height="400"
title="{ResourceUtil.getInstance().getString('bbb.clientstatus.title')}"
horizontalAlign="center">
<mx:Script>
<![CDATA[
import mx.managers.PopUpManager;
import org.bigbluebutton.util.i18n.ResourceUtil;
public function setMessages(messages:Array):void {
messageList.dataProvider = messages;
}
private function handleCloseButtonClick():void {
PopUpManager.removePopUp(this);
}
]]>
</mx:Script>
<chat:AdvancedList id="messageList" width="100%" height="100%" dragEnabled="false" variableRowHeight="true" wordWrap="true" alternatingItemColors="[#EFEFEF, #FEFEFE]" itemRenderer="org.bigbluebutton.main.views.ClientStatusItemRenderer"/>
<mx:Button label="Close" click="handleCloseButtonClick();" />
</mx:TitleWindow>

View File

@ -31,60 +31,66 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
<mx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.controls.Alert;
import org.bigbluebutton.common.LogUtil;
import org.bigbluebutton.main.events.ModuleLoadEvent;
import org.bigbluebutton.main.events.PortTestEvent;
import org.bigbluebutton.util.i18n.ResourceUtil;
import org.bigbluebutton.common.LogUtil;
import org.bigbluebutton.main.events.ModuleLoadEvent;
import org.bigbluebutton.main.events.PortTestEvent;
import org.bigbluebutton.util.i18n.ResourceUtil;
private var modules:Dictionary = new Dictionary();
private var numModules:int = 0;
private var portUpdateStr:String = 'Connecting to the server';
private function moduleLoadingStarted(e:ModuleLoadEvent):void{
var list:XMLList = e.modules;
var item:XML;
for each(item in list){
modules[item.@name] = 0;
numModules++;
}
this.label = ResourceUtil.getInstance().getString('bbb.mainshell.statusProgress.loading', [numModules]);
}
private var modules:Dictionary = new Dictionary();
private var numModules:int = 0;
private var portUpdateStr:String = 'Connecting to the server';
private function moduleLoadingStarted(e:ModuleLoadEvent):void{
var list:XMLList = e.modules;
var item:XML;
numModules = 0;
trace("LoadingBar.mxml numModules=[" + numModules + "]");
for each(item in list){
modules[item.@name] = 0;
numModules++;
trace("LoadingBar.mxml numModules=[" + numModules + "] modulename=[" + item.@name + "]");
}
this.label = ResourceUtil.getInstance().getString('bbb.mainshell.statusProgress.loading', [numModules]);
}
private function moduleLoadProgress(e:ModuleLoadEvent):void{
modules[e.moduleName] = e.progress;
updateProgress();
}
private function moduleLoadProgress(e:ModuleLoadEvent):void{
modules[e.moduleName] = e.progress;
updateProgress();
}
private function updateProgress():void{
var totalProgress:Number = 0;
for (var key:Object in modules) {
var progress:Number = modules[key] as Number;
totalProgress += progress;
}
//LogUtil.debug("Progress: " + totalProgress);
this.setProgress(totalProgress/numModules, 100);
}
private function updateProgress():void{
var totalProgress:Number = 0;
for (var key:Object in modules) {
var progress:Number = modules[key] as Number;
totalProgress += progress;
}
//LogUtil.debug("Progress: " + totalProgress);
this.setProgress(totalProgress/numModules, 100);
}
private function allModulesLoaded(e:ModuleLoadEvent):void{
parent.removeChild(this);
}
private function allModulesLoaded(e:ModuleLoadEvent):void{
parent.removeChild(this);
}
private function testRTMP(e:PortTestEvent):void{
//- Cannot get locale string this early in loading process
portUpdateStr += "."
this.label = portUpdateStr; //ResourceUtil.getInstance().getString('bbb.mainshell.statusProgress.connecting');
}
private function testRTMP(e:PortTestEvent):void{
//- Cannot get locale string this early in loading process
portUpdateStr += "."
this.label = portUpdateStr; //ResourceUtil.getInstance().getString('bbb.mainshell.statusProgress.connecting');
}
private function testRTMPupdate(e:PortTestEvent):void{
//- Cannot get locale string this early in loading process
portUpdateStr += "...";
this.label = portUpdateStr; //ResourceUtil.getInstance().getString('bbb.mainshell.statusProgress.connecting');
}
private function testRTMPupdate(e:PortTestEvent):void{
//- Cannot get locale string this early in loading process
portUpdateStr += "...";
this.label = portUpdateStr; //ResourceUtil.getInstance().getString('bbb.mainshell.statusProgress.connecting');
}
private function tunnelingFailed(e:PortTestEvent):void{
this.label = ResourceUtil.getInstance().getString('bbb.mainshell.statusProgress.cannotConnectServer');
}
private function tunnelingFailed(e:PortTestEvent):void{
this.label = ResourceUtil.getInstance().getString('bbb.mainshell.statusProgress.cannotConnectServer');
}
]]>

View File

@ -91,6 +91,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
import org.bigbluebutton.core.vo.LockSettingsVO;
import org.bigbluebutton.main.events.AppVersionEvent;
import org.bigbluebutton.main.events.BBBEvent;
import org.bigbluebutton.main.events.ClientStatusEvent;
import org.bigbluebutton.main.events.ConfigEvent;
import org.bigbluebutton.main.events.InvalidAuthTokenEvent;
import org.bigbluebutton.main.events.LogoutEvent;
@ -299,8 +300,14 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
}
private function handleOpenWindowEvent(event:OpenWindowEvent):void {
isTunneling = BBB.initConnectionManager().isTunnelling;
var window:IBbbModuleWindow = event.window;
// this is a terrible place for these checks because this function runs 4 times on startup
if (BBB.initConnectionManager().isTunnelling) {
isTunneling = true;
globalDispatcher.dispatchEvent(new ClientStatusEvent(ClientStatusEvent.WARNING_MESSAGE_EVENT, ResourceUtil.getInstance().getString("bbb.clientstatus.tunneling.title"), ResourceUtil.getInstance().getString("bbb.clientstatus.tunneling.message")));
}
versionCheck();
var window:IBbbModuleWindow = event.window;
mdiCanvas.addWindow(window);
}
@ -309,6 +316,49 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
mdiCanvas.removeWindow(window);
}
private function versionCheck():void {
var xml:XML = BBB.initConfigManager().config.browserVersions;
if (xml.@chrome != undefined && xml.@firefox != undefined && xml.@flash != undefined) {
//find browser version
var browserVersion:Array = ExternalInterface.call("determineBrowser");
//check browser version
if ((browserVersion[0].toString().toLowerCase() == "chrome" && browserVersion[1] < xml.@chrome) || browserVersion[0].toString().toLowerCase() == "firefox" && browserVersion[1] < xml.@firefox) {
globalDispatcher.dispatchEvent(new ClientStatusEvent(ClientStatusEvent.WARNING_MESSAGE_EVENT,
ResourceUtil.getInstance().getString("bbb.clientstatus.browser.title"),
ResourceUtil.getInstance().getString("bbb.clientstatus.browser.message", [browserVersion[0]+" "+browserVersion[1]])));
}
//find flash version
var flashVersion:Object = getFlashVersion();
//check flash version
if ((flashVersion.os == 'LNX' && browserVersion[0].toString().toLowerCase() != "chrome" && flashVersion.major < 11) ||
((flashVersion.os != 'LNX' || browserVersion[0].toString().toLowerCase() == "chrome") && flashVersion.major < xml.@flash)) {
globalDispatcher.dispatchEvent(new ClientStatusEvent(ClientStatusEvent.WARNING_MESSAGE_EVENT,
ResourceUtil.getInstance().getString("bbb.clientstatus.flash.title"),
ResourceUtil.getInstance().getString("bbb.clientstatus.flash.message", [flashVersion.major+"."+flashVersion.minor+"."+flashVersion.build])));
}
}
//Alert.show(LOG + "version check- os: "+flashVersion.os+" major:"+flashVersion.major+" minor:"+flashVersion.minor+" build:"+flashVersion.build+" browser:"+browserVersion[0]+" version:"+browserVersion[1]);
//find java version
//check flash version
}
//function found here, http://www.mediacollege.com/adobe/flash/actionscript/3/player-version.html
private function getFlashVersion():Object {
var flashVersion:Object = new Object();
var versionNumber:String = Capabilities.version;// Get the whole version string
var versionArray:Array = versionNumber.split(",");// Split it up
var osPlusVersion:Array = versionArray[0].split(" ");// The main version contains the OS (e.g. WIN), so we split that off as well.
// Populate the version object (the OS is a string, others are numbers):
flashVersion["os"] = osPlusVersion[0];
flashVersion["major"] = parseInt(osPlusVersion[1]);
flashVersion["minor"] = parseInt(versionArray[1]);
flashVersion["build"] = parseInt(versionArray[2]);
return flashVersion;
}
private function resetLayout():void{
mdiCanvas.resetWindowLayout();
}
@ -627,6 +677,9 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
id="isTunnellingLbl"
visible="{isTunneling}"
includeInLayout="{isTunneling}" />
<views:WarningButton id="warningBtn"
width="23"
height="20"/>
<views:LanguageSelector id="langSelector"
visible="false"
height="20"

View File

@ -0,0 +1,105 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
This program is free software; you can redistribute it and/or modify it under the
terms of the GNU Lesser General Public License as published by the Free Software
Foundation; either version 3.0 of the License, or (at your option) any later
version.
BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along
with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
-->
<mx:Button xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:mate="http://mate.asfusion.com/"
styleName="warningButtonStyle"
toolTip="{ResourceUtil.getInstance().getString('bbb.clientstatus.title')}"
click="handleButtonClick();"
move="handleMove();">
<mate:Listener type="{ClientStatusEvent.SUCCESS_MESSAGE_EVENT}" method="handleSuccessMessageEvent" />
<mate:Listener type="{ClientStatusEvent.WARNING_MESSAGE_EVENT}" method="handleWarningMessageEvent" />
<mate:Listener type="{ClientStatusEvent.FAIL_MESSAGE_EVENT}" method="handleFailMessageEvent" />
<mx:Script>
<![CDATA[
import mx.controls.ToolTip;
import mx.core.FlexGlobals;
import mx.events.FlexEvent;
import mx.managers.PopUpManager;
import mx.managers.ToolTipManager;
import org.bigbluebutton.main.events.ClientStatusEvent;
import org.bigbluebutton.util.i18n.ResourceUtil;
private static const LOG:String = "WarningButton - ";
[Bindable]
private var messages:Array = new Array();
private var notification:ToolTip;
private function handleSuccessMessageEvent(e:ClientStatusEvent):void {
if(isUniqueMessage("success", e.title, e.message)) {
messages.push({type:"success",title:e.title,message:e.message});
showNotification();
}
}
private function handleWarningMessageEvent(e:ClientStatusEvent):void {
if(isUniqueMessage("warning", e.title, e.message)) {
messages.push({type:"warning",title:e.title,message:e.message});
showNotification();
}
}
private function handleFailMessageEvent(e:ClientStatusEvent):void {
if(isUniqueMessage("fail", e.title, e.message)) {
messages.push({type:"fail",title:e.title,message:e.message});
showNotification();
}
}
private function showNotification():void {
if (!notification) {
notification = ToolTipManager.createToolTip(ResourceUtil.getInstance().getString("bbb.clientstatus.notification"), 100, 100, "errorTipAbove", this) as ToolTip;
handleMove();
}
}
private function isUniqueMessage(type:String, title:String, message:String):Boolean {
for (var i:Number=0; i<messages.length; i++) {
if (messages[i].type == type && messages[i].title == title && messages[i].message == message)
return false;
}
return true;
}
private function handleButtonClick():void {
if (notification) {
ToolTipManager.destroyToolTip(notification);
notification = null;
}
var clientStatusWindow:ClientStatusWindow = PopUpManager.createPopUp(FlexGlobals.topLevelApplication as DisplayObject, ClientStatusWindow, true) as ClientStatusWindow;
clientStatusWindow.setMessages(messages);
PopUpManager.centerPopUp(clientStatusWindow);
}
private function handleMove():void {
if (notification) {
var location:Point = localToGlobal(new Point(0,0));
notification.move(location.x - notification.width/2 + this.width/2, location.y - notification.height);
}
}
]]>
</mx:Script>
</mx:Button>

View File

@ -27,7 +27,7 @@ package org.bigbluebutton.modules.chat.model
public var privateEnabled:Boolean = true;
[Bindable]
public var fontSize:String = "10";
public var fontSize:String = "12";
[Bindable]
public var position:String = "top-right";

View File

@ -20,8 +20,9 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
-->
<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml" verticalAlign="top"
verticalScrollPolicy="off" horizontalScrollPolicy="off"
<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml"
verticalAlign="top" verticalGap="0" paddingTop="0" paddingBottom="0"
verticalScrollPolicy="off" horizontalScrollPolicy="off"
xmlns:common="org.bigbluebutton.common.*">
<mx:Script>

View File

@ -13,6 +13,7 @@ package org.bigbluebutton.modules.phone.managers
import org.bigbluebutton.core.UsersUtil;
import org.bigbluebutton.main.api.JSAPI;
import org.bigbluebutton.main.events.ClientStatusEvent;
import org.bigbluebutton.modules.phone.PhoneModel;
import org.bigbluebutton.modules.phone.PhoneOptions;
import org.bigbluebutton.modules.phone.events.AudioSelectionWindowEvent;
@ -49,7 +50,14 @@ package org.bigbluebutton.modules.phone.managers
browserType = browserInfo[0];
browserVersion = browserInfo[1];
}
options = new PhoneOptions();
options = new PhoneOptions();
// only show the warning if the admin has enabled WebRTC
if (options.useWebRTCIfAvailable && !isWebRTCSupported()) {
dispatcher.dispatchEvent(new ClientStatusEvent(ClientStatusEvent.WARNING_MESSAGE_EVENT,
ResourceUtil.getInstance().getString("bbb.clientstatus.webrtc.title"),
ResourceUtil.getInstance().getString("bbb.clientstatus.webrtc.message")));
}
}
private function isWebRTCSupported():Boolean {
@ -79,17 +87,17 @@ package org.bigbluebutton.modules.phone.managers
}
private function startWebRTCEchoTest():void {
model.state = Constants.CALLING_INTO_ECHO_TEST;
model.state = Constants.CALLING_INTO_ECHO_TEST;
ExternalInterface.call("startWebRTCAudioTest");
}
private function endEchoTest():void {
ExternalInterface.call("stopWebRTCAudioTest");
}
private function endEchoTestJoinConference():void {
ExternalInterface.call("stopWebRTCAudioTestJoinConference");
}
private function endEchoTestJoinConference():void {
ExternalInterface.call("stopWebRTCAudioTestJoinConference");
}
private function hangup():void {
ExternalInterface.call("stopWebRTCAudioTest");
@ -108,16 +116,16 @@ package org.bigbluebutton.modules.phone.managers
dispatcher.dispatchEvent(new UseFlashModeCommand());
}
private var t:Timer;
private var t:Timer;
public function handleWebRTCEchoTestHasAudioEvent():void {
trace(LOG + "handleWebRTCEchoTestHasAudioEvent");
model.state = Constants.STOP_ECHO_THEN_JOIN_CONF;
endEchoTestJoinConference();
endEchoTestJoinConference();
}
public function handleWebRTCCallStartedEvent():void {
trace(LOG + "setting state to IN_CONFERENCE");
trace(LOG + "setting state to IN_CONFERENCE");
model.state = Constants.IN_CONFERENCE;
dispatcher.dispatchEvent(new WebRTCJoinedVoiceConferenceEvent());
@ -175,31 +183,33 @@ package org.bigbluebutton.modules.phone.managers
public function handleWebRTCEchoTestFailedEvent(errorCode:Number):void {
model.state = Constants.INITED;
endEchoTest();
var errorString:String = ResourceUtil.getInstance().getString("bbb.webrtcWarning.failedError." + errorCode);
if (!errorString) {
errorString = ResourceUtil.getInstance().getString("bbb.webrtcWarning.failedError.unknown", [errorCode]);
}
var alert:Alert = Alert.show(ResourceUtil.getInstance().getString("bbb.webrtcWarning.message", [errorString]), ResourceUtil.getInstance().getString("bbb.webrtcWarning.title"), Alert.YES | Alert.NO, null, handleCallFailedUserResponse, null, Alert.YES);
var errorString:String = ResourceUtil.getInstance().getString("bbb.webrtcWarning.failedError." + errorCode);
if (!errorString) {
errorString = ResourceUtil.getInstance().getString("bbb.webrtcWarning.failedError.unknown", [errorCode]);
}
sendWebRTCAlert(ResourceUtil.getInstance().getString("bbb.webrtcWarning.title"), ResourceUtil.getInstance().getString("bbb.webrtcWarning.message", [errorString]), errorString);
}
public function handleWebRTCEchoTestEndedUnexpectedly():void {
model.state = Constants.INITED;
var alert:Alert = Alert.show(ResourceUtil.getInstance().getString("bbb.webrtcWarning.endedunexpectedly"), ResourceUtil.getInstance().getString("bbb.webrtcWarning.title"), Alert.YES | Alert.NO, null, handleCallFailedUserResponse, null, Alert.YES);
var errorString:String = ResourceUtil.getInstance().getString("bbb.webrtcWarning.failedError.endedunexpectedly");
sendWebRTCAlert(ResourceUtil.getInstance().getString("bbb.webrtcWarning.title"), ResourceUtil.getInstance().getString("bbb.webrtcWarning.message", [errorString]), errorString);
}
public function handleWebRTCCallFailedEvent(errorCode:Number):void {
model.state = Constants.INITED;
var errorString:String = ResourceUtil.getInstance().getString("bbb.webrtcWarning.failedError." + errorCode);
if (!errorString) {
errorString = ResourceUtil.getInstance().getString("bbb.webrtcWarning.failedError.unknown", [errorCode]);
}
var alert:Alert = Alert.show(ResourceUtil.getInstance().getString("bbb.webrtcWarning.message", [errorString]), ResourceUtil.getInstance().getString("bbb.webrtcWarning.title"), Alert.YES | Alert.NO, null, handleCallFailedUserResponse, null, Alert.YES);
var errorString:String = ResourceUtil.getInstance().getString("bbb.webrtcWarning.failedError." + errorCode);
if (!errorString) {
errorString = ResourceUtil.getInstance().getString("bbb.webrtcWarning.failedError.unknown", [errorCode]);
}
sendWebRTCAlert(ResourceUtil.getInstance().getString("bbb.webrtcWarning.title"), ResourceUtil.getInstance().getString("bbb.webrtcWarning.message", [errorString]), errorString);
}
public function handleWebRTCMediaFailedEvent():void {
model.state = Constants.INITED;
var alert:Alert = Alert.show(ResourceUtil.getInstance().getString("bbb.webrtcWarning.mediamessage"), ResourceUtil.getInstance().getString("bbb.webrtcWarning.title"), Alert.YES | Alert.NO, null, handleCallFailedUserResponse, null, Alert.YES);
var errorString:String = ResourceUtil.getInstance().getString("bbb.webrtcWarning.failedError.mediamissing");
sendWebRTCAlert(ResourceUtil.getInstance().getString("bbb.webrtcWarning.title"), ResourceUtil.getInstance().getString("bbb.webrtcWarning.message", [errorString]), errorString);
}
private function handleCallFailedUserResponse(e:CloseEvent):void {
@ -209,5 +219,10 @@ package org.bigbluebutton.modules.phone.managers
dispatcher.dispatchEvent(new AudioSelectionWindowEvent(AudioSelectionWindowEvent.CLOSED_AUDIO_SELECTION));
}
}
private function sendWebRTCAlert(title:String, message:String, error:String):void {
Alert.show(message, title, Alert.YES | Alert.NO, null, handleCallFailedUserResponse, null, Alert.YES);
dispatcher.dispatchEvent(new ClientStatusEvent(ClientStatusEvent.FAIL_MESSAGE_EVENT, title, error));
}
}
}

View File

@ -1,102 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
This program is free software; you can redistribute it and/or modify it under the
terms of the GNU Lesser General Public License as published by the Free Software
Foundation; either version 3.0 of the License, or (at your option) any later
version.
BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along
with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
-->
<mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" minWidth="955" minHeight="450" xmlns:checkers="checkers.*"
creationComplete="init();" xmlns:uihelpers="uihelpers.*" xmlns:checkers1="org.bigbluebutton.modules.settings.checkers.*"
xmlns:uihelpers1="org.bigbluebutton.modules.settings.uihelpers.*" showCloseButton="true" close="onSaveClose()">
<mx:Script>
<![CDATA[
import mx.managers.PopUpManager;
import mx.rpc.events.HeaderEvent;
import org.bigbluebutton.modules.settings.uihelpers.JavaOKEvent;
import org.bigbluebutton.modules.settings.uihelpers.WarningEvent;
import org.bigbluebutton.modules.settings.util.Requirements;
import org.bigbluebutton.util.i18n.ResourceUtil;
private var isJavaOk:Boolean = false;
private function init():void{
requirementsLoaded();
setText();
startTest();
}
private function setText():void{
txtInstructions.text = ResourceUtil.getInstance().getString('bbb.settings.instructions');
}
private function requirementsLoaded():void{
webcamCheck.addEventListener(WarningEvent.WARNING_EVENT, onWarningEvent);
micCheck.addEventListener(WarningEvent.WARNING_EVENT, onWarningEvent);
systemCheck.addEventListener(WarningEvent.WARNING_EVENT, onWarningEvent);
systemCheck.addEventListener(JavaOKEvent.JAVA_A_OK, onJavaOKEvent);
systemCheck.init();
}
private function onWarningEvent(e:WarningEvent):void{
warningsList.addWarning(e);
}
private function onJavaOKEvent(e:JavaOKEvent):void{
isJavaOk = true;
}
private function startTest():void{
webcamCheck.init();
micCheck.init();
if (Requirements.check_deskshare == "true") checkDesktopSharing();
//btnStart.enabled = false;
}
private function onSaveClose(e:Event = null):void{
webcamCheck.stop();
micCheck.stop();
deskshareCheck.stop();
//this.removeAllChildren();
PopUpManager.removePopUp(this);
}
private function checkDesktopSharing():void{
//deskshareCheck.startTheApplet();
deskshareCheck.visible = true;
//this.width = 955;
}
]]>
</mx:Script>
<mx:VBox x="338" y="10">
<checkers1:WebcamChecker id="webcamCheck" />
<checkers1:MicChecker id="micCheck" />
</mx:VBox>
<checkers1:SystemCheck id="systemCheck" width="52" height="11" x="10" y="494"/>
<checkers1:DeskShareChecker id="deskshareCheck" x="540" y="20" visible="false" />
<uihelpers1:WarningsList id="warningsList" x="10" y="201" width="300" height="195"/>
<mx:Text x="10" y="10" width="300"
id="txtInstructions" height="108" paddingBottom="10" paddingLeft="10" paddingRight="10" paddingTop="10"
selectable="false"/>
<mx:Button id="btnSaveClose" label="Save Settings and Close" click="onSaveClose()" bottom="15" horizontalCenter="0" />
</mx:TitleWindow>

View File

@ -1,157 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
This program is free software; you can redistribute it and/or modify it under the
terms of the GNU Lesser General Public License as published by the Free Software
Foundation; either version 3.0 of the License, or (at your option) any later
version.
BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along
with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
-->
<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml" width="400" height="300" creationComplete="onCreationComplete()" horizontalAlign="center" verticalAlign="middle">
<mx:Script>
<![CDATA[
import mx.core.UIComponent;
import org.bigbluebutton.modules.settings.connectors.DeskShareConnector;
import org.bigbluebutton.modules.settings.util.Requirements;
import org.bigbluebutton.util.i18n.ResourceUtil;
private var deskshareConnector:DeskShareConnector;
private var ns:NetStream;
private var video:Video;
private var videoHolder:UIComponent;
private function onCreationComplete():void{
deskshareConnector = new DeskShareConnector(appletStarted, startViewing, stopViewing);
}
/**
* Call only if the Java check passed. Otherwise launching the applet definitely won't work.
*/
public function startTheApplet():void{
ExternalInterface.call("startApplet", getCaptureServerUri(), deskshareConnector.room, true);
this.removeAllChildren();
}
private function appletStarted(videoWidth:Number, videoHeight:Number):void{
startVideo(deskshareConnector.nc, deskshareConnector.room, videoWidth, videoHeight);
}
private function startViewing(videoWidth:Number, videoHeight:Number):void{
startVideo(deskshareConnector.nc, deskshareConnector.room, videoWidth, videoHeight);
}
private function stopViewing():void{
ns.close();
}
private function startVideo(connection:NetConnection, stream:String, videoWidth:Number, videoHeight:Number):void{
ns = new NetStream(connection);
ns.addEventListener( NetStatusEvent.NET_STATUS, onNetStatus );
ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, onAsyncError);
ns.client = this;
ns.bufferTime = 0;
ns.receiveVideo(true);
ns.receiveAudio(false);
video = new Video(videoWidth, videoHeight);
video.attachNetStream(ns);
this.width = this.height * (videoWidth/videoHeight);
videoHolder = new UIComponent();
calculateDisplayDimensions(video, videoHolder);
videoHolder.addChild(video);
//videoHolder.addChild(cursor);
//videoHolder.addChild(cursorImg);
centerVideo();
ns.play(stream);
this.addChild(videoHolder);
}
private function onAsyncError(e:AsyncErrorEvent):void{
trace("VIdeoWindow::asyncerror " + e.toString());
}
private function onNetStatus(e:NetStatusEvent):void{
switch(e.info.code){
case "NetStream.Play.Start":
trace("NetStream.Publish.Start for deskshare broadcast test stream ");
trace("Dispatching start viewing event");
deskshareConnector.sendStartedViewingNotification();
break;
case "NetStream.Play.UnpublishNotify":
trace("NetStream.Play.UnpublishNotify for deskshare broadcast test stream ");
stopViewing();
break;
}
}
private function centerVideo():void {
videoHolder.x = this.width/2 - video.width/2;
videoHolder.y = this.height/2 - video.height/2;
}
private function calculateDisplayDimensions(video:Video, videoHolder:UIComponent):void {
if (videoIsSmallerThanDisplay(video, videoHolder)) {
videoHolder.width = video.width;
videoHolder.height = video.height;
return;
}
if (this.width < this.height) {
fitToWidthAndAdjustHeightToMaintainAspectRatio();
} else {
fitToHeightAndAdjustWidthToMaintainAspectRatio();
}
}
private function videoIsSmallerThanDisplay(video:Video, videoHolder:UIComponent):Boolean {
return (video.height < this.height) && (video.width < this.width);
}
private function fitToWidthAndAdjustHeightToMaintainAspectRatio():void {
var aspectRatio:Number = video.height/video.width;
video.width = this.width;
videoHolder.width = this.height;
// Maintain aspect-ratio
video.height = this.width * aspectRatio;
videoHolder.height = video.height;
}
private function fitToHeightAndAdjustWidthToMaintainAspectRatio():void {
var aspectRatio:Number = video.width/video.height;
video.height = this.height;
videoHolder.height = video.height;
// Maintain aspect-ratio
video.width = aspectRatio * this.height;
videoHolder.width = video.width;
}
public function getCaptureServerUri():String{
var uri:String = Requirements.bbb_deskshare_url;
uri = uri.split("/")[2];
return uri;
}
public function stop():void{
if (ns != null) ns.close();
ExternalInterface.call("stopApplet");
}
]]>
</mx:Script>
<mx:Button id="btnStartDeskshare" click="startTheApplet()" label="{ResourceUtil.getInstance().getString('bbb.settings.deskshare.start')}" />
<mx:Text width="200" textAlign="center" text="{ResourceUtil.getInstance().getString('bbb.settings.deskshare.instructions')}" id="txtInstructions" />
</mx:VBox>

View File

@ -1,83 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
This program is free software; you can redistribute it and/or modify it under the
terms of the GNU Lesser General Public License as published by the Free Software
Foundation; either version 3.0 of the License, or (at your option) any later
version.
BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along
with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
-->
<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml" width="180" height="250"
paddingTop="10" paddingBottom="10" paddingLeft="10" paddingRight="10"
horizontalAlign="center" visible="false" >
<mx:Script>
<![CDATA[
import org.bigbluebutton.modules.settings.connectors.AudioConnector;
import org.bigbluebutton.modules.settings.util.PersistUserPreferences;
import org.bigbluebutton.util.i18n.ResourceUtil;
private var timer:Timer;
private var mic:Microphone;
private var audioConnector:AudioConnector;
public function init():void{
this.visible = true;
initMic();
audioConnector = new AudioConnector(mic);
timer = new Timer(100);
timer.addEventListener(TimerEvent.TIMER, updateMicLevel);
timer.start();
}
private function initMic():void{
mic = Microphone.getMicrophone();
if (mic == null) return;
sldVolume.value = mic.gain;
}
public function saveCurrentMic():void{
PersistUserPreferences.saveMicrophonePreference(Microphone.names[cmbMicSelector.selectedIndex]);
}
private function updateMicLevel(e:TimerEvent):void{
micLevel.setProgress(mic.activityLevel,100);
}
private function changeMic():void{
mic = Microphone.getMicrophone(cmbMicSelector.selectedIndex);
if (mic == null) return;
saveCurrentMic();
}
private function changeVolume():void{
mic.gain = sldVolume.value;
PersistUserPreferences.saveMicrophoneGain(mic.gain);
}
public function stop():void{
audioConnector.stop();
}
]]>
</mx:Script>
<mx:ProgressBar id="micLevel" minimum="0" maximum="100" label="{ResourceUtil.getInstance().getString('bbb.settings.voice.volume')}" labelPlacement="top"
direction="right" mode="manual" visible="true" width="120"/>
<mx:HSlider id="sldVolume" minimum="0" maximum="100" change="changeVolume()" labels="[silent, loud]" />
<mx:Label text="{ResourceUtil.getInstance().getString('bbb.settings.voice.volume')}" />
<mx:ComboBox id="cmbMicSelector" dataProvider="{Microphone.names}" change="changeMic()" textAlign="left" width="150" />
</mx:VBox>

View File

@ -1,169 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
This program is free software; you can redistribute it and/or modify it under the
terms of the GNU Lesser General Public License as published by the Free Software
Foundation; either version 3.0 of the License, or (at your option) any later
version.
BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along
with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
-->
<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml" width="400" height="300" visible="false" >
<mx:Script>
<![CDATA[
import flash.net.navigateToURL;
import mx.core.Application;
import mx.managers.PopUpManager;
import org.bigbluebutton.modules.settings.connectors.AppsConnector;
import org.bigbluebutton.modules.settings.uihelpers.JavaOKEvent;
import org.bigbluebutton.modules.settings.uihelpers.WarningEvent;
import org.bigbluebutton.modules.settings.util.JavaCheck;
import org.bigbluebutton.modules.settings.util.Requirements;
import org.bigbluebutton.util.i18n.ResourceUtil;
public function init():void{
checkFlash();
checkOS();
checkJava();
}
private function checkFlash():void{
var flashVersion:String = Capabilities.version;
var flashVersions:Array = (Capabilities.version.split(" ")[1] as String).split(",");
var flashRequired:Array = Requirements.flash_required_version.split(",");
trace("version is: " + flashVersions);
trace("required is " + flashRequired);
for (var i:Number = 0; i< flashRequired.length; i++){
if (Number(flashRequired[i]) > Number(flashVersions[i])) showFlashError(flashVersion, Requirements.flash_required_version);
}
}
private function checkOS():void{
trace("Operating System: " + Capabilities.os);
var os:Array = Capabilities.os.split(" ");
//Check for this bug: http://reviews.cnet.com/8301-13727_7-20022842-263.html
//Fix is to download new flash player 10.2 or above
if (os[0] == "Mac" && os[1] == "OS" && os[2] == "10.6.5"){
showMacOS1065iSightError();
}
}
private function checkJava():void{
var javas:Array = JavaCheck.getJREs();
if (javas.length == 0) showFlashError("NO JAVA INSTALLED", Requirements.java_required_version);
trace("Java version required is: " + Requirements.java_required_version);
trace("Java versions installed: ");
var highestJava:String = javas[0];
for each (var java:String in javas){
trace("Found java " + java);
var highest:Array = highestJava.split(".");
var iter:Array = java.split(".");
if (Number(iter[0]) > Number(highest[0])){
highestJava = java;
} else if (Number(iter[0]) == Number(highest[0]) && Number(iter[1]) > Number(highest[1])){
highestJava = java;
} else if (Number(iter[0]) == Number(highest[0]) && Number(iter[1]) == Number(highest[1])){
var iterMinor:Number = Number((iter[2] as String).split("_")[1]);
var highestMinor:Number = Number((highest[2] as String).split("_")[1]);
if (iterMinor > highestMinor) highestJava = java;
}
}
var passedJava:Boolean = true;
var required:Array = Requirements.java_required_version.split(".");
highest = highestJava.split(".");
if (Number(required[0]) > Number(highest[0])){
passedJava = false;
} else if (Number(required[0]) == Number(highest[0]) && Number(required[1]) > Number(highest[1])){
passedJava = false;
} else if (Number(required[0]) == Number(highest[0]) && Number(required[1]) == Number(highest[1])){
var requiredMinor:Number = Number((required[2] as String).split("_")[1]);
var highestJavaMinor:Number = Number((highest[2] as String).split("_")[1]);
if (requiredMinor > highestJavaMinor) passedJava = false;
}
if (!passedJava) showJavaError(highestJava, Requirements.java_required_version);
else sendJavaOK();
}
private function checkBBBApps():void{
var appsConnector:AppsConnector = new AppsConnector();
}
private function sendJavaOK():void{
dispatchEvent(new JavaOKEvent(JavaOKEvent.JAVA_A_OK));
}
private function showJavaError(hasVersion:String, needsVersion:String):void{
var e:WarningEvent = new WarningEvent(WarningEvent.WARNING_EVENT);
e.warningLabel = ResourceUtil.getInstance().getString('bbb.settings.java.label');
e.warningText = javaError(hasVersion, needsVersion);
e.optionalCommandText = ResourceUtil.getInstance().getString('bbb.settings.java.command');
e.optionalCallbackFunction = installNewestJava;
dispatchEvent(e);
}
private function installNewestJava():void{
JavaCheck.installLatestJRE();
}
private function showFlashError(hasVersion:String, needsVersion:String):void{
var e:WarningEvent = new WarningEvent(WarningEvent.WARNING_EVENT);
e.warningLabel = ResourceUtil.getInstance().getString('bbb.settings.flash.label');
e.warningText = flashError(hasVersion, needsVersion);
e.optionalCommandText = ResourceUtil.getInstance().getString('bbb.settings.flash.command');
e.optionalCallbackFunction = installNewestFlash;
dispatchEvent(e);
}
private function installNewestFlash():void{
navigateToURL(new URLRequest("http://get.adobe.com/flashplayer/"), "_self");
}
private function showMacOS1065iSightError():void{
var e:WarningEvent = new WarningEvent(WarningEvent.WARNING_EVENT);
e.warningLabel = ResourceUtil.getInstance().getString('bbb.settings.isight.label');
e.warningText = iSightErrorOSX1065();
e.optionalCommandText = ResourceUtil.getInstance().getString('bbb.settings.isight.command');
e.optionalCallbackFunction = installFlash102RC2;
dispatchEvent(e);
}
private function installFlash102RC2():void{
navigateToURL(new URLRequest("http://labs.adobe.com/downloads/flashplayer10.html"), "_self");
}
private static function iSightErrorOSX1065():String{
return ResourceUtil.getInstance().getString('bbb.settings.isight.text');
}
private static function javaError(hasVersion:String, needsVersion:String):String{
return ResourceUtil.getInstance().getString('bbb.settings.java.text', [hasVersion, needsVersion]);
}
private static function flashError(hasVersion:String, needsVersion:String):String{
return ResourceUtil.getInstance().getString('bbb.settings.flash.text', [hasVersion, needsVersion]);
}
]]>
</mx:Script>
</mx:VBox>

View File

@ -1,191 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
This program is free software; you can redistribute it and/or modify it under the
terms of the GNU Lesser General Public License as published by the Free Software
Foundation; either version 3.0 of the License, or (at your option) any later
version.
BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along
with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
-->
<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml" width="180" height="180"
paddingTop="10" paddingBottom="10" paddingLeft="10" paddingRight="10"
visible="false">
<mx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.core.Application;
import mx.managers.PopUpManager;
import org.bigbluebutton.modules.settings.connectors.VideoConnector;
import org.bigbluebutton.modules.settings.uihelpers.WarningEvent;
import org.bigbluebutton.modules.settings.util.PersistUserPreferences;
import org.bigbluebutton.modules.settings.util.Requirements;
private var video:Video;
private var camera:Camera;
[Bindable] private var camWidth:Number = 160;
[Bindable] private var camHeight:Number = 120;
private var quality:Number = 0;
private var videoConnector:VideoConnector;
private var ns:NetStream;
public function init():void{
this.visible = true;
this.videoConnector = new VideoConnector(onNetStatus);
checkIfNoCamera();
var isMac:Boolean = checkIfMacCamera();
if (isMac) checkIfGoogleTalkPluginInstalled();
}
public function saveCurrentWebcam():void{
PersistUserPreferences.saveWebcamPreference(Camera.names[cmbCameraSelector.selectedIndex]);
}
private function checkIfNoCamera():void{
if (Camera.names.length == 0 || Camera.names[0] == ""){
var e:WarningEvent = new WarningEvent(WarningEvent.WARNING_EVENT);
e.warningLabel = "No Camera Detected";
e.warningText = "We did not detect a webcam connected to your system. If you do have a webcam connected, make sure it is installed and working " +
"properly, and is not currently in use by another program.";
dispatchEvent(e);
}
}
private function checkIfMacCamera():Boolean{
for (var i:int = 0; i<Camera.names.length; i++){
if (Camera.names[i] == "USB Video Class Video" || Camera.names[i] == "Built-in iSight") {
/**
* Set as default for Macs
*/
cmbCameraSelector.selectedIndex = i;
return true;
}
}
return false;
}
private function checkIfGoogleTalkPluginInstalled():void{
for (var i:int = 0; i<Camera.names.length; i++){
if (Camera.names[i] == "Google Camera Adapter 1" || Camera.names[i] == "Google Camera Adapter 0") {
showGoogleAdapterError();
break;
}
}
}
private function showCamera():void{
camera = Camera.getCamera(cmbCameraSelector.selectedIndex.toString());
if (camera == null) return;
camera.setKeyFrameInterval(5);
camera.setMode(camWidth,camHeight,15);
camera.setQuality(0,quality);
//The following few lines will just show the camera locally captured. What we want to do is stream it
/*video = new Video(camWidth, camHeight);
//Next two lines may seem redundant but they're not. Do not delete. They force the video to proper width & height
video.width = camWidth;
video.height = camHeight;
video.attachCamera(camera);
videoHolder.addChild(video);*/
videoConnector.connectVideo(camera, onNetStatus);
saveCurrentWebcam();
}
public function onNetStatus(e:NetStatusEvent):void{
trace("WebcamChecker::onNetStatus - " + e.info.code);
switch(e.info.code){
case VideoConnector.CONNECT_SUCCESS:
showCamera();
break;
case VideoConnector.NETSTREAM_PUBLISH:
startVideo();
break;
case VideoConnector.CONNECT_FAILED:
showConnectionError();
break;
case VideoConnector.CONNECT_REJECTED:
//showConnectionError();
break;
case VideoConnector.CONNECT_CLOSED:
showConnectionError();
break
default:
break;
}
}
private function startVideo():void{
ns = new NetStream(videoConnector.connection);
ns.client = this;
ns.bufferTime = 0;
ns.receiveVideo(true);
ns.receiveAudio(false);
video = new Video(camWidth, camHeight);
video.width = camWidth;
video.height = camHeight;
video.attachNetStream(ns);
videoHolder.addChild(video);
ns.play(videoConnector.streamName);
}
private function showGoogleAdapterError():void{
var e:WarningEvent = new WarningEvent(WarningEvent.WARNING_EVENT);
e.warningLabel = "Google Camera Adapter Error";
e.warningText = googleAdapterError();
dispatchEvent(e);
}
private function showConnectionError():void{
var e:WarningEvent = new WarningEvent(WarningEvent.WARNING_EVENT);
e.warningLabel = "Connection Error";
e.warningText = connectionError(Requirements.bbb_video_url);
dispatchEvent(e);
}
private static function googleAdapterError():String{
return "It seems like you have Google Voice and Video plugin installed. " +
"This plugin interferes with normal functioning of the Webcams on Macs with certain Flash versions. \n\n" +
"To fix this problem: \n" +
"- If you are using Google Chrome, try using Safari instead. \n" +
"Or, you can uninstall the Google Voice and Video plugin. To do this: \n" +
"- Go to /Library/Application Support/Google/ \n" +
"- You will see 'GoogleVoiceAndVideoUninstaller.app'. \n" +
"- Close all browser windows and then open this app.";
}
private static function connectionError(serverUrl:String):String{
return "The connection failed while trying to check video connectivity with the " +
"server at " + serverUrl + ". Please contact your server administrator.";
}
public function stop():void{
if (ns != null) ns.close();
}
]]>
</mx:Script>
<mx:UIComponent id="videoHolder" width="{camWidth}" height="{camHeight}" />
<mx:HBox horizontalAlign="center" verticalAlign="middle" width="100%">
<mx:ComboBox id="cmbCameraSelector" dataProvider="{Camera.names}" y="250" width="150"
change="showCamera()" textAlign="left"/>
</mx:HBox>
</mx:VBox>

View File

@ -1,27 +0,0 @@
/**
* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
*
* Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation; either version 3.0 of the License, or (at your option) any later
* version.
*
* BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along
* with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
*
*/
package org.bigbluebutton.modules.settings.connectors
{
public class AppsConnector
{
public function AppsConnector()
{
}
}
}

View File

@ -1,142 +0,0 @@
/**
* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
*
* Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation; either version 3.0 of the License, or (at your option) any later
* version.
*
* BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along
* with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
*
*/
package org.bigbluebutton.modules.settings.connectors
{
import flash.events.AsyncErrorEvent;
import flash.events.IOErrorEvent;
import flash.events.NetStatusEvent;
import flash.events.SecurityErrorEvent;
import flash.media.Microphone;
import flash.media.SoundCodec;
import flash.net.NetConnection;
import flash.net.NetStream;
import mx.controls.Alert;
import org.bigbluebutton.modules.settings.util.Requirements;
public class AudioConnector
{
public static const CONNECT_SUCCESS:String = "NetConnection.Connect.Success";
public static const CONNECT_FAILED:String = "NetConnection.Connect.Failed";
public static const CONNECT_CLOSED:String = "NetConnection.Connect.Closed";
public static const INVALID_APP:String = "NetConnection.Connect.InvalidApp";
public static const APP_SHUTDOWN:String = "NetConnection.Connect.AppShutDown";
public static const CONNECT_REJECTED:String = "NetConnection.Connect.Rejected";
private var audioCodec:String = "SPEEX";
private var connection:NetConnection;
private var outgoingStream:NetStream;
private var incomingStream:NetStream;
private var streamName:String;
private var mic:Microphone;
public function AudioConnector(mic:Microphone)
{
this.mic = mic;
connection = new NetConnection();
connection.proxyType = "best";
connection.client = this;
connection.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus);
connection.addEventListener(AsyncErrorEvent.ASYNC_ERROR, onAsyncError);
connection.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
connection.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
connection.connect(Requirements.bbb_voice_url);
}
private function onNetStatus(e:NetStatusEvent):void{
switch(e.info.code){
case CONNECT_SUCCESS:
connectAudio();
break;
case CONNECT_FAILED:
trace("AudioConnector::onNetStatus - connection to Audio App failed");
break;
case CONNECT_CLOSED:
trace("AudioConnector::onNetStatus - connection to Audio App closed");
break;
case CONNECT_REJECTED:
trace("AudioConnector::onNetStatus - connection to Audio App rejected");
break;
default:
trace("AudioConnector::onNetStatus - something else happened: " + e.info.code);
break;
}
}
private function onAsyncError(e:AsyncErrorEvent):void{
trace("AudioConnector::onAsyncError - an async error occured on the audio connection");
}
private function onSecurityError(e:SecurityErrorEvent):void{
trace("AudioConnector::onSecurityError - a security error occured on the audio connection");
}
private function onIOError(e:IOErrorEvent):void{
trace("AudioConnector::onIOError - an IO error occured on the audio connection");
}
private function connectAudio():void{
outgoingStream = new NetStream(connection);
outgoingStream.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus);
streamName = Math.random().toString();
setupMicrophone();
outgoingStream.attachAudio(mic);
outgoingStream.publish(streamName, "live");
}
public function changeMic(mic:Microphone):void{
this.mic = mic;
setupMicrophone();
outgoingStream.attachAudio(mic);
}
private function setupMicrophone():void {
mic.setUseEchoSuppression(true);
//TODO Set loopBack to false once this is connected to the Asterisk/Freeswitch echo application
mic.setLoopBack(true);
mic.setSilenceLevel(0,20000);
if (audioCodec == "SPEEX") {
mic.encodeQuality = 6;
mic.codec = SoundCodec.SPEEX;
mic.framesPerPacket = 1;
mic.rate = 16;
} else {
mic.codec = SoundCodec.NELLYMOSER;
mic.rate = 8;
}
mic.gain = 60;
}
public function stop():void{
if (mic != null){
mic.setLoopBack(false);
mic = null;
}
if (outgoingStream != null) outgoingStream.close();
if (incomingStream != null) incomingStream.close();
}
}
}

View File

@ -1,249 +0,0 @@
/**
* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
*
* Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation; either version 3.0 of the License, or (at your option) any later
* version.
*
* BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along
* with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
*
*/
package org.bigbluebutton.modules.settings.connectors
{
import flash.events.AsyncErrorEvent;
import flash.events.IOErrorEvent;
import flash.events.NetStatusEvent;
import flash.events.SecurityErrorEvent;
import flash.net.NetConnection;
import flash.net.Responder;
import flash.net.SharedObject;
import org.bigbluebutton.modules.settings.util.Requirements;
/**
* The DeskShareProxy communicates with the Red5 deskShare server application
* @author Snap
*
*/
public class DeskShareConnector
{
public static const CONNECT_SUCCESS:String = "NetConnection.Connect.Success";
public static const CONNECT_FAILED:String = "NetConnection.Connect.Failed";
public static const CONNECT_CLOSED:String = "NetConnection.Connect.Closed";
public static const INVALID_APP:String = "NetConnection.Connect.InvalidApp";
public static const APP_SHUTDOWN:String = "NetConnection.Connect.AppShutDown";
public static const CONNECT_REJECTED:String = "NetConnection.Connect.Rejected";
public static const NETSTREAM_PUBLISH:String = "NetStream.Publish.Start";
public var nc:NetConnection;
private var deskSO:SharedObject;
private var responder:Responder;
private var width:Number;
private var height:Number;
private var uri:String;
public var room:String = Math.random().toString();;
private var appletStartedCallback:Function;
private var startViewingCallback:Function;
private var stopViewingCallback:Function;
public function DeskShareConnector(appletStartedCallback:Function, startViewingCallback:Function, stopViewingCallback:Function)
{
this.appletStartedCallback = appletStartedCallback;
this.startViewingCallback = startViewingCallback;
this.stopViewingCallback = stopViewingCallback;
connect();
}
public function connect():void {
this.uri = Requirements.bbb_deskshare_url + "/" + this.room;
trace("Deskshare Service connecting to " + uri);
nc = new NetConnection()
nc.proxyType = "best";
nc.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus);
nc.addEventListener(AsyncErrorEvent.ASYNC_ERROR, onAsyncError);
nc.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
nc.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
nc.connect(uri);
responder = new Responder(
function(result:Object):void{
if (result != null && (result.publishing as Boolean)){
width = result.width as Number;
height = result.height as Number;
trace("Desk Share stream is streaming [" + width + "," + height + "]");
startViewingCallback(width, height);
} else {
trace("No deskshare stream being published");
}
},
function(status:Object):void{
trace("Error while trying to call remote mathod on server");
}
);
}
public function disconnect():void{
if (nc != null) nc.close();
}
private function onNetStatus(e:NetStatusEvent):void{
switch(e.info.code){
case CONNECT_SUCCESS:
connectionSuccessHandler();
break;
case CONNECT_FAILED:
trace("VideoConnector::onNetStatus - connection to Video App failed");
break;
case CONNECT_CLOSED:
trace("VideoConnector::onNetStatus - connection to Video App closed");
break;
case CONNECT_REJECTED:
trace("VideoConnector::onNetStatus - connection to Video App rejected");
break;
case NETSTREAM_PUBLISH:
break;
default:
trace("VideoConnector::onNetStatus - something else happened: " + e.info.code);
break;
}
}
private function onAsyncError(e:AsyncErrorEvent):void{
trace("VideoConnector::onAsyncError - an async error occured on the video connection");
}
private function onSecurityError(e:SecurityErrorEvent):void{
trace("VideoConnector::onSecurityError - a security error occured on the video connection");
}
private function onIOError(e:IOErrorEvent):void{
trace("VideoConnector::onIOError - an IO error occured on the video connection");
}
private function connectionSuccessHandler():void{
trace("Successully connection to " + uri);
deskSO = SharedObject.getRemote("deskSO", uri, false);
deskSO.client = this;
deskSO.connect(nc);
checkIfStreamIsPublishing();
}
public function getConnection():NetConnection{
return nc;
}
/**
* Called by server when client connects.
*/
public function onBWDone():void{
// do nothing
}
/**
* Invoked on the server once the clients' applet has started sharing and the server has started a video stream
*
*/
public function appletStarted(videoWidth:Number, videoHeight:Number):void{
trace("Got applet started");
appletStartedCallback(videoWidth, videoHeight);
}
/**
* Call this method to send out a room-wide notification to start viewing the stream
*
*/
public function sendStartViewingNotification(captureWidth:Number, captureHeight:Number):void{
try{
deskSO.send("startViewing", captureWidth, captureHeight);
} catch(e:Error){
trace("error while trying to send start viewing notification");
}
}
public function sendStartedViewingNotification():void{
trace("Sending start viewing to server");
nc.call("deskshare.startedToViewStream", null);
}
/**
* Called by the server when a notification is received to start viewing the broadcast stream .
* This method is called on successful execution of sendStartViewingNotification()
*
*/
public function startViewing(videoWidth:Number, videoHeight:Number):void{
trace("startViewing invoked by server");
startViewingCallback(videoWidth, videoHeight);
}
/**
* Sends a notification through the server to all the participants in the room to stop viewing the stream
*
*/
public function sendStopViewingNotification():void{
trace("Sending stop viewing notification to other clients.");
try{
deskSO.send("stopViewing");
} catch(e:Error){
trace("could not send stop viewing notification");
}
}
/**
* Called by the server to notify clients that the deskshare stream has stooped.
*/
public function deskshareStreamStopped():void {
stopViewing();
}
/**
* Sends a notification to the module to stop viewing the stream
* This method is called on successful execution of sendStopViewingNotification()
*
*/
public function stopViewing():void{
trace("Received dekskshareStreamStopped");
stopViewingCallback();
}
public function mouseLocationCallback(x:Number, y:Number):void {
//var event:CursorEvent = new CursorEvent(CursorEvent.UPDATE_CURSOR_LOC_EVENT);
//event.x = x;
//event.y = y;
//dispatcher.dispatchEvent(event);
}
/**
* Check if anybody is publishing the stream for this room
* This method is useful for clients which have joined a room where somebody is already publishing
*
*/
private function checkIfStreamIsPublishing():void{
trace("checking if desk share stream is publishing");
nc.call("deskshare.checkIfStreamIsPublishing", responder);
}
public function calculateEncodingDimensions(captureWidth:Number, captureHeight:Number):void{
height = captureHeight;
width = captureWidth;
}
}
}

View File

@ -1,120 +0,0 @@
/**
* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
*
* Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation; either version 3.0 of the License, or (at your option) any later
* version.
*
* BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along
* with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
*
*/
package org.bigbluebutton.modules.settings.connectors
{
import flash.events.AsyncErrorEvent;
import flash.events.IOErrorEvent;
import flash.events.NetStatusEvent;
import flash.events.SecurityErrorEvent;
import flash.media.Camera;
import flash.media.Video;
import flash.net.NetConnection;
import flash.net.NetStream;
import org.bigbluebutton.modules.settings.util.Requirements;
public class VideoConnector
{
public static const CONNECT_SUCCESS:String = "NetConnection.Connect.Success";
public static const CONNECT_FAILED:String = "NetConnection.Connect.Failed";
public static const CONNECT_CLOSED:String = "NetConnection.Connect.Closed";
public static const INVALID_APP:String = "NetConnection.Connect.InvalidApp";
public static const APP_SHUTDOWN:String = "NetConnection.Connect.AppShutDown";
public static const CONNECT_REJECTED:String = "NetConnection.Connect.Rejected";
public static const NETSTREAM_PUBLISH:String = "NetStream.Publish.Start";
public var connection:NetConnection;
private var outgoingStream:NetStream;
private var incomingStream:NetStream;
private var camera:Camera;
private var streamListener:Function;
public var streamName:String;
public function VideoConnector(connectionListener:Function)
{
connection = new NetConnection();
connection.proxyType = "best";
connection.client = this;
connection.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus);
connection.addEventListener(NetStatusEvent.NET_STATUS, connectionListener);
connection.addEventListener(AsyncErrorEvent.ASYNC_ERROR, onAsyncError);
connection.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
connection.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
connectToServer();
}
public function connectToServer():void{
connection.connect(Requirements.bbb_video_url);
}
private function onNetStatus(e:NetStatusEvent):void{
switch(e.info.code){
case CONNECT_SUCCESS:
//connectVideo();
break;
case CONNECT_FAILED:
trace("VideoConnector::onNetStatus - connection to Video App failed");
break;
case CONNECT_CLOSED:
trace("VideoConnector::onNetStatus - connection to Video App closed");
break;
case CONNECT_REJECTED:
trace("VideoConnector::onNetStatus - connection to Video App rejected");
break;
case NETSTREAM_PUBLISH:
break;
default:
trace("VideoConnector::onNetStatus - something else happened: " + e.info.code);
break;
}
}
private function onAsyncError(e:AsyncErrorEvent):void{
trace("VideoConnector::onAsyncError - an async error occured on the video connection");
}
private function onSecurityError(e:SecurityErrorEvent):void{
trace("VideoConnector::onSecurityError - a security error occured on the video connection");
}
private function onIOError(e:IOErrorEvent):void{
trace("VideoConnector::onIOError - an IO error occured on the video connection");
}
public function connectVideo(camera:Camera, streamListener:Function):void{
outgoingStream = new NetStream(connection);
outgoingStream.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus);
outgoingStream.addEventListener(NetStatusEvent.NET_STATUS, streamListener);
streamName = Math.random().toString();
outgoingStream.attachCamera(camera);
outgoingStream.publish(streamName);
}
public function changeCamera(camera:Camera):void{
this.camera = camera;
outgoingStream.attachCamera(camera);
}
}
}

View File

@ -1,32 +0,0 @@
/**
* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
*
* Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation; either version 3.0 of the License, or (at your option) any later
* version.
*
* BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along
* with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
*
*/
package org.bigbluebutton.modules.settings.uihelpers
{
import flash.events.Event;
public class JavaOKEvent extends Event
{
public static const JAVA_A_OK:String = "Java is alright, sometimes";
public function JavaOKEvent(type:String)
{
super(type, true, false);
}
}
}

View File

@ -1,56 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
This program is free software; you can redistribute it and/or modify it under the
terms of the GNU Lesser General Public License as published by the Free Software
Foundation; either version 3.0 of the License, or (at your option) any later
version.
BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along
with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
-->
<mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="400" height="330">
<mx:Script>
<![CDATA[
import mx.managers.PopUpManager;
import org.bigbluebutton.util.i18n.ResourceUtil;
private var callback:Function;
public function setAlert(text:String, optionalButtonLabel:String = null, optionalButtonCallback:Function = null):void{
txtAlert.htmlText = text;
if (optionalButtonLabel != null) {
btnOptionalAction.label = optionalButtonLabel;
btnOptionalAction.visible = true;
}
if (optionalButtonCallback != null) callback = optionalButtonCallback;
}
public function closePopUp():void{
PopUpManager.removePopUp(this);
}
private function onOptionalButtonClick():void{
callback();
}
]]>
</mx:Script>
<mx:VBox horizontalAlign="center" width="100%" height="100%">
<mx:Label text="{ResourceUtil.getInstance().getString('bbb.settings.warning.label')}" fontSize="24" height="10%" color="red" />
<mx:Text id="txtAlert" width="100%" height="65%" paddingBottom="10" paddingLeft="10" paddingRight="10" paddingTop="10" />
<mx:Button id="btnOptionalAction" click="onOptionalButtonClick()" label="" visible="false" />
<mx:Button id="btnClose" label="{ResourceUtil.getInstance().getString('bbb.settings.warning.close')}" click="closePopUp()" />
</mx:VBox>
</mx:TitleWindow>

View File

@ -1,52 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
This program is free software; you can redistribute it and/or modify it under the
terms of the GNU Lesser General Public License as published by the Free Software
Foundation; either version 3.0 of the License, or (at your option) any later
version.
BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along
with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
-->
<mx:Button xmlns:mx="http://www.adobe.com/2006/mxml" width="250"
click="showWarning()" textAlign="left" >
<mx:Script>
<![CDATA[
import mx.core.FlexGlobals;
import mx.managers.PopUpManager;
private var warningLabel:String;
private var warningText:String
private var optionalLabel:String;
private var optionalCallback:Function;
public function setWarning(e:WarningEvent):void{
this.warningLabel = e.warningLabel;
this.warningText = e.warningText;
this.optionalLabel = e.optionalCommandText;
this.optionalCallback = e.optionalCallbackFunction;
this.label = warningLabel;
}
private function showWarning():void{
var userAlert:UserAlert = UserAlert(PopUpManager.createPopUp(this.parent, UserAlert, true));
userAlert.setAlert(warningText, optionalLabel, optionalCallback);
// userAlert.x = FlexGlobals.topLevelApplication.mx_internal.Application.width/2 - userAlert.width/2;
// userAlert.y = FlexGlobals.topLevelApplication.mx_internal.Application.height/2 - userAlert.height/2;
userAlert.x = 0;
userAlert.y = 0;
}
]]>
</mx:Script>
</mx:Button>

View File

@ -1,27 +0,0 @@
/**
* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
*
* Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation; either version 3.0 of the License, or (at your option) any later
* version.
*
* BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along
* with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
*
*/
package org.bigbluebutton.modules.settings.util
{
public class FlashCheck
{
public function FlashCheck()
{
}
}
}

View File

@ -1,115 +0,0 @@
/**
* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
*
* Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation; either version 3.0 of the License, or (at your option) any later
* version.
*
* BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along
* with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
*
*/
package org.bigbluebutton.modules.settings.util
{
import flash.external.ExternalInterface;
public class JavaCheck
{
public static function createWebStartLaunchButton(jnlp:String, minimumVersion:String):void{
var response:Object = ExternalInterface.call("deployJava.createWebStartLaunchButton", jnlp, minimumVersion);
if (response == null) throw new Error("Javascript files not found.");
}
public static function createWebStartLaunchButtonEx(jnlp:String, minimumVersion:String):void{
var response:Object = ExternalInterface.call("deployJava.createWebStartLaunchButtonEx", jnlp, minimumVersion);
if (response == null) throw new Error("Javascript files not found.");
}
public static function getBrowser():String{
var browser:String = ExternalInterface.call("deployJava.getBrowser");
if (browser == null) throw new Error("Javascript files not found.");
return browser;
}
public static function getJREs():Array{
var installedJREs:Array = ExternalInterface.call("deployJava.getJREs");
if (installedJREs == null) throw new Error("Javascript files not found.");
return installedJREs;
}
public static function installJRE(requestVersion:String):void{
var response:Object = ExternalInterface.call("deployJava.installJRE", requestVersion);
if (response == null) throw new Error("Javascript files not found.");
}
public static function installLatestJRE():void{
var response:Object = ExternalInterface.call("deployJava.installLatestJRE");
if (response == null) throw new Error("Javascript files not found.");
}
public static function isPlugin2():Boolean{
var plugin2:String = ExternalInterface.call("deployJava.isPlugin2");
if (plugin2 == null) throw new Error("Javascript files not found.");
if (plugin2 == "true") return true;
else return false;
}
public static function isWebStartInstalled(minimumVersion:String):Boolean{
var webstartInstalled:String = ExternalInterface.call("deployJava.isWebStartInstalled", minimumVersion);
if (webstartInstalled == null) throw new Error("Javascript files not found.");
if (webstartInstalled == "true") return true;
else return false;
}
public static function runApplet(attributes:Object, parameters:Object, minimumVersion:String):void{
var response:Object = ExternalInterface.call("deployJava.runApplet", attributes, parameters, minimumVersion);
if (response == null) throw new Error("Javascript files not found.");
}
public static function setAdditionalPackages(packageList:Object):void{
var response:Object = ExternalInterface.call("deployJava.setAdditionalPackages", packageList);
if (response == null) throw new Error("Javascript files not found.");
}
public static function setInstallerType(type:String):void{
var response:Object = ExternalInterface.call("deployJava.setInstallerType", type);
if (response == null) throw new Error("Javascript files not found.");
}
public static function versionCheck(version:String):String{
var version:String = ExternalInterface.call("deployJava.versionCheck", version);
if (version == null) throw new Error("Javascript files not found.");
return version;
}
public static function writeAppletTag(attributes:Object, parameters:Object = null):void{
var response:Object = ExternalInterface.call("deployJava.writeAppletTag", attributes, parameters);
if (response == null) throw new Error("Javascript files not found.");
}
}
}

View File

@ -1,74 +0,0 @@
/**
* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
*
* Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation; either version 3.0 of the License, or (at your option) any later
* version.
*
* BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along
* with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
*
*/
package org.bigbluebutton.modules.settings.util
{
import flash.net.SharedObject;
public class PersistUserPreferences
{
private static var sharedObject:SharedObject = SharedObject.getLocal("bbbUserProperties", "/");
public static function storeData(preference:String, data:String):void{
sharedObject.data[preference] = data;
try{
sharedObject.flush(1000);
} catch(err:Error){
trace("Could not flush shared object");
}
}
public static function saveWebcamPreference(webcam:String):void{
sharedObject.data["webcam"] = webcam;
try{
sharedObject.flush(1000);
} catch(err:Error){
trace("Could not flush shared object");
}
}
public static function saveMicrophonePreference(microphone:String):void{
sharedObject.data["microphone"] = microphone;
try{
sharedObject.flush(1000);
} catch(err:Error){
trace("Could not flush shared object");
}
}
public static function saveMicrophoneGain(gain:Number):void{
if (gain > 100 || gain < 0) return;
sharedObject.data["gain"] = gain;
try{
sharedObject.flush(1000);
} catch(err:Error){
trace("Could not flush shared object");
}
}
public static function saveSettingsVisited():void{
sharedObject.data["previouslyvisited"] = true;
try{
sharedObject.flush(1000);
} catch(err:Error){
trace("Could not flush shared object");
}
}
}
}

View File

@ -1,58 +0,0 @@
/**
* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
*
* Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation; either version 3.0 of the License, or (at your option) any later
* version.
*
* BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along
* with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
*
*/
package org.bigbluebutton.modules.settings.util
{
import flash.events.Event;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.URLRequestHeader;
import flash.net.URLRequestMethod;
import mx.collections.ArrayCollection;
public class Requirements
{
public static var bbb_apps_url:String;
public static var bbb_voice_url:String;
public static var bbb_video_url:String;
public static var bbb_deskshare_url:String;
public static var flash_required_version:String;
public static var java_required_version:String;
public static var check_deskshare:String = "false";
private static var loader:URLLoader;
private static var isLoaded:Boolean = false;
private static var loadingStarted:Boolean = false;
public static function setRequirements(attributes:Object):void{
isLoaded = true;
//bbb_apps_url = xml.bigbluebutton_apps.@url;
bbb_video_url = attributes.video;
bbb_voice_url = attributes.voice;
bbb_deskshare_url = attributes.deskshare;
flash_required_version = attributes.flash_required;
java_required_version = attributes.java_required;
check_deskshare = attributes.check_deskshare;
}
}
}

View File

@ -194,7 +194,7 @@
<div class="row">
<div class="span twelve center">
<p>Copyright &copy; 2014 BigBlueButton Inc.<br>
<p>Copyright &copy; 2015 BigBlueButton Inc.<br>
<small>Version <a href="https://code.google.com/p/bigbluebutton/wiki/090Docs">0.9.0-beta</a></small>
</p>
</div>

View File

@ -19,6 +19,7 @@ task resolveDeps(type: Copy) {
* (ralam Oct 4, 2009)
*/
repositories {
mavenCentral()
add(new org.apache.ivy.plugins.resolver.ChainResolver()) {
name = 'remote'
returnFirst = true
@ -62,6 +63,8 @@ repositories {
addArtifactPattern "http://red5.googlecode.com/svn/repository/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"
addArtifactPattern "http://red5.googlecode.com/svn/repository/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"
}
mavenRepo name: "sonatype-snapshot", urls: "http://oss.sonatype.org/content/repositories/snapshots"
mavenRepo name: "sonatype-releases", urls: "http://oss.sonatype.org/content/repositories/releases"
}
}
@ -81,9 +84,9 @@ dependencies {
providedCompile 'org.springframework:spring-core:4.0.8.RELEASE@jar'
// Red5
providedCompile 'org/red5:red5-server:1.0.4-RELEASE@jar'
providedCompile 'org.red5:red5-io:1.0.4-RELEASE@jar'
providedCompile 'org/red5:red5-server-common:1.0.4-RELEASE@jar'
providedCompile 'org/red5:red5-server:1.0.5-jan122015-SNAPSHOT@jar'
providedCompile 'org.red5:red5-server-common:1.0.5-SNAPSHOT@jar'
providedCompile 'org.red5:red5-io:1.0.5-SNAPSHOT@jar'
// Logging
providedCompile 'ch.qos.logback:logback-core:1.1.2@jar'
@ -100,11 +103,11 @@ dependencies {
providedCompile 'aopalliance:aopalliance:1.0@jar'
// Testing
compile 'org.testng:testng:5.8@jar'
//compile 'org.testng:testng:5.8@jar'
compile 'org.easymock:easymock:2.4@jar'
// Testing
testRuntime 'org/testng:testng:5.8@jar'
//testRuntime 'org/testng:testng:5.8@jar'
testRuntime 'org.easymock:easymock:2.4@jar'
// Tunnelling servlet
@ -129,7 +132,7 @@ dependencies {
// Libraries needed for scala api
compile 'org.scala-lang:scala-library:2.9.2'
compile 'net.lag:configgy:2.0.0'
compile 'net.lag:configgy:2.0.0@jar'
//redis
compile 'redis.clients:jedis:1.5.1'

View File

@ -13,6 +13,7 @@ task resolveDeps(type: Copy) {
* (ralam Oct 4, 2009)
*/
repositories {
mavenCentral()
add(new org.apache.ivy.plugins.resolver.ChainResolver()) {
name = 'remote'
returnFirst = true
@ -56,6 +57,8 @@ repositories {
addArtifactPattern "http://red5.googlecode.com/svn/repository/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"
addArtifactPattern "http://red5.googlecode.com/svn/repository/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"
}
mavenRepo name: "sonatype-snapshot", urls: "http://oss.sonatype.org/content/repositories/snapshots"
mavenRepo name: "sonatype-releases", urls: "http://oss.sonatype.org/content/repositories/releases"
}
}
@ -79,9 +82,9 @@ dependencies {
compile 'org.springframework:spring-core:4.0.8.RELEASE@jar'
// Red5
compile 'org/red5:red5-server:1.0.4-RELEASE@jar'
compile 'org.red5:red5-io:1.0.4-RELEASE@jar'
compile 'org/red5:red5-server-common:1.0.4-RELEASE@jar'
compile 'org/red5:red5-server:1.0.5-jan122015-SNAPSHOT@jar'
compile 'org.red5:red5-server-common:1.0.5-SNAPSHOT@jar'
compile 'org.red5:red5-io:1.0.5-SNAPSHOT@jar'
// Logging
compile 'ch.qos.logback:logback-core:1.1.2@jar'
@ -97,7 +100,7 @@ dependencies {
compile 'aopalliance:aopalliance:1.0@jar'
// Testing
compile 'org.testng:testng:5.8@jar'
// compile 'org.testng:testng:5.8@jar'
compile 'org.easymock:easymock:2.4@jar'
compile project(':common')
@ -111,7 +114,7 @@ dependencies {
// Libraries needed for scala api
compile 'org.scala-lang:scala-library:2.9.2'
compile 'net.lag:configgy:2.0.0'
compile 'net.lag:configgy:2.0.0@jar'
//redis
compile 'redis.clients:jedis:2.0.0'
@ -127,6 +130,7 @@ subprojects {
apply plugin: 'eclipse'
repositories {
mavenCentral()
add(new org.apache.ivy.plugins.resolver.ChainResolver()) {
name = 'remote'
returnFirst = true
@ -165,6 +169,8 @@ subprojects {
addArtifactPattern "http://repository.springsource.com/maven/bundles/release/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"
}
}
mavenRepo name: "sonatype-snapshot", urls: "http://oss.sonatype.org/content/repositories/snapshots"
mavenRepo name: "sonatype-releases", urls: "http://oss.sonatype.org/content/repositories/releases"
}
group = 'org.bigbluebutton'