http://git-wip-us.apache.org/repos/asf/openmeetings/blob/8e63647c/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/FormatHelper.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/FormatHelper.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/FormatHelper.java
index c1788f7..64409b7 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/FormatHelper.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/FormatHelper.java
@@ -1,81 +1,81 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License") +  you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.openmeetings.db.util;
-
-import static org.apache.commons.lang3.StringEscapeUtils.escapeHtml4;
-
-import java.util.regex.Pattern;
-
-import org.apache.openmeetings.db.entity.user.User;
-
-public class FormatHelper {
-       /**
-        * taken from BidiUtils
-        * 
-        * A regular expression for matching right-to-left language codes. See
-        * {@link #isRtlLanguage} for the design.
-        */
-       private static final Pattern RtlLocalesRe = 
Pattern.compile("^(ar|dv|he|iw|fa|nqo|ps|sd|ug|ur|yi|.*[-_](Arab|Hebr|Thaa|Nkoo|Tfng))"
-                                       + 
"(?!.*[-_](Latn|Cyrl)($|-|_))($|-|_)");
-
-       /**
-        * Check if a BCP 47 / III language code indicates an RTL language, i.e.
-        * either: - a language code explicitly specifying one of the 
right-to-left
-        * scripts, e.g. "az-Arab", or
-        * <p>
-        * - a language code specifying one of the languages normally written 
in a
-        * right-to-left script, e.g. "fa" (Farsi), except ones explicitly
-        * specifying Latin or Cyrillic script (which are the usual LTR
-        * alternatives).
-        * <p>
-        * The list of right-to-left scripts appears in the 100-199 range in
-        * http://www.unicode.org/iso15924/iso15924-num.html, of which Arabic 
and
-        * Hebrew are by far the most widely used. We also recognize Thaana, 
N'Ko,
-        * and Tifinagh, which also have significant modern usage. The rest 
(Syriac,
-        * Samaritan, Mandaic, etc.) seem to have extremely limited or no modern
-        * usage and are not recognized. The languages usually written in a
-        * right-to-left script are taken as those with Suppress-Script:
-        * Hebr|Arab|Thaa|Nkoo|Tfng in
-        * http://www.iana.org/assignments/language-subtag-registry, as well as
-        * Sindhi (sd) and Uyghur (ug). The presence of other subtags of the
-        * language code, e.g. regions like EG (Egypt), is ignored.
-        */
-       public static boolean isRtlLanguage(String languageString) {
-               return languageString != null && 
RtlLocalesRe.matcher(languageString).find();
-       }
-
-       public static String formatUser(User u) {
-               return formatUser(u, false);
-       }
-
-       // TODO check RIGHTS here (email might need to be hidden)
-       public static String formatUser(User u, boolean isHTMLEscape) {
-               String user = "";
-               if (u != null) {
-                       String email = u.getAddress() == null ? "" : 
u.getAddress().getEmail();
-                       if (u.getFirstname() == null && u.getLastname() == 
null) {
-                               user = email;
-                       } else {
-                               user = String.format("\"%s %s\" <%s>", 
u.getFirstname(), u.getLastname(), email);
-                       }
-                       user = isHTMLEscape ? escapeHtml4(user) : user;
-               }
-               return user;
-       }
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.db.util;
+
+import static org.apache.commons.lang3.StringEscapeUtils.escapeHtml4;
+
+import java.util.regex.Pattern;
+
+import org.apache.openmeetings.db.entity.user.User;
+
+public class FormatHelper {
+       /**
+        * taken from BidiUtils
+        * 
+        * A regular expression for matching right-to-left language codes. See
+        * {@link #isRtlLanguage} for the design.
+        */
+       private static final Pattern RtlLocalesRe = 
Pattern.compile("^(ar|dv|he|iw|fa|nqo|ps|sd|ug|ur|yi|.*[-_](Arab|Hebr|Thaa|Nkoo|Tfng))"
+                                       + 
"(?!.*[-_](Latn|Cyrl)($|-|_))($|-|_)");
+
+       /**
+        * Check if a BCP 47 / III language code indicates an RTL language, i.e.
+        * either: - a language code explicitly specifying one of the 
right-to-left
+        * scripts, e.g. "az-Arab", or
+        * <p>
+        * - a language code specifying one of the languages normally written 
in a
+        * right-to-left script, e.g. "fa" (Farsi), except ones explicitly
+        * specifying Latin or Cyrillic script (which are the usual LTR
+        * alternatives).
+        * <p>
+        * The list of right-to-left scripts appears in the 100-199 range in
+        * http://www.unicode.org/iso15924/iso15924-num.html, of which Arabic 
and
+        * Hebrew are by far the most widely used. We also recognize Thaana, 
N'Ko,
+        * and Tifinagh, which also have significant modern usage. The rest 
(Syriac,
+        * Samaritan, Mandaic, etc.) seem to have extremely limited or no modern
+        * usage and are not recognized. The languages usually written in a
+        * right-to-left script are taken as those with Suppress-Script:
+        * Hebr|Arab|Thaa|Nkoo|Tfng in
+        * http://www.iana.org/assignments/language-subtag-registry, as well as
+        * Sindhi (sd) and Uyghur (ug). The presence of other subtags of the
+        * language code, e.g. regions like EG (Egypt), is ignored.
+        */
+       public static boolean isRtlLanguage(String languageString) {
+               return languageString != null && 
RtlLocalesRe.matcher(languageString).find();
+       }
+
+       public static String formatUser(User u) {
+               return formatUser(u, false);
+       }
+
+       // TODO check RIGHTS here (email might need to be hidden)
+       public static String formatUser(User u, boolean isHTMLEscape) {
+               String user = "";
+               if (u != null) {
+                       String email = u.getAddress() == null ? "" : 
u.getAddress().getEmail();
+                       if (u.getFirstname() == null && u.getLastname() == 
null) {
+                               user = email;
+                       } else {
+                               user = String.format("\"%s %s\" <%s>", 
u.getFirstname(), u.getLastname(), email);
+                       }
+                       user = isHTMLEscape ? escapeHtml4(user) : user;
+               }
+               return user;
+       }
+}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/8e63647c/openmeetings-db/src/site/site.xml
----------------------------------------------------------------------
diff --git a/openmeetings-db/src/site/site.xml 
b/openmeetings-db/src/site/site.xml
index c26954e..0d9f35c 100644
--- a/openmeetings-db/src/site/site.xml
+++ b/openmeetings-db/src/site/site.xml
@@ -1,40 +1,40 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
- -->
-<project xmlns="http://maven.apache.org/DECORATION/1.7.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
-  xsi:schemaLocation="http://maven.apache.org/DECORATION/1.7.0 
http://maven.apache.org/xsd/decoration-1.7.0.xsd";
-  name="Apache OpenMeetings Project">
-
-       <body>
-               <menu ref="parent"/>
-               <menu name="Project">
-                       <item name="About" href="/index.html" />
-                       <item name="Info" href="/project-info.html" />
-                       <item name="Summary" href="/project-summary.html" />
-                       <item name="License" href="/license.html" />
-                       <item name="Dependencies" href="/dependencies.html" />
-                       <item name="Dependency Convergence" 
href="/dependency-convergence.html" />
-                       <item name="RAT Report" href="/rat-report.html" />
-                       <item name="JavaDoc" href="/apidocs/index.html" 
target="_blank" />
-               </menu>
-       </body>
-       <custom>
-               <reflowSkin>
-                       <bottomNav maxSpan="12">
-                               <column>Parent Project</column>
-                               <column>Project</column>
-                       </bottomNav>
-               </reflowSkin>
-       </custom>
-</project>
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ -->
+<project xmlns="http://maven.apache.org/DECORATION/1.7.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+  xsi:schemaLocation="http://maven.apache.org/DECORATION/1.7.0 
http://maven.apache.org/xsd/decoration-1.7.0.xsd";
+  name="Apache OpenMeetings Project">
+
+       <body>
+               <menu ref="parent"/>
+               <menu name="Project">
+                       <item name="About" href="/index.html" />
+                       <item name="Info" href="/project-info.html" />
+                       <item name="Summary" href="/project-summary.html" />
+                       <item name="License" href="/license.html" />
+                       <item name="Dependencies" href="/dependencies.html" />
+                       <item name="Dependency Convergence" 
href="/dependency-convergence.html" />
+                       <item name="RAT Report" href="/rat-report.html" />
+                       <item name="JavaDoc" href="/apidocs/index.html" 
target="_blank" />
+               </menu>
+       </body>
+       <custom>
+               <reflowSkin>
+                       <bottomNav maxSpan="12">
+                               <column>Parent Project</column>
+                               <column>Project</column>
+                       </bottomNav>
+               </reflowSkin>
+       </custom>
+</project>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/8e63647c/openmeetings-flash/src/main/flex/main.mxml
----------------------------------------------------------------------
diff --git a/openmeetings-flash/src/main/flex/main.mxml 
b/openmeetings-flash/src/main/flex/main.mxml
index f275526..de24955 100644
--- a/openmeetings-flash/src/main/flex/main.mxml
+++ b/openmeetings-flash/src/main/flex/main.mxml
@@ -1,321 +1,321 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
-
--->
-<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009";
-               xmlns:s="library://ns.adobe.com/flex/spark"
-               xmlns:mx="library://ns.adobe.com/flex/mx"
-               width="570" height="900" pageTitle="Openmeetings" fontSize="12"
-               applicationComplete="appInit(event)" 
uncaughtError="uncaughtError(event)">
-       <fx:Declarations>
-               <!-- Place non-visual elements (e.g., services, value objects) 
here -->
-               <mx:TraceTarget/>
-       </fx:Declarations>
-       <fx:Script><![CDATA[
-               import mx.core.FlexGlobals;
-
-               import org.apache.openmeetings.OmVideo;
-
-               private var audioOnly:Boolean = false;
-               private var FPS:int;
-               private var bandwidth:int = 0;
-               private var quality:int = 100;
-               private var echoPath:int = 256;
-               private var echoSuppression:Boolean = true;
-               private var microphoneRateBest:int = 22;//5, 8, 11, 22, and 44
-               private var selectedMic:int = -1;
-               private var selectedCam:int = -1;
-               private var video:OmVideo;
-               private var recName:String;
-               private var mic:Microphone = null;
-               [Bindable]
-               private var interview:Boolean = false;
-
-               private function debug(...rest):void {
-                       ExternalInterface.call("console.log", rest);
-               }
-
-               private function camAvail():Boolean {
-                       return !audioOnly && Camera.names.length > 0;
-               }
-
-               private function micAvail():Boolean {
-                       return Microphone.names.length > 0;
-               }
-
-               private function appInit(evt:Event):void {
-                       var params:Object = 
FlexGlobals.topLevelApplication.parameters;
-                       debug("appInit()", params);
-                       audioOnly = 'true' == params.audioOnly;
-                       interview = 'true' == params.interview;
-                       var _fps:int = parseInt(params.fps);
-                       FPS = (isNaN(_fps) || _fps < 1 ? 30 : _fps);
-                       video = new OmVideo(videoDisplay, params);
-                       switch (params.mode) {
-                               case 'settings':
-                               {
-                                       
ExternalInterface.addCallback("getDevices", function ():Object {
-                                               return {
-                                                       cams: Camera.names
-                                                       , mics: Microphone.names
-                                               };
-                                       });
-                                       
ExternalInterface.addCallback("camChanged", function (val:int):void {
-                                               selectedCam = val;
-                                               camChanged(null);
-                                       });
-                                       
ExternalInterface.addCallback("micChanged", function (val:int):void {
-                                               selectedMic = val;
-                                               camChanged(null);
-                                       });
-                                       
ExternalInterface.addCallback("resChanged", function (width:int, 
height:int):void {
-                                               setResolution(width, height, 
true);
-                                       });
-                                       ExternalInterface.addCallback("close", 
function ():void {
-                                               video.reset();
-                                       });
-                                       ExternalInterface.addCallback("init", 
function (camIdx:int, micIdx:int, width:int, height:int):void {
-                                               selectedCam = camIdx;
-                                               selectedMic = micIdx;
-                                               setResolution(width, height, 
true);
-                                       });
-                                       
ExternalInterface.addCallback("startRec", function ():void {
-                                               startTestRecording();
-                                       });
-                                       ExternalInterface.addCallback("play", 
function ():void {
-                                               playTestRecording();
-                                       });
-                                       
ExternalInterface.call("VideoSettings.initSwf");
-                               }
-                                       break;
-                               case OmVideo.BROADCAST:
-                               {
-                                       selectedCam = params.cam;
-                                       selectedMic = params.mic;
-                                       video.resize(Math.max(300, 
params.width), Math.max(200, params.height));
-                                       attachCamera(function():void {
-                                               video.resize(params.width, 
params.height);
-                                               video.reset();
-                                               var cam:Camera = getCam();
-                                               video.attachCamera(cam);
-                                               
video.broadcast(params.broadcastId, cam, getMic());
-                                               
ExternalInterface.call("VideoManager.resetSize", params.uid);
-                                       });
-                               }
-                                       break;
-                               case OmVideo.PLAY:
-                               {
-                                       video.resize(params.width, 
params.height);
-                                       video.play(params.broadcastId); // TODO 
audio/video
-                               }
-                                       break;
-                       }
-                       ExternalInterface.addCallback("vidResize", function 
(width:int, height:int):void {
-                               video.resize(width, height);
-                               video.vidResize(width, height);
-                       });
-               }
-
-               private function uncaughtError(e:UncaughtErrorEvent):void {
-                       debug("Unexpected ERROR", e);
-               }
-
-               private function getMic():Microphone {
-                       debug("Entering getMic ...");
-                       var _micro:Microphone = null;
-                       if (selectedMic > -1) {
-                               _micro = echoPath == 0 ? 
Microphone.getMicrophone(selectedMic) : 
Microphone.getEnhancedMicrophone(selectedMic);
-
-                               if (_micro != null) {
-                                       if (echoPath == 256) {
-                                               var 
options:MicrophoneEnhancedOptions = new MicrophoneEnhancedOptions();
-                                               options.mode = 
MicrophoneEnhancedMode.FULL_DUPLEX;
-                                               options.echoPath = echoPath;
-                                               options.nonLinearProcessing = 
true;
-                                               _micro.enhancedOptions = 
options;
-                                               debug("echoPath set to " + 
echoPath + ", " + _micro.enhancedOptions);
-                                       }
-                                       _micro.codec = SoundCodec.NELLYMOSER;
-                                       _micro.framesPerPacket = 1;
-                                       _micro.setSilenceLevel(0, 2000);
-                                       debug("canvas.microphoneRateBest: " + 
microphoneRateBest);
-                                       _micro.rate = microphoneRateBest;
-                                       _micro.gain = 50;
-                                       // this has no effect if enhanced 
microphone is obtained
-                                       //Microphone setUseEchoSupression(bool)
-                                       debug("canvas.echoSuppression: " + 
echoSuppression);
-                                       
_micro.setUseEchoSuppression(echoSuppression);
-                               }
-                               debug("... getMic DONE" + _micro);
-                       }
-                       return _micro;
-               }
-
-               private function getCam():Camera {
-                       debug("Entering getCam ...");
-                       var _camera:Camera = null;
-                       if (selectedCam > -1) {
-                               _camera = Camera.getCamera("" + selectedCam);
-                               if (_camera != null && !_camera.muted) {
-                                       //FIXME need to be unified
-                                       if (interview) {
-                                               //we need a fixed frame rate 
for the videos to merge them later on
-                                               _camera.setMode(video.width, 
video.height, 24);
-                                               debug("IS INTERVIEW ");
-                                               _camera.setQuality(0, 98);
-                                       } else {
-                                               _camera.setMode(video.width, 
video.height, FPS);
-                                               debug("IS NO INTERVIEW ");
-                                               _camera.setQuality(bandwidth, 
quality);
-                                       }
-                               }
-                               debug("... getCam DONE " + _camera);
-                       }
-                       return _camera;
-               }
-
-               private function attachCamera(callback:Function):void {
-                       if (!camAvail()) {
-                               return;
-                       }
-                       debug("Camera selected:: " + selectedCam);
-                       var cam:Camera = getCam();
-                       debug("Camera selected:: " + cam);
-                       if (cam != null) {
-                               if (cam.muted) {
-                                       debug("Camera Muted");
-                                       video.attachCamera(cam);
-                                       
cam.addEventListener(StatusEvent.STATUS, function (event:StatusEvent):void {
-                                               debug("cameraStatusHandler! " + 
event);
-                                               
cam.removeEventListener(StatusEvent.STATUS, arguments.callee);
-                                               switch (event.code) {
-                                                       case 'Camera.Muted':
-                                                               debug("Unable 
to connect to active camera.");
-                                                               break;
-                                                       case 'Camera.Unmuted':
-                                                               callback();
-                                                               break;
-                                               }
-                                       });
-                               } else {
-                                       callback();
-                               }
-                       } else {
-                               var _mic:Microphone = getMic();
-                               if (_mic != null) {
-                                       if (_mic.muted) {
-                                               var nc:NetConnection = new 
NetConnection();
-                                               nc.connect(null);
-                                               var ns:NetStream = new 
NetStream(nc);
-                                               ns.attachAudio(_mic);
-                                               
_mic.addEventListener(StatusEvent.STATUS, function (event:StatusEvent):void {
-                                                       
debug("micStatusHandler! " + event);
-                                                       
_mic.removeEventListener(StatusEvent.STATUS, arguments.callee);
-                                                       ns.close();
-                                                       nc.close();
-                                                       if (_mic.muted) {
-                                                               debug("Unable 
to connect to active microphone.");
-                                                       } else {
-                                                               
ExternalInterface.call("VideoSettings.allowRec", true);
-                                                       }
-                                               });
-                                       }
-                               }
-                       }
-               }
-
-               private function _attachCamera(cam:Camera):void {
-                       debug("_attachCamera():: muted ? " + cam.muted);
-                       if (cam.muted) {
-                               debug("Unable to connect to active camera.");
-                       } else {
-                               try {
-                                       video.reset();
-                                       video.attachCamera(cam);
-                                       debug("_attachCamera()::done");
-                               } catch (error:Error) {
-                                       debug("_attach:: " + error.message + 
"\n" + error.getStackTrace());
-                               }
-                       }
-               }
-
-               private function settingsCameraCallback():void {
-                       ExternalInterface.call("VideoSettings.allowRec", true);
-                       _attachCamera(getCam());
-               }
-
-               private function setResolution(width:int, height:int, 
attach:Boolean):void {
-                       if (!interview) {
-                               debug("onselect WxH :: " + width + "x" + 
height);
-
-                               video.resize(width, height);
-
-                               if (attach) {
-                                       attachCamera(settingsCameraCallback);
-                               }
-                       }
-               }
-
-               private function camChanged(e:Event):void {
-                       attachCamera(settingsCameraCallback);
-               }
-
-               private function playTestRecording():void {
-                       video.play(recName + ".flv");
-               }
-
-               private function startTestRecording():void {
-                       try {
-                               var counter:int = 5;
-                               timerText.visible = true;
-                               timerText.text = "5 sec";
-                               var recTimer:Timer = new Timer(1000, counter);
-                               var t:Date = new Date();
-                               recName = "TEST_SETUP_" + t.getTime();
-                               mic = getMic();
-                               var activityTimer:Timer = new Timer(100);
-                               
activityTimer.addEventListener(TimerEvent.TIMER, function 
(event:TimerEvent):void {
-                                       
ExternalInterface.call("VideoSettings.micActivity", mic.activityLevel);
-                               });
-                               video.record(recName, getCam(), mic, function 
():void {
-                                       if (mic != null) {
-                                               activityTimer.start();
-                                       }
-                                       
recTimer.addEventListener(TimerEvent.TIMER, function (event:TimerEvent):void {
-                                               timerText.text = --counter + " 
sec";
-                                               if (counter == 0) {
-                                                       timerText.visible = 
false;
-                                                       
ExternalInterface.call("VideoSettings.allowPlay");
-                                                       playTestRecording();
-                                                       activityTimer.stop();
-                                                       mic = null;
-                                               }
-                                       });
-                                       recTimer.start();
-                               });
-                       } catch (err:Error) {
-                               debug("ERROR: " + err);
-                       }
-               }
-               ]]></fx:Script>
-
-       <mx:UIComponent id="videoDisplay" width="0" height="0" />
-       <s:Label id="timerText" height="20" width="45" x="20" y="5" 
paddingLeft="5" paddingTop="5"
-                        visible="false" backgroundColor="0xf5f5f5" 
fontWeight="bold"><s:text></s:text></s:Label>
-</s:Application>
+<?xml version="1.0"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+
+-->
+<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009";
+               xmlns:s="library://ns.adobe.com/flex/spark"
+               xmlns:mx="library://ns.adobe.com/flex/mx"
+               width="570" height="900" pageTitle="Openmeetings" fontSize="12"
+               applicationComplete="appInit(event)" 
uncaughtError="uncaughtError(event)">
+       <fx:Declarations>
+               <!-- Place non-visual elements (e.g., services, value objects) 
here -->
+               <mx:TraceTarget/>
+       </fx:Declarations>
+       <fx:Script><![CDATA[
+               import mx.core.FlexGlobals;
+
+               import org.apache.openmeetings.OmVideo;
+
+               private var audioOnly:Boolean = false;
+               private var FPS:int;
+               private var bandwidth:int = 0;
+               private var quality:int = 100;
+               private var echoPath:int = 256;
+               private var echoSuppression:Boolean = true;
+               private var microphoneRateBest:int = 22;//5, 8, 11, 22, and 44
+               private var selectedMic:int = -1;
+               private var selectedCam:int = -1;
+               private var video:OmVideo;
+               private var recName:String;
+               private var mic:Microphone = null;
+               [Bindable]
+               private var interview:Boolean = false;
+
+               private function debug(...rest):void {
+                       ExternalInterface.call("console.log", rest);
+               }
+
+               private function camAvail():Boolean {
+                       return !audioOnly && Camera.names.length > 0;
+               }
+
+               private function micAvail():Boolean {
+                       return Microphone.names.length > 0;
+               }
+
+               private function appInit(evt:Event):void {
+                       var params:Object = 
FlexGlobals.topLevelApplication.parameters;
+                       debug("appInit()", params);
+                       audioOnly = 'true' == params.audioOnly;
+                       interview = 'true' == params.interview;
+                       var _fps:int = parseInt(params.fps);
+                       FPS = (isNaN(_fps) || _fps < 1 ? 30 : _fps);
+                       video = new OmVideo(videoDisplay, params);
+                       switch (params.mode) {
+                               case 'settings':
+                               {
+                                       
ExternalInterface.addCallback("getDevices", function ():Object {
+                                               return {
+                                                       cams: Camera.names
+                                                       , mics: Microphone.names
+                                               };
+                                       });
+                                       
ExternalInterface.addCallback("camChanged", function (val:int):void {
+                                               selectedCam = val;
+                                               camChanged(null);
+                                       });
+                                       
ExternalInterface.addCallback("micChanged", function (val:int):void {
+                                               selectedMic = val;
+                                               camChanged(null);
+                                       });
+                                       
ExternalInterface.addCallback("resChanged", function (width:int, 
height:int):void {
+                                               setResolution(width, height, 
true);
+                                       });
+                                       ExternalInterface.addCallback("close", 
function ():void {
+                                               video.reset();
+                                       });
+                                       ExternalInterface.addCallback("init", 
function (camIdx:int, micIdx:int, width:int, height:int):void {
+                                               selectedCam = camIdx;
+                                               selectedMic = micIdx;
+                                               setResolution(width, height, 
true);
+                                       });
+                                       
ExternalInterface.addCallback("startRec", function ():void {
+                                               startTestRecording();
+                                       });
+                                       ExternalInterface.addCallback("play", 
function ():void {
+                                               playTestRecording();
+                                       });
+                                       
ExternalInterface.call("VideoSettings.initSwf");
+                               }
+                                       break;
+                               case OmVideo.BROADCAST:
+                               {
+                                       selectedCam = params.cam;
+                                       selectedMic = params.mic;
+                                       video.resize(Math.max(300, 
params.width), Math.max(200, params.height));
+                                       attachCamera(function():void {
+                                               video.resize(params.width, 
params.height);
+                                               video.reset();
+                                               var cam:Camera = getCam();
+                                               video.attachCamera(cam);
+                                               
video.broadcast(params.broadcastId, cam, getMic());
+                                               
ExternalInterface.call("VideoManager.resetSize", params.uid);
+                                       });
+                               }
+                                       break;
+                               case OmVideo.PLAY:
+                               {
+                                       video.resize(params.width, 
params.height);
+                                       video.play(params.broadcastId); // TODO 
audio/video
+                               }
+                                       break;
+                       }
+                       ExternalInterface.addCallback("vidResize", function 
(width:int, height:int):void {
+                               video.resize(width, height);
+                               video.vidResize(width, height);
+                       });
+               }
+
+               private function uncaughtError(e:UncaughtErrorEvent):void {
+                       debug("Unexpected ERROR", e);
+               }
+
+               private function getMic():Microphone {
+                       debug("Entering getMic ...");
+                       var _micro:Microphone = null;
+                       if (selectedMic > -1) {
+                               _micro = echoPath == 0 ? 
Microphone.getMicrophone(selectedMic) : 
Microphone.getEnhancedMicrophone(selectedMic);
+
+                               if (_micro != null) {
+                                       if (echoPath == 256) {
+                                               var 
options:MicrophoneEnhancedOptions = new MicrophoneEnhancedOptions();
+                                               options.mode = 
MicrophoneEnhancedMode.FULL_DUPLEX;
+                                               options.echoPath = echoPath;
+                                               options.nonLinearProcessing = 
true;
+                                               _micro.enhancedOptions = 
options;
+                                               debug("echoPath set to " + 
echoPath + ", " + _micro.enhancedOptions);
+                                       }
+                                       _micro.codec = SoundCodec.NELLYMOSER;
+                                       _micro.framesPerPacket = 1;
+                                       _micro.setSilenceLevel(0, 2000);
+                                       debug("canvas.microphoneRateBest: " + 
microphoneRateBest);
+                                       _micro.rate = microphoneRateBest;
+                                       _micro.gain = 50;
+                                       // this has no effect if enhanced 
microphone is obtained
+                                       //Microphone setUseEchoSupression(bool)
+                                       debug("canvas.echoSuppression: " + 
echoSuppression);
+                                       
_micro.setUseEchoSuppression(echoSuppression);
+                               }
+                               debug("... getMic DONE" + _micro);
+                       }
+                       return _micro;
+               }
+
+               private function getCam():Camera {
+                       debug("Entering getCam ...");
+                       var _camera:Camera = null;
+                       if (selectedCam > -1) {
+                               _camera = Camera.getCamera("" + selectedCam);
+                               if (_camera != null && !_camera.muted) {
+                                       //FIXME need to be unified
+                                       if (interview) {
+                                               //we need a fixed frame rate 
for the videos to merge them later on
+                                               _camera.setMode(video.width, 
video.height, 24);
+                                               debug("IS INTERVIEW ");
+                                               _camera.setQuality(0, 98);
+                                       } else {
+                                               _camera.setMode(video.width, 
video.height, FPS);
+                                               debug("IS NO INTERVIEW ");
+                                               _camera.setQuality(bandwidth, 
quality);
+                                       }
+                               }
+                               debug("... getCam DONE " + _camera);
+                       }
+                       return _camera;
+               }
+
+               private function attachCamera(callback:Function):void {
+                       if (!camAvail()) {
+                               return;
+                       }
+                       debug("Camera selected:: " + selectedCam);
+                       var cam:Camera = getCam();
+                       debug("Camera selected:: " + cam);
+                       if (cam != null) {
+                               if (cam.muted) {
+                                       debug("Camera Muted");
+                                       video.attachCamera(cam);
+                                       
cam.addEventListener(StatusEvent.STATUS, function (event:StatusEvent):void {
+                                               debug("cameraStatusHandler! " + 
event);
+                                               
cam.removeEventListener(StatusEvent.STATUS, arguments.callee);
+                                               switch (event.code) {
+                                                       case 'Camera.Muted':
+                                                               debug("Unable 
to connect to active camera.");
+                                                               break;
+                                                       case 'Camera.Unmuted':
+                                                               callback();
+                                                               break;
+                                               }
+                                       });
+                               } else {
+                                       callback();
+                               }
+                       } else {
+                               var _mic:Microphone = getMic();
+                               if (_mic != null) {
+                                       if (_mic.muted) {
+                                               var nc:NetConnection = new 
NetConnection();
+                                               nc.connect(null);
+                                               var ns:NetStream = new 
NetStream(nc);
+                                               ns.attachAudio(_mic);
+                                               
_mic.addEventListener(StatusEvent.STATUS, function (event:StatusEvent):void {
+                                                       
debug("micStatusHandler! " + event);
+                                                       
_mic.removeEventListener(StatusEvent.STATUS, arguments.callee);
+                                                       ns.close();
+                                                       nc.close();
+                                                       if (_mic.muted) {
+                                                               debug("Unable 
to connect to active microphone.");
+                                                       } else {
+                                                               
ExternalInterface.call("VideoSettings.allowRec", true);
+                                                       }
+                                               });
+                                       }
+                               }
+                       }
+               }
+
+               private function _attachCamera(cam:Camera):void {
+                       debug("_attachCamera():: muted ? " + cam.muted);
+                       if (cam.muted) {
+                               debug("Unable to connect to active camera.");
+                       } else {
+                               try {
+                                       video.reset();
+                                       video.attachCamera(cam);
+                                       debug("_attachCamera()::done");
+                               } catch (error:Error) {
+                                       debug("_attach:: " + error.message + 
"\n" + error.getStackTrace());
+                               }
+                       }
+               }
+
+               private function settingsCameraCallback():void {
+                       ExternalInterface.call("VideoSettings.allowRec", true);
+                       _attachCamera(getCam());
+               }
+
+               private function setResolution(width:int, height:int, 
attach:Boolean):void {
+                       if (!interview) {
+                               debug("onselect WxH :: " + width + "x" + 
height);
+
+                               video.resize(width, height);
+
+                               if (attach) {
+                                       attachCamera(settingsCameraCallback);
+                               }
+                       }
+               }
+
+               private function camChanged(e:Event):void {
+                       attachCamera(settingsCameraCallback);
+               }
+
+               private function playTestRecording():void {
+                       video.play(recName + ".flv");
+               }
+
+               private function startTestRecording():void {
+                       try {
+                               var counter:int = 5;
+                               timerText.visible = true;
+                               timerText.text = "5 sec";
+                               var recTimer:Timer = new Timer(1000, counter);
+                               var t:Date = new Date();
+                               recName = "TEST_SETUP_" + t.getTime();
+                               mic = getMic();
+                               var activityTimer:Timer = new Timer(100);
+                               
activityTimer.addEventListener(TimerEvent.TIMER, function 
(event:TimerEvent):void {
+                                       
ExternalInterface.call("VideoSettings.micActivity", mic.activityLevel);
+                               });
+                               video.record(recName, getCam(), mic, function 
():void {
+                                       if (mic != null) {
+                                               activityTimer.start();
+                                       }
+                                       
recTimer.addEventListener(TimerEvent.TIMER, function (event:TimerEvent):void {
+                                               timerText.text = --counter + " 
sec";
+                                               if (counter == 0) {
+                                                       timerText.visible = 
false;
+                                                       
ExternalInterface.call("VideoSettings.allowPlay");
+                                                       playTestRecording();
+                                                       activityTimer.stop();
+                                                       mic = null;
+                                               }
+                                       });
+                                       recTimer.start();
+                               });
+                       } catch (err:Error) {
+                               debug("ERROR: " + err);
+                       }
+               }
+               ]]></fx:Script>
+
+       <mx:UIComponent id="videoDisplay" width="0" height="0" />
+       <s:Label id="timerText" height="20" width="45" x="20" y="5" 
paddingLeft="5" paddingTop="5"
+                        visible="false" backgroundColor="0xf5f5f5" 
fontWeight="bold"><s:text></s:text></s:Label>
+</s:Application>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/8e63647c/openmeetings-flash/src/main/flex/org/apache/openmeetings/OmVideo.as
----------------------------------------------------------------------
diff --git 
a/openmeetings-flash/src/main/flex/org/apache/openmeetings/OmVideo.as 
b/openmeetings-flash/src/main/flex/org/apache/openmeetings/OmVideo.as
index c32e8a2..fbf540d 100644
--- a/openmeetings-flash/src/main/flex/org/apache/openmeetings/OmVideo.as
+++ b/openmeetings-flash/src/main/flex/org/apache/openmeetings/OmVideo.as
@@ -1,270 +1,270 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License") +  you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.openmeetings {
-import flash.events.AsyncErrorEvent;
-import flash.events.NetStatusEvent;
-import flash.external.ExternalInterface;
-import flash.media.Camera;
-import flash.media.H264Level;
-import flash.media.H264Profile;
-import flash.media.H264VideoStreamSettings;
-import flash.media.Microphone;
-import flash.media.Video;
-import flash.media.VideoStreamSettings;
-import flash.net.NetConnection;
-import flash.net.NetStream;
-import mx.core.UIComponent;
-
-public class OmVideo {
-       public static const CODEC_H264:String = "h264";
-       public static const PLAY:String = "play";
-       public static const BROADCAST:String = "broadcast";
-       public static const RECORD:String = "record";
-       public static const LIVE:String = "live";
-       private var vid:Video;
-       private var ui:UIComponent;
-       private var nc:NetConnection;
-       private var ns:NetStream;
-       public var width:int;
-       public var height:int;
-       private var mode:String;
-       private var params:Object;
-       private var url:String;
-       private var fallback:Boolean;
-
-       public function OmVideo(ui:UIComponent, params:Object) {
-               this.ui = ui;
-               this.params = params;
-       }
-
-       private function getVideo():Video {
-               if (vid == null) {
-                       vid = new Video();
-                       vid.width = width;
-                       vid.height = height;
-                       ui.addChild(vid);
-               }
-               return vid;
-       }
-
-       public function resize(width:int, height:int):void {
-               this.width = ui.width = width;
-               this.height = ui.height = height;
-       }
-
-       public function vidResize(width:int, height:int):void {
-               vid.width = width;
-               vid.height = height;
-               debug("OmVideo::resize", width, height);
-       }
-
-       public function attachCamera(cam:Camera):void {
-               getVideo().attachCamera(cam);
-       }
-
-       public function attachStream(ns:NetStream):void {
-               this.ns = ns;
-               getVideo().attachNetStream(ns);
-       }
-
-       private function clear():void {
-               vid.attachNetStream(null);
-               vid.attachCamera(null);
-               vid.clear();
-               ui.removeChild(vid);
-               vid = null;
-       }
-
-       private function debug(... rest):void {
-               ExternalInterface.call("console.log", rest);
-       }
-
-       private function createStream():void {
-               debug("createStream: ");
-               ns = new NetStream(nc);
-               ns.client = {
-                       onMetaData: function(metadata:Object):void {
-                               debug("onMetaData: ", metadata);
-                       }
-                       , onPlayStatus: function(metadata:Object):void {
-                               debug("onPlayStatus: ", metadata);
-                       }
-                       , onCuePoint: function(metadata:Object):void {
-                               debug("onCuePoint: ", metadata);
-                       }
-                       , ioError: function(error:Object):void {
-                               debug("ioError: ", error);
-                       }
-                       , netStatus: function(status:Object):void {
-                               debug("netStatus: ", status);
-                       }
-                       , asyncError: function(error:Object):void {
-                               debug("asyncError: ", error);
-                       }
-               };
-               //this is a workaround, attaching the event to the client 
object does not work
-               ns.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus2);
-       }
-
-       private function onNetStatus2(evt:Object):void {
-               debug("netStream_onNetStatus: ", evt.info.code, evt.target);
-       }
-
-       private function _publish(mode:String, name:String, cam:Camera, 
mic:Microphone, f:Function):void {
-               if (ns != null){
-                       reset();
-               }
-               this.mode = mode;
-               createStream();
-
-               if (cam != null) {
-                       ns.attachCamera(cam);
-                       attachCamera(cam);
-
-                       var videoStreamSettings:VideoStreamSettings = null;
-                       debug("codec = " + params.videoCodec);
-                       if (params.videoCodec === CODEC_H264) {
-                               var vss:H264VideoStreamSettings = new 
H264VideoStreamSettings();
-                               vss.setProfileLevel(H264Profile.BASELINE, 
H264Level.LEVEL_5_1);
-                               videoStreamSettings = vss;
-                       } else {
-                               videoStreamSettings = new VideoStreamSettings();
-                       }
-                       videoStreamSettings.setQuality(cam.bandwidth, 
cam.quality);
-                       
videoStreamSettings.setKeyFrameInterval(cam.keyFrameInterval);
-                       debug("::camera settings ", cam.keyFrameInterval, 
cam.width, cam.height, cam.fps);
-                       videoStreamSettings.setMode(cam.width, cam.height, 
cam.fps);
-                       ns.videoStreamSettings = videoStreamSettings;
-               }
-               if (mic != null) {
-                       ns.attachAudio(mic);
-                       //FIXME !!! no mute !!! muteMicro(this.micMuted);
-               }
-
-               ns.publish(name, (mode == BROADCAST) ? LIVE : mode);
-               if (f != null) {
-                       f.call();
-               }
-       }
-
-       private function _connect(url:String):void {
-               nc.connect(url, {
-                       uid: params.uid
-                       , sid: params.sid
-                       , nativeSsl: 'best' == params.proxyType
-               });
-       }
-
-       private function connect(callback:Function):void {
-               if (nc == null || !nc.connected) {
-                       url = params.url;
-                       debug("NetConnection is not connected", url);
-                       nc = new NetConnection();
-                       nc.addEventListener(NetStatusEvent.NET_STATUS, function 
onConnectionStatus(e:NetStatusEvent):void {
-                               debug("ConnectionStatus: " + e.info.code);
-                               switch (e.info.code) {
-                                       case 'NetConnection.Connect.Failed':
-                                               if (!fallback) {
-                                                       fallback = true;
-                                                       url = params.fallback;
-                                                       _connect(url);
-                                               }
-                                               break;
-                                       case 'NetConnection.Connect.Success':
-                                               callback();
-                                               break;
-                                       //TODO other cases
-                               }
-                       });
-                       nc.addEventListener(AsyncErrorEvent.ASYNC_ERROR, 
function (event:AsyncErrorEvent):void {
-                               debug("login Async error" + event);
-                       });
-                       nc.client = {
-                               onMetaData: function (infoObject:Object):void {
-                                       debug("onMetaData::", infoObject);
-                               }
-                               , onBWDone: function(...rest):void {
-                                       debug("onBWDone");
-                               }
-                               , onBWCheck: function(...rest):Number {
-                                       debug("onBWCheck");
-                                       return 0;
-                               }
-                               , setId: function (id:Number):void {
-                                       debug("id: " + id); //TODO save 
connection id
-                               }
-                       };
-                       _connect(url);
-               } else {
-                       callback();
-               }
-       }
-
-       public function broadcast(name:String, cam:Camera, mic:Microphone):void 
{
-               connect(function():void {
-                       _publish(BROADCAST, name, cam, mic, null);
-               });
-       }
-
-       public function record(name:String, cam:Camera, mic:Microphone, 
f:Function):void {
-               connect(function():void {
-                       _publish(RECORD, name, cam, mic, f);
-               });
-       }
-
-       public function play(name:String):void {
-               connect(function():void {
-                       debug("PLAY::", name);
-                       if (ns != null){
-                               reset();
-                       }
-                       mode = PLAY;
-                       createStream();
-                       //invokes Method in baseVideoView which shows the stream
-                       getVideo().attachNetStream(ns);
-                       //FIXME: Commented out, cause this leads to 
Buffer-Full/Buffer-Empty Events
-                       //after re-syncing the stream
-                       //this.setBuffer(0.1);
-                       ns.play(name);
-               });
-       }
-
-       public function reset():void {
-               if (ns != null) {
-                       switch (mode) {
-                               case PLAY:
-                                       ns.pause();
-                                       ns.dispose();
-                                       clear();
-                                       break;
-                               case BROADCAST:
-                               case RECORD:
-                                       ns.publish(null); //false in original 
code
-                               default:
-                                       clear();
-                                       ns.dispose();
-                                       break;
-                       }
-               } else {
-                       clear();
-               }
-               ns = null;
-       }
-}
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings {
+import flash.events.AsyncErrorEvent;
+import flash.events.NetStatusEvent;
+import flash.external.ExternalInterface;
+import flash.media.Camera;
+import flash.media.H264Level;
+import flash.media.H264Profile;
+import flash.media.H264VideoStreamSettings;
+import flash.media.Microphone;
+import flash.media.Video;
+import flash.media.VideoStreamSettings;
+import flash.net.NetConnection;
+import flash.net.NetStream;
+import mx.core.UIComponent;
+
+public class OmVideo {
+       public static const CODEC_H264:String = "h264";
+       public static const PLAY:String = "play";
+       public static const BROADCAST:String = "broadcast";
+       public static const RECORD:String = "record";
+       public static const LIVE:String = "live";
+       private var vid:Video;
+       private var ui:UIComponent;
+       private var nc:NetConnection;
+       private var ns:NetStream;
+       public var width:int;
+       public var height:int;
+       private var mode:String;
+       private var params:Object;
+       private var url:String;
+       private var fallback:Boolean;
+
+       public function OmVideo(ui:UIComponent, params:Object) {
+               this.ui = ui;
+               this.params = params;
+       }
+
+       private function getVideo():Video {
+               if (vid == null) {
+                       vid = new Video();
+                       vid.width = width;
+                       vid.height = height;
+                       ui.addChild(vid);
+               }
+               return vid;
+       }
+
+       public function resize(width:int, height:int):void {
+               this.width = ui.width = width;
+               this.height = ui.height = height;
+       }
+
+       public function vidResize(width:int, height:int):void {
+               vid.width = width;
+               vid.height = height;
+               debug("OmVideo::resize", width, height);
+       }
+
+       public function attachCamera(cam:Camera):void {
+               getVideo().attachCamera(cam);
+       }
+
+       public function attachStream(ns:NetStream):void {
+               this.ns = ns;
+               getVideo().attachNetStream(ns);
+       }
+
+       private function clear():void {
+               vid.attachNetStream(null);
+               vid.attachCamera(null);
+               vid.clear();
+               ui.removeChild(vid);
+               vid = null;
+       }
+
+       private function debug(... rest):void {
+               ExternalInterface.call("console.log", rest);
+       }
+
+       private function createStream():void {
+               debug("createStream: ");
+               ns = new NetStream(nc);
+               ns.client = {
+                       onMetaData: function(metadata:Object):void {
+                               debug("onMetaData: ", metadata);
+                       }
+                       , onPlayStatus: function(metadata:Object):void {
+                               debug("onPlayStatus: ", metadata);
+                       }
+                       , onCuePoint: function(metadata:Object):void {
+                               debug("onCuePoint: ", metadata);
+                       }
+                       , ioError: function(error:Object):void {
+                               debug("ioError: ", error);
+                       }
+                       , netStatus: function(status:Object):void {
+                               debug("netStatus: ", status);
+                       }
+                       , asyncError: function(error:Object):void {
+                               debug("asyncError: ", error);
+                       }
+               };
+               //this is a workaround, attaching the event to the client 
object does not work
+               ns.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus2);
+       }
+
+       private function onNetStatus2(evt:Object):void {
+               debug("netStream_onNetStatus: ", evt.info.code, evt.target);
+       }
+
+       private function _publish(mode:String, name:String, cam:Camera, 
mic:Microphone, f:Function):void {
+               if (ns != null){
+                       reset();
+               }
+               this.mode = mode;
+               createStream();
+
+               if (cam != null) {
+                       ns.attachCamera(cam);
+                       attachCamera(cam);
+
+                       var videoStreamSettings:VideoStreamSettings = null;
+                       debug("codec = " + params.videoCodec);
+                       if (params.videoCodec === CODEC_H264) {
+                               var vss:H264VideoStreamSettings = new 
H264VideoStreamSettings();
+                               vss.setProfileLevel(H264Profile.BASELINE, 
H264Level.LEVEL_5_1);
+                               videoStreamSettings = vss;
+                       } else {
+                               videoStreamSettings = new VideoStreamSettings();
+                       }
+                       videoStreamSettings.setQuality(cam.bandwidth, 
cam.quality);
+                       
videoStreamSettings.setKeyFrameInterval(cam.keyFrameInterval);
+                       debug("::camera settings ", cam.keyFrameInterval, 
cam.width, cam.height, cam.fps);
+                       videoStreamSettings.setMode(cam.width, cam.height, 
cam.fps);
+                       ns.videoStreamSettings = videoStreamSettings;
+               }
+               if (mic != null) {
+                       ns.attachAudio(mic);
+                       //FIXME !!! no mute !!! muteMicro(this.micMuted);
+               }
+
+               ns.publish(name, (mode == BROADCAST) ? LIVE : mode);
+               if (f != null) {
+                       f.call();
+               }
+       }
+
+       private function _connect(url:String):void {
+               nc.connect(url, {
+                       uid: params.uid
+                       , sid: params.sid
+                       , nativeSsl: 'best' == params.proxyType
+               });
+       }
+
+       private function connect(callback:Function):void {
+               if (nc == null || !nc.connected) {
+                       url = params.url;
+                       debug("NetConnection is not connected", url);
+                       nc = new NetConnection();
+                       nc.addEventListener(NetStatusEvent.NET_STATUS, function 
onConnectionStatus(e:NetStatusEvent):void {
+                               debug("ConnectionStatus: " + e.info.code);
+                               switch (e.info.code) {
+                                       case 'NetConnection.Connect.Failed':
+                                               if (!fallback) {
+                                                       fallback = true;
+                                                       url = params.fallback;
+                                                       _connect(url);
+                                               }
+                                               break;
+                                       case 'NetConnection.Connect.Success':
+                                               callback();
+                                               break;
+                                       //TODO other cases
+                               }
+                       });
+                       nc.addEventListener(AsyncErrorEvent.ASYNC_ERROR, 
function (event:AsyncErrorEvent):void {
+                               debug("login Async error" + event);
+                       });
+                       nc.client = {
+                               onMetaData: function (infoObject:Object):void {
+                                       debug("onMetaData::", infoObject);
+                               }
+                               , onBWDone: function(...rest):void {
+                                       debug("onBWDone");
+                               }
+                               , onBWCheck: function(...rest):Number {
+                                       debug("onBWCheck");
+                                       return 0;
+                               }
+                               , setId: function (id:Number):void {
+                                       debug("id: " + id); //TODO save 
connection id
+                               }
+                       };
+                       _connect(url);
+               } else {
+                       callback();
+               }
+       }
+
+       public function broadcast(name:String, cam:Camera, mic:Microphone):void 
{
+               connect(function():void {
+                       _publish(BROADCAST, name, cam, mic, null);
+               });
+       }
+
+       public function record(name:String, cam:Camera, mic:Microphone, 
f:Function):void {
+               connect(function():void {
+                       _publish(RECORD, name, cam, mic, f);
+               });
+       }
+
+       public function play(name:String):void {
+               connect(function():void {
+                       debug("PLAY::", name);
+                       if (ns != null){
+                               reset();
+                       }
+                       mode = PLAY;
+                       createStream();
+                       //invokes Method in baseVideoView which shows the stream
+                       getVideo().attachNetStream(ns);
+                       //FIXME: Commented out, cause this leads to 
Buffer-Full/Buffer-Empty Events
+                       //after re-syncing the stream
+                       //this.setBuffer(0.1);
+                       ns.play(name);
+               });
+       }
+
+       public function reset():void {
+               if (ns != null) {
+                       switch (mode) {
+                               case PLAY:
+                                       ns.pause();
+                                       ns.dispose();
+                                       clear();
+                                       break;
+                               case BROADCAST:
+                               case RECORD:
+                                       ns.publish(null); //false in original 
code
+                               default:
+                                       clear();
+                                       ns.dispose();
+                                       break;
+                       }
+               } else {
+                       clear();
+               }
+               ns = null;
+       }
+}
+}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/8e63647c/openmeetings-flash/src/main/swf10/networkTesting/networktesting.lzx
----------------------------------------------------------------------
diff --git 
a/openmeetings-flash/src/main/swf10/networkTesting/networktesting.lzx 
b/openmeetings-flash/src/main/swf10/networkTesting/networktesting.lzx
index df65c1b..da55d60 100644
--- a/openmeetings-flash/src/main/swf10/networkTesting/networktesting.lzx
+++ b/openmeetings-flash/src/main/swf10/networkTesting/networktesting.lzx
@@ -1,89 +1,89 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-      http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
-  
--->
-<canvas width="100%" height="100%" title="NetworkTesting">
-       <switch>
-               <when property="$as3">
-                       <passthrough>
-                               import flash.external.ExternalInterface;
-                       </passthrough>
-               </when>
-       </switch>
-       <switch>
-               <when property="$debug">
-                       <method name="doDebugInit">
-                               canvas.setAttribute('debug', true);
-                       </method>
-                       <debug fontsize="11" 
oninit="Debug.showInternalProperties = true" width="40%" y="50%" x="60%" 
height="50%" />
-               </when>
-               <otherwise>
-                       <method name="doDebugInit">
-                       </method>
-               </otherwise>
-       </switch>
-       
-       <include href="testsView.lzx" />
-       <include href="restCall.lzx" />
-       
-       <handler name="oninit"><![CDATA[
-               flash.external.ExternalInterface.call("loadingComplete");
-               var lbls = ExternalInterface.call("getStringLabels");
-               canvas.lbls = new Array(lbls.length);
-               for (var i = 0; i < lbls.length; ++i) {
-                       canvas.lbls[lbls[i].id] = lbls[i].value;
-               }
-               var config = ExternalInterface.call("getConfig");
-               doDebugInit();
-               getSettings(config);
-               canvas.showTests();
-       ]]></handler>
-
-       <method name="lbl" args="key">
-               var s = canvas.lbls['network.test.' + key];
-               if ($debug) Debug.info("LBL ", key, s, canvas.lbls);
-               return !!s ? s : "Missing[" + key + "]";
-       </method>
-
-       <method name="getSettings" args="config">
-               if ($debug) Debug.write("getSettings:: ", config);
-               canvas.setAttribute("rtmpProtocol", config.flashProtocol);
-               canvas.setAttribute("proxyType", config.proxy);
-               canvas.setAttribute("rtmpHost", config.host);
-               canvas.setAttribute("rtmpPort", config.flashPort);
-               
-               canvas.setAttribute("httpProtocol", config.httpProtocol);
-               canvas.setAttribute("httpHost", config.host);
-               canvas.setAttribute("httpPort", config.httpPort);
-
-               canvas.setAttribute("uriContext", '/' + config.path);
-               canvas.setAttribute("rtmpUriPath", canvas.uriContext + 
"hibernate");
-       </method>
-
-       <method name="showTests">
-               var tests = new lz.TestsView(canvas, {name:"testsView"});
-               tests.testAll();
-       </method>
-
-       <attribute name="busy" type="boolean" value="false"/>
-       <attribute name="log" type="string" value="" />
-
-       <attribute name="testsView" value="null"/>
-
-</canvas>
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+  
+      http://www.apache.org/licenses/LICENSE-2.0
+  
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+  
+-->
+<canvas width="100%" height="100%" title="NetworkTesting">
+       <switch>
+               <when property="$as3">
+                       <passthrough>
+                               import flash.external.ExternalInterface;
+                       </passthrough>
+               </when>
+       </switch>
+       <switch>
+               <when property="$debug">
+                       <method name="doDebugInit">
+                               canvas.setAttribute('debug', true);
+                       </method>
+                       <debug fontsize="11" 
oninit="Debug.showInternalProperties = true" width="40%" y="50%" x="60%" 
height="50%" />
+               </when>
+               <otherwise>
+                       <method name="doDebugInit">
+                       </method>
+               </otherwise>
+       </switch>
+       
+       <include href="testsView.lzx" />
+       <include href="restCall.lzx" />
+       
+       <handler name="oninit"><![CDATA[
+               flash.external.ExternalInterface.call("loadingComplete");
+               var lbls = ExternalInterface.call("getStringLabels");
+               canvas.lbls = new Array(lbls.length);
+               for (var i = 0; i < lbls.length; ++i) {
+                       canvas.lbls[lbls[i].id] = lbls[i].value;
+               }
+               var config = ExternalInterface.call("getConfig");
+               doDebugInit();
+               getSettings(config);
+               canvas.showTests();
+       ]]></handler>
+
+       <method name="lbl" args="key">
+               var s = canvas.lbls['network.test.' + key];
+               if ($debug) Debug.info("LBL ", key, s, canvas.lbls);
+               return !!s ? s : "Missing[" + key + "]";
+       </method>
+
+       <method name="getSettings" args="config">
+               if ($debug) Debug.write("getSettings:: ", config);
+               canvas.setAttribute("rtmpProtocol", config.flashProtocol);
+               canvas.setAttribute("proxyType", config.proxy);
+               canvas.setAttribute("rtmpHost", config.host);
+               canvas.setAttribute("rtmpPort", config.flashPort);
+               
+               canvas.setAttribute("httpProtocol", config.httpProtocol);
+               canvas.setAttribute("httpHost", config.host);
+               canvas.setAttribute("httpPort", config.httpPort);
+
+               canvas.setAttribute("uriContext", '/' + config.path);
+               canvas.setAttribute("rtmpUriPath", canvas.uriContext + 
"hibernate");
+       </method>
+
+       <method name="showTests">
+               var tests = new lz.TestsView(canvas, {name:"testsView"});
+               tests.testAll();
+       </method>
+
+       <attribute name="busy" type="boolean" value="false"/>
+       <attribute name="log" type="string" value="" />
+
+       <attribute name="testsView" value="null"/>
+
+</canvas>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/8e63647c/openmeetings-flash/src/main/swf10/networkTesting/rtmpConnection.lzx
----------------------------------------------------------------------
diff --git 
a/openmeetings-flash/src/main/swf10/networkTesting/rtmpConnection.lzx 
b/openmeetings-flash/src/main/swf10/networkTesting/rtmpConnection.lzx
index ad1958f..0cb20a6 100644
--- a/openmeetings-flash/src/main/swf10/networkTesting/rtmpConnection.lzx
+++ b/openmeetings-flash/src/main/swf10/networkTesting/rtmpConnection.lzx
@@ -1,367 +1,367 @@
-<library>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
-
--->
-
-<class name="rtmpConnection" extends="node">
-       <switch>
-               <when property="$as3">
-                       <passthrough>
-                               import flash.net.NetConnection;
-                               import flash.events.NetStatusEvent;
-                       </passthrough>
-               </when>
-       </switch>
-
-       <attribute name="debug" value="false" type="boolean" />
-
-       <event name="onconnect"/>
-       <event name="onerror"/>
-
-       <!-- this attribute holds a reference to the current/last called 
netremoteCall,
-       in case of error you can debug that way which call did fail -->
-       <attribute name="lastCalled" value="null" />
-
-       <attribute name="src" value="" type="string"/>
-
-       <method name="connect">
-               this._nc = new NetConnection();
-
-               // local reference to rtmpconnection
-               //this._nc.t = this;
-
-               this._nc.proxyType = canvas.proxyType;
-
-               var ok = this._nc.connect(src == "null" ? null : src, {
-                       uid: "noclient"
-               });
-               if (this.debug) {
-                       if($debug) Debug.write("*** debug ***");
-               }
-
-               this._nc.addEventListener(NetStatusEvent.NET_STATUS, _onStatus);
-
-               if($debug) Debug.write("devRtmpConnection/registerMethods()");
-               var clientObj = {};
-               clientObj.setId = this.setId;
-
-               this._nc.client = clientObj;
-
-               //Register Methods
-               //this.registerMethods();
-       </method>
-
-       <method name="setId" args="tId">
-               if ($debug) Debug.write("setId ", tId);
-       </method>
-
-       <method name="_onStatus" args="stats"><![CDATA[
-               if ($debug) {
-                       Debug.write("devrtmpconnection", this, "_onStatus", 
stats.info.code);
-               }
-
-               var msg = "";
-               var s;
-
-               switch (stats.info.code) {
-
-                       case "NetConnection.Connect.Success": {
-                               // The connection attempt succeeded.
-                               //canvas.currentNC is the reference to the 
NetConnection that is used in the NetStream
-                               msg = stats.info.code;
-                               canvas.currentNC = this._nc;
-                               s = 2;
-                               break;
-                       }
-
-                       case "NetConnection.Connect.Closed": {
-                               msg = stats.info.code;
-                               this._nc = null;
-                               canvas.currentNC = null;
-                               s = 0;
-                               break;
-                       }
-
-                       default: {
-                               msg = stats.info.code;
-                               s = 0;
-                               break;
-                       }
-
-               }
-
-               this.setAttribute("status", msg);
-
-               if (s == 2) {
-                       this.onconnect.sendEvent();
-               } else {
-                       this.onerror.sendEvent();
-               }
-
-       ]]>
-       </method>
-
-       <method name="disconnect">
-               if ($debug) Debug.write(" DISCONNECT ");
-               if (this._nc != null) {
-                       this._nc.close();
-               }
-       </method>
-       <!---
-               With this function all methods are registered to the 
NetConnection
-               A server can invoke this Method with a call for it from the 
Client
-               Only subnodes of rtmpconnections which are a instance of 
netRemoteCallHib
-               are registered, to add dynamically methods to the 
remotefunction you will
-               have to invoke this method once again
-               -swagner
-        -->
-       <method name="registerMethods">
-               <![CDATA[
-                       if (this.subnodes!=null){
-                               var clientObj = {};
-                               //Register all methods which are onstanceof 
netRemoteCallHib
-                               for (var i=0;i<this.subnodes.length;i++){
-                                       //If it is of Type netRemoteCallHib 
then register it to the NetConnection
-                                       if (this.subnodes[i] instanceof 
lz.netRemoteCallHib){
-                                               
clientObj[this.subnodes[i].funcname] = function( args ){
-                                                       return 
canvas.thishib.remoteCallMethod(arguments.callee,arguments);
-                                                       //return 
hib.remoteCallMethod(arguments.callee,args);
-                                               }
-                                       }
-                               }
-                               this._nc.client = clientObj;
-                       }
-               ]]>
-       </method>
-
-       <!--
-               Process the RemoteCall to the Right Funtion
-               -swagner
-        -->
-       <method name="remoteCallMethod" args="callee,args">
-               <![CDATA[
-                       for (var eg in this._nc){
-                               if (this._nc[eg]==callee){
-                                       if (this.debug) {
-                                               
//_root.Debug.write.write("DEBUG invoked a function remotely: ",eg,args);
-                                       }
-                                       if (args.length == 1) {
-                                               return 
this.callFuntion(eg,args[0]);
-                                       } else {
-                                               return 
this.callFuntion(eg,args);
-                                       }
-                                       //return this.callFuntion(eg,args);
-                               }
-                       }
-               ]]>
-       </method>
-
-       <!--
-               Map the Function to a netRemoteCallHib
-               -swagner
-        -->
-       <method name="callFuntion" args="funcname,args">
-               <![CDATA[
-                       for (var i=0;i<this.subnodes.length;i++){
-                               if (this.subnodes[i].funcname==funcname){
-                                       return this.subnodes[i].onResult(args);
-                               }
-                       }
-               ]]>
-       </method>
-
-       <method name="callRPC" args="func, obj, params">
-               //if ($debug) Debug.write("*** call: func, obj, 
params",func,obj, typeof (params) ,params.length);
-               if (params.length != 0){
-                       //does this really work?
-                       //ASSetPropFlags(_global, null, 8, 1);
-                       //setPropertyIsEnumerable(8, 1);
-                       //Debug.write("does it work?",arguments);
-                       <!--
-                       this._nc.call.apply(this._nc,arguments);
-                        -->
-                       if (params.length==1){
-                               this._nc.call(func, obj,params[0]);
-                       } else if (params.length==2){
-                               this._nc.call(func, obj,params[0],params[1]);
-                       } else if (params.length==3){
-                               this._nc.call(func, 
obj,params[0],params[1],params[2]);
-                       } else if (params.length==4){
-                               this._nc.call(func, 
obj,params[0],params[1],params[2],params[3]);
-                       } else if (params.length==5){
-                               this._nc.call(func, 
obj,params[0],params[1],params[2],params[3],params[4]);
-                       } else if (params.length==6){
-                               this._nc.call(func, 
obj,params[0],params[1],params[2],params[3],params[4],params[5]);
-                       } else if (params.length==7){
-                               this._nc.call(func, 
obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6]);
-                       } else if (params.length==8){
-                               this._nc.call(func, 
obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7]);
-                       } else if (params.length==9){
-                               this._nc.call(func, 
obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8]);
-                       } else if (params.length==10){
-                               this._nc.call(func, 
obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9]);
-                       } else if (params.length==11){
-                               this._nc.call(func, 
obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10]);
-                       } else if (params.length==12){
-                               this._nc.call(func, 
obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11]);
-                       } else if (params.length==13){
-                               this._nc.call(func, 
obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],params[12]);
-                       } else if (params.length==14){
-                               this._nc.call(func, 
obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],params[12],params[13]);
-                       } else if (params.length==15){
-                               this._nc.call(func, 
obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],params[12],params[13],params[14]);
-                       } else if (params.length==16){
-                               this._nc.call(func, 
obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],params[12],params[13],params[14],params[15]);
-                       } else if (params.length==17){
-                               this._nc.call(func, 
obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],params[12],params[13],params[14],params[15],params[16]);
-                       } else if (params.length==18){
-                               this._nc.call(func, 
obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],params[12],params[13],params[14],params[15],params[16],params[17]);
-                       } else if (params.length==19){
-                               this._nc.call(func, 
obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],params[12],params[13],params[14],params[15],params[16],params[17],params[18]);
-                       } else if (params.length==20){
-                               this._nc.call(func, 
obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],params[12],params[13],params[14],params[15],params[16],params[17],params[18],params[19]);
-                       }
-               } else {
-                       this._nc.call(func, obj);
-               }
-       </method>
-</class>
-
-
-       <!---
-               Net remote call.
-               @todo Document netremotecall class.
-       -->
-       <class name="netremotecall" extends="node">
-               <switch>
-                       <when property="$as3">
-                               <passthrough>
-                                       import flash.net.Responder;
-                               </passthrough>
-                       </when>
-               </switch>
-
-               <!--- Name of the remote function. -->
-               <attribute name="funcname" value="$once{null}" type="string" />
-
-               <attribute name="remotecontext" value="null" />
-
-               <attribute name="dataobject" value="null" />
-
-               <attribute name="responder" value="null" />
-
-               <!--- Data handling event. args="value"  -->
-               <event name="ondata" />
-
-               <!--- Error handling event. -->
-               <event name="onerror"/>
-
-               <!--- Call the remote method, passing the array of params. -->
-               <method name="callRPC" args="params"><![CDATA[
-                       if (this.funcname == null) {
-                               //Debug.write("No funcname given");
-                               if (this.onerror) this.onerror.sendEvent("No 
funcname given");
-                               return;
-                       }
-
-                       if (params == null) {
-                               params = new Array();
-
-                               var subnodes = this.subnodes;
-                               if (subnodes != null) {
-                                       var i;
-                                       var n = subnodes.length;
-                                       for (i = 0; i < n; i++) {
-                                               // If getValue method is 
declared in param, call that
-                                               // instead to get value.
-                                               var tsi = subnodes[i];
-                                               //TODO: fixme
-                                               //if ((tsi["getValue"] != null) 
&& (tsi.getValue["prototype"] != null)) {
-                                               //      params[i] = 
tsi.getValue();
-                                               //      
Debug.write("tsi.getValue():", tsi.getValue());
-                                               //} else {
-                                               //      params[i] = tsi.value;
-                                               //}
-                                               params[i] = tsi.getValue();
-                                       }
-                               }
-
-                       } else if (params.__proto__ != Array.prototype) {
-                               //Debug.write(this.name, "error: first argument 
(params) is not an array");
-                               return -1;
-                       }
-
-                       //if ($debug) Debug.write("call", this, this.parent, 
this.parent.status);
-                       var rtmpObject = null;
-                       if (this.parent instanceof lz.rtmpConnection){
-                               rtmpObject = this.parent;
-                       } else if(this.remotecontext  instanceof 
lz.rtmpConnection){
-                               rtmpObject = this.remotecontext;
-                       } else {
-                               if ($debug) Debug.warn("ERROR: no remotecontext 
availible abort call", this.funcname, this);
-                               return;
-                       }
-                       //Debug.write('call', this, rtmpObject, 
rtmpObject.status);
-                       //Debug.write('call', this.remotecontext);
-                       if (rtmpObject.debug) Debug.write('call', this, 
rtmpObject, rtmpObject.status);
-                       rtmpObject.lastCalled = this;
-
-                       this.responder = new Responder(onResult);
-
-                       rtmpObject.callRPC(this.funcname, this.responder, 
params);
-
-               ]]>
-               </method>
-
-               <!--- Handle the result returned from the remote method. -->
-               <method name="onResult" args="value"><![CDATA[
-                       // Can be overriden.
-                       // Would be great if it can be used with dataobject,
-                       // but I don't know how to convert Array/primitive to 
LzDataset/LzDataPointer.
-                       ////Debug.write("netremotecall", this, "onResult", 
value);
-
-                       if (this.dataobject!=null) {
-                               if ( this.dataobject instanceof LzDataset ) {
-                                       //Debug.write("onResult: 
",this,value,dataobject);
-                                       var element = 
LzDataElement.valueToElement(value);
-                                       
this.dataobject.setData(element.childNodes);
-                               } else if ( this.dataobject instanceof 
LzDataElement ) {
-                                       var element = 
LzDataElement.valueToElement(value);
-                                       this.dataobject.appendChild( element );
-                               } else {
-                                       //TODO:fixme
-                                       //Debug.warn("dataobject is not 
LzDataset or LzDataElement: ",this,this.dataobject,delegate);
-                               }
-                       }
-                       this.ondata.sendEvent(value);
-               ]]>
-               </method>
-       </class>
-
-       <!---
-               Net parameter.
-               Element to use inside netremotecall.
-               @todo Document netparam class.
-       -->
-       <class name="netparam" extends="node">
-               <!--- The value of the netparam. -->
-               <attribute name="value" value="null"/>
-       </class>
-
-</library>
+<library>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+
+-->
+
+<class name="rtmpConnection" extends="node">
+       <switch>
+               <when property="$as3">
+                       <passthrough>
+                               import flash.net.NetConnection;
+                               import flash.events.NetStatusEvent;
+                       </passthrough>
+               </when>
+       </switch>
+
+       <attribute name="debug" value="false" type="boolean" />
+
+       <event name="onconnect"/>
+       <event name="onerror"/>
+
+       <!-- this attribute holds a reference to the current/last called 
netremoteCall,
+       in case of error you can debug that way which call did fail -->
+       <attribute name="lastCalled" value="null" />
+
+       <attribute name="src" value="" type="string"/>
+
+       <method name="connect">
+               this._nc = new NetConnection();
+
+               // local reference to rtmpconnection
+               //this._nc.t = this;
+
+               this._nc.proxyType = canvas.proxyType;
+
+               var ok = this._nc.connect(src == "null" ? null : src, {
+                       uid: "noclient"
+               });
+               if (this.debug) {
+                       if($debug) Debug.write("*** debug ***");
+               }
+
+               this._nc.addEventListener(NetStatusEvent.NET_STATUS, _onStatus);
+
+               if($debug) Debug.write("devRtmpConnection/registerMethods()");
+               var clientObj = {};
+               clientObj.setId = this.setId;
+
+               this._nc.client = clientObj;
+
+               //Register Methods
+               //this.registerMethods();
+       </method>
+
+       <method name="setId" args="tId">
+               if ($debug) Debug.write("setId ", tId);
+       </method>
+
+       <method name="_onStatus" args="stats"><![CDATA[
+               if ($debug) {
+                       Debug.write("devrtmpconnection", this, "_onStatus", 
stats.info.code);
+               }
+
+               var msg = "";
+               var s;
+
+               switch (stats.info.code) {
+
+                       case "NetConnection.Connect.Success": {
+                               // The connection attempt succeeded.
+                               //canvas.currentNC is the reference to the 
NetConnection that is used in the NetStream
+                               msg = stats.info.code;
+                               canvas.currentNC = this._nc;
+                               s = 2;
+                               break;
+                       }
+
+                       case "NetConnection.Connect.Closed": {
+                               msg = stats.info.code;
+                               this._nc = null;
+                               canvas.currentNC = null;
+                               s = 0;
+                               break;
+                       }
+
+                       default: {
+                               msg = stats.info.code;
+                               s = 0;
+                               break;
+                       }
+
+               }
+
+               this.setAttribute("status", msg);
+
+               if (s == 2) {
+                       this.onconnect.sendEvent();
+               } else {
+                       this.onerror.sendEvent();
+               }
+
+       ]]>
+       </method>
+
+       <method name="disconnect">
+               if ($debug) Debug.write(" DISCONNECT ");
+               if (this._nc != null) {
+                       this._nc.close();
+               }
+       </method>
+       <!---
+               With this function all methods are registered to the 
NetConnection
+               A server can invoke this Method with a call for it from the 
Client
+               Only subnodes of rtmpconnections which are a instance of 
netRemoteCallHib
+               are registered, to add dynamically methods to the 
remotefunction you will
+               have to invoke this method once again
+               -swagner
+        -->
+       <method name="registerMethods">
+               <![CDATA[
+                       if (this.subnodes!=null){
+                               var clientObj = {};
+                               //Register all methods which are onstanceof 
netRemoteCallHib
+                               for (var i=0;i<this.subnodes.length;i++){
+                                       //If it is of Type netRemoteCallHib 
then register it to the NetConnection
+                                       if (this.subnodes[i] instanceof 
lz.netRemoteCallHib){
+                                               
clientObj[this.subnodes[i].funcname] = function( args ){
+                                                       return 
canvas.thishib.remoteCallMethod(arguments.callee,arguments);
+                                                       //return 
hib.remoteCallMethod(arguments.callee,args);
+                                               }
+                                       }
+                               }
+                               this._nc.client = clientObj;
+                       }
+               ]]>
+       </method>
+
+       <!--
+               Process the RemoteCall to the Right Funtion
+               -swagner
+        -->
+       <method name="remoteCallMethod" args="callee,args">
+               <![CDATA[
+                       for (var eg in this._nc){
+                               if (this._nc[eg]==callee){
+                                       if (this.debug) {
+                                               
//_root.Debug.write.write("DEBUG invoked a function remotely: ",eg,args);
+                                       }
+                                       if (args.length == 1) {
+                                               return 
this.callFuntion(eg,args[0]);
+                                       } else {
+                                               return 
this.callFuntion(eg,args);
+                                       }
+                                       //return this.callFuntion(eg,args);
+                               }
+                       }
+               ]]>
+       </method>
+
+       <!--
+               Map the Function to a netRemoteCallHib
+               -swagner
+        -->
+       <method name="callFuntion" args="funcname,args">
+               <![CDATA[
+                       for (var i=0;i<this.subnodes.length;i++){
+                               if (this.subnodes[i].funcname==funcname){
+                                       return this.subnodes[i].onResult(args);
+                               }
+                       }
+               ]]>
+       </method>
+
+       <method name="callRPC" args="func, obj, params">
+               //if ($debug) Debug.write("*** call: func, obj, 
params",func,obj, typeof (params) ,params.length);
+               if (params.length != 0){
+                       //does this really work?
+                       //ASSetPropFlags(_global, null, 8, 1);
+                       //setPropertyIsEnumerable(8, 1);
+                       //Debug.write("does it work?",arguments);
+                       <!--
+                       this._nc.call.apply(this._nc,arguments);
+                        -->
+                       if (params.length==1){
+                               this._nc.call(func, obj,params[0]);
+                       } else if (params.length==2){
+                               this._nc.call(func, obj,params[0],params[1]);
+                       } else if (params.length==3){
+                               this._nc.call(func, 
obj,params[0],params[1],params[2]);
+                       } else if (params.length==4){
+                               this._nc.call(func, 
obj,params[0],params[1],params[2],params[3]);
+                       } else if (params.length==5){
+                               this._nc.call(func, 
obj,params[0],params[1],params[2],params[3],params[4]);
+                       } else if (params.length==6){
+                               this._nc.call(func, 
obj,params[0],params[1],params[2],params[3],params[4],params[5]);
+                       } else if (params.length==7){
+                               this._nc.call(func, 
obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6]);
+                       } else if (params.length==8){
+                               this._nc.call(func, 
obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7]);
+                       } else if (params.length==9){
+                               this._nc.call(func, 
obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8]);
+                       } else if (params.length==10){
+                               this._nc.call(func, 
obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9]);
+                       } else if (params.length==11){
+                               this._nc.call(func, 
obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10]);
+                       } else if (params.length==12){
+                               this._nc.call(func, 
obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11]);
+                       } else if (params.length==13){
+                               this._nc.call(func, 
obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],params[12]);
+                       } else if (params.length==14){
+                               this._nc.call(func, 
obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],params[12],params[13]);
+                       } else if (params.length==15){
+                               this._nc.call(func, 
obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],params[12],params[13],params[14]);
+                       } else if (params.length==16){
+                               this._nc.call(func, 
obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],params[12],params[13],params[14],params[15]);
+                       } else if (params.length==17){
+                               this._nc.call(func, 
obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],params[12],params[13],params[14],params[15],params[16]);
+                       } else if (params.length==18){
+                               this._nc.call(func, 
obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],params[12],params[13],params[14],params[15],params[16],params[17]);
+                       } else if (params.length==19){
+                               this._nc.call(func, 
obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],params[12],params[13],params[14],params[15],params[16],params[17],params[18]);
+                       } else if (params.length==20){
+                               this._nc.call(func, 
obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],params[12],params[13],params[14],params[15],params[16],params[17],params[18],params[19]);
+                       }
+               } else {
+                       this._nc.call(func, obj);
+               }
+       </method>
+</class>
+
+
+       <!---
+               Net remote call.
+               @todo Document netremotecall class.
+       -->
+       <class name="netremotecall" extends="node">
+               <switch>
+                       <when property="$as3">
+                               <passthrough>
+                                       import flash.net.Responder;
+                               </passthrough>
+                       </when>
+               </switch>
+
+               <!--- Name of the remote function. -->
+               <attribute name="funcname" value="$once{null}" type="string" />
+
+               <attribute name="remotecontext" value="null" />
+
+               <attribute name="dataobject" value="null" />
+
+               <attribute name="responder" value="null" />
+
+               <!--- Data handling event. args="value"  -->
+               <event name="ondata" />
+
+               <!--- Error handling event. -->
+               <event name="onerror"/>
+
+               <!--- Call the remote method, passing the array of params. -->
+               <method name="callRPC" args="params"><![CDATA[
+                       if (this.funcname == null) {
+                               //Debug.write("No funcname given");
+                               if (this.onerror) this.onerror.sendEvent("No 
funcname given");
+                               return;
+                       }
+
+                       if (params == null) {
+                               params = new Array();
+
+                               var subnodes = this.subnodes;
+                               if (subnodes != null) {
+                                       var i;
+                                       var n = subnodes.length;
+                                       for (i = 0; i < n; i++) {
+                                               // If getValue method is 
declared in param, call that
+                                               // instead to get value.
+                                               var tsi = subnodes[i];
+                                               //TODO: fixme
+                                               //if ((tsi["getValue"] != null) 
&& (tsi.getValue["prototype"] != null)) {
+                                               //      params[i] = 
tsi.getValue();
+                                               //      
Debug.write("tsi.getValue():", tsi.getValue());
+                                               //} else {
+                                               //      params[i] = tsi.value;
+                                               //}
+                                               params[i] = tsi.getValue();
+                                       }
+                               }
+
+                       } else if (params.__proto__ != Array.prototype) {
+                               //Debug.write(this.name, "error: first argument 
(params) is not an array");
+                               return -1;
+                       }
+
+                       //if ($debug) Debug.write("call", this, this.parent, 
this.parent.status);
+                       var rtmpObject = null;
+                       if (this.parent instanceof lz.rtmpConnection){
+                               rtmpObject = this.parent;
+                       } else if(this.remotecontext  instanceof 
lz.rtmpConnection){
+                               rtmpObject = this.remotecontext;
+                       } else {
+                               if ($debug) Debug.warn("ERROR: no remotecontext 
availible abort call", this.funcname, this);
+                               return;
+                       }
+                       //Debug.write('call', this, rtmpObject, 
rtmpObject.status);
+                       //Debug.write('call', this.remotecontext);
+                       if (rtmpObject.debug) Debug.write('call', this, 
rtmpObject, rtmpObject.status);
+                       rtmpObject.lastCalled = this;
+
+                       this.responder = new Responder(onResult);
+
+                       rtmpObject.callRPC(this.funcname, this.responder, 
params);
+
+               ]]>
+               </method>
+
+               <!--- Handle the result returned from the remote method. -->
+               <method name="onResult" args="value"><![CDATA[
+                       // Can be overriden.
+                       // Would be great if it can be used with dataobject,
+                       // but I don't know how to convert Array/primitive to 
LzDataset/LzDataPointer.
+                       ////Debug.write("netremotecall", this, "onResult", 
value);
+
+                       if (this.dataobject!=null) {
+                               if ( this.dataobject instanceof LzDataset ) {
+                                       //Debug.write("onResult: 
",this,value,dataobject);
+                                       var element = 
LzDataElement.valueToElement(value);
+                                       
this.dataobject.setData(element.childNodes);
+                               } else if ( this.dataobject instanceof 
LzDataElement ) {
+                                       var element = 
LzDataElement.valueToElement(value);
+                                       this.dataobject.appendChild( element );
+                               } else {
+                                       //TODO:fixme
+                                       //Debug.warn("dataobject is not 
LzDataset or LzDataElement: ",this,this.dataobject,delegate);
+                               }
+                       }
+                       this.ondata.sendEvent(value);
+               ]]>
+               </method>
+       </class>
+
+       <!---
+               Net parameter.
+               Element to use inside netremotecall.
+               @todo Document netparam class.
+       -->
+       <class name="netparam" extends="node">
+               <!--- The value of the netparam. -->
+               <attribute name="value" value="null"/>
+       </class>
+
+</library>

Reply via email to