Index: lams_flash/src/central/flash/lam_addseq_wiz.fla =================================================================== diff -u -rc9c32e6dd572edaad6ed4e8eb39821ca20c0c26a -rb5f1c6147aeaaec0f5084813209fe0cf59a1c386 Binary files differ Index: lams_flash/src/central/flash/lams_learner.fla =================================================================== diff -u -rdf065b290b08acc5a6862622f4ffcd11339a229d -rb5f1c6147aeaaec0f5084813209fe0cf59a1c386 Binary files differ Index: lams_flash/src/central/flash/lams_monitoring_v1.fla =================================================================== diff -u -r4d950607c07a6cbeb688a623b8705061ce6e2032 -rb5f1c6147aeaaec0f5084813209fe0cf59a1c386 Binary files differ Index: lams_flash/src/central/flash/main2.as =================================================================== diff -u -rd7823922f404944822957e6c051bc0f1335a76de -rb5f1c6147aeaaec0f5084813209fe0cf59a1c386 --- lams_flash/src/central/flash/main2.as (.../main2.as) (revision d7823922f404944822957e6c051bc0f1335a76de) +++ lams_flash/src/central/flash/main2.as (.../main2.as) (revision b5f1c6147aeaaec0f5084813209fe0cf59a1c386) @@ -1,12 +1,18 @@ import org.lamsfoundation.lams.learner.Application; import org.lamsfoundation.lams.common.util.StringUtils; +import com.macromedia.javascript.JavaScriptProxy; +import org.lamsfoundation.lams.common.util.Debugger; //Temp values to be removed / repplaced at deployment /**/ _global.myRoot = this; +if(StringUtils.isEmpty(presenceServerUrl)){ + _root.presenceServerUrl = "192.168.1.1"; + Debugger.log('presenceServerUrl is not defined, using defualt:'+_root.presenceServerUrl ,Debugger.CRITICAL,'main','ROOT'); +} + if(StringUtils.isEmpty(serverURL)){ - //_root.serverURL = "http://dolly.uklams.net:8080/lams/"; _root.serverURL = "http://localhost:8080/lams/"; Debugger.log('serverURL is not defined, using defualt:'+_root.serverURL ,Debugger.CRITICAL,'main','ROOT'); } @@ -16,6 +22,16 @@ Debugger.log('userID is not defined, using defualt:'+_root.userID ,Debugger.CRITICAL,'main','ROOT'); } +if(StringUtils.isEmpty(firstName)){ + _root.firstName = "firstName"; + Debugger.log('firstName is not defined, using defualt:'+_root.firstName ,Debugger.CRITICAL,'main','ROOT'); +} + +if(StringUtils.isEmpty(lastName)){ + _root.lastName = "lastName"; + Debugger.log('lastName is not defined, using defualt:'+_root.lastName ,Debugger.CRITICAL,'main','ROOT'); +} + if(StringUtils.isEmpty(mode)){ _root.mode = 1; Debugger.log('Mode is not defined, using defualt:'+_root.mode,Debugger.CRITICAL,'main','ROOT'); @@ -35,6 +51,8 @@ _root.langDate = "01-01-1970"; } +Debugger.log("PRESENCE: connection info from controlFrame - " + userID + " " + firstName + " " + lastName + " " + presenceServerUrl, Debugger.MED,'main','ROOT'); + //Set stage alignment to top left and prent scaling Stage.align = "TL"; Stage.scaleMode = "noScale"; @@ -44,20 +62,29 @@ var app:Application = Application.getInstance(); app.main(this); -//------------------------------Local connection to JSPs for progress data ------------------------------ +//Local connection to JSPs for progress data var receive_lc = new LocalConnection(); -//-------------------------------------- Functions to setProgress data, called by the LocalConnection object in learner JSPs +//Functions to setProgress data, called by the LocalConnection object in learner JSPs receive_lc.setProgressData = function(attempted, completed, current, lessonID, version, refresh) { - Debugger.log(arguments.toString(), 'learnerProgress_lc.setProgressData'); + Debugger.log(arguments.toString(), Debugger.CRITICAL, 'learnerProgress_lc.setProgressData', 'ROOT'); app.refreshProgress(attempted, completed, current, lessonID, version); myRoot.refresh = refresh; }; var success = receive_lc.connect("learnerProgress_lc_" + uniqueID); -//Make app listener for stage resize events -Stage.addListener(app); +//Declaration of proxy object for javascript integration kit +var proxy:JavaScriptProxy = new JavaScriptProxy(_root.lcId, this); +_root.proxy = proxy; +function sendMessageToFlash(msg:String){ + Debugger.log("PRESENCE: from javascript - " + msg, Debugger.MED, 'sendMessageToFlash', 'ROOT'); +} +function sendUsersToFlash(users:Array){ + Debugger.log('PRESENCE: ' + users, Debugger.MED, 'sendUsersToFlash', 'ROOT'); + app.getPresence().setupDataGrid(users); +} - +//Make app listener for stage resize events +Stage.addListener(app); Index: lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/cv/CanvasActivity.as =================================================================== diff -u -r034c8402e794d997946753746948357814143484 -rb5f1c6147aeaaec0f5084813209fe0cf59a1c386 --- lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/cv/CanvasActivity.as (.../CanvasActivity.as) (revision 034c8402e794d997946753746948357814143484) +++ lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/cv/CanvasActivity.as (.../CanvasActivity.as) (revision b5f1c6147aeaaec0f5084813209fe0cf59a1c386) @@ -63,6 +63,9 @@ public static var HUB_CONNECTOR_MARGIN:Number = 25; + public static var PLUS_MARGIN_X:Number = 15; + public static var PLUS_MARGIN_Y:Number = 10; + //this is set by the init object private var _canvasController:CanvasController; private var _canvasView:CanvasView; @@ -393,14 +396,15 @@ // We are unable to display all the users across the Activity's panel. Debugger.log("learner_X: " + learner_X + " ref: " + learnerContainer + " xcoord: " + xCoord, Debugger.CRITICAL, "drawLearners", "CanvasActivity"); - if(learner_X > (xCoord + getVisibleWidth() - 10)) { + if(learner_X > (xCoord + getVisibleWidth() - 30)) { learnerContainer.attachMovie("learnerIcon", "learnerIcon"+learner.getUserName()+activity.activityUIID, learnerContainer.getNextHighestDepth(), {_activity:_activity, learner:learner, _monitorController:_monitorController, _x:learner_X, _y:learner_Y, _hasPlus:true, _clone:false }); + learnerContainer.attachMovie("plusIcon", "plusIcon", learnerContainer.getNextHighestDepth(), {_activity:_activity, _monitorController:_monitorController, _x:learner_X+PLUS_MARGIN_X, _y:learner_Y+PLUS_MARGIN_Y}); return; } // attach icon learnerContainer.attachMovie("learnerIcon", "learnerIcon"+learner.getUserName()+activity.activityUIID, learnerContainer.getNextHighestDepth(), {_activity:_activity, learner:learner, _monitorController:_monitorController, _x:learner_X, _y:learner_Y, _hasPlus:false, _clone:false }); - + // space icons learner_X += 10; } Index: lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/cv/CanvasOptionalActivity.as =================================================================== diff -u -rdf4415c542c1c0a7c354f57dfa032cadae3c3b8c -rb5f1c6147aeaaec0f5084813209fe0cf59a1c386 --- lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/cv/CanvasOptionalActivity.as (.../CanvasOptionalActivity.as) (revision df4415c542c1c0a7c354f57dfa032cadae3c3b8c) +++ lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/cv/CanvasOptionalActivity.as (.../CanvasOptionalActivity.as) (revision b5f1c6147aeaaec0f5084813209fe0cf59a1c386) @@ -46,10 +46,14 @@ private var CHILD_OFFSET_X:Number = 8; private var CHILD_OFFSET_Y:Number = 57; private var CHILD_INCRE:Number = 60; + private var MAX_LEARNER_ICONS:Number = 10; private var PANEL_OFFSET_X:Number = null; private var CONTAINER_PANEL_W:Number = 142.8; + + public static var PLUS_MARGIN_X:Number = 15; + public static var PLUS_MARGIN_Y:Number = 10; private var newContainerXCoord:Number; private var newContainerYCoord:Number; @@ -321,7 +325,7 @@ var learner_X = (mm.activeView instanceof CanvasComplexView) ? this._x + learnerOffset_X : _activity.xCoord + learnerOffset_X; var learner_Y = (mm.activeView instanceof CanvasComplexView) ? this._y + learnerOffset_Y : _activity.yCoord + learnerOffset_Y; - + // get the length of learners from the Monitor Model and run a for loop. for (var j=0; j (actX + 112)){ + if (learner_X > (actX + 92)){ learner_X = actX + learnerOffset_X ; learner_Y = 27; hasPlus = true; learnerContainer.attachMovie("learnerIcon", "learnerIcon"+learner.getUserName(), learnerContainer.getNextHighestDepth(),{_activity:_activity, learner:learner, _monitorController:_monitorController, _x:learner_X, _y:learner_Y, _hasPlus:hasPlus }); - + learnerContainer.attachMovie("plusIcon", "plusIcon", learnerContainer.getNextHighestDepth(), {_activity:_activity, _monitorController:_monitorController, _x:learner_X+PLUS_MARGIN_X, _y:learner_Y+PLUS_MARGIN_Y}); return; } Index: lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/cv/CanvasParallelActivity.as =================================================================== diff -u -r5b44cd0646c0ee06e57059948a5d5f730040f431 -rb5f1c6147aeaaec0f5084813209fe0cf59a1c386 --- lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/cv/CanvasParallelActivity.as (.../CanvasParallelActivity.as) (revision 5b44cd0646c0ee06e57059948a5d5f730040f431) +++ lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/cv/CanvasParallelActivity.as (.../CanvasParallelActivity.as) (revision b5f1c6147aeaaec0f5084813209fe0cf59a1c386) @@ -45,6 +45,9 @@ private var CHILD1_OFFSET_Y:Number = 45; private var CHILD2_OFFSET_Y:Number = 108; + public static var PLUS_MARGIN_X:Number = 15; + public static var PLUS_MARGIN_Y:Number = 10; + private var newContainerXCoord:Number; private var newContainerYCoord:Number; @@ -261,11 +264,12 @@ if (isLearnerCurrentAct){ var actX:Number = (mm.activeView instanceof CanvasComplexView) ? this._x : _activity.xCoord; - if (learner_X > (actX + 112)){ + if (learner_X > (actX + 92)){ learner_X = actX + learnerOffset_X learner_Y = 27 hasPlus = true; learnerContainer.attachMovie("learnerIcon", "learnerIcon"+learner.getUserName(), this._parent.getNextHighestDepth(),{_activity:_activity, learner:learner, _monitorController:_monitorController, _x:learner_X, _y:learner_Y, _hasPlus:hasPlus }); + learnerContainer.attachMovie("plusIcon", "plusIcon", learnerContainer.getNextHighestDepth(), {_activity:_activity, _monitorController:_monitorController, _x:learner_X+PLUS_MARGIN_X, _y:learner_Y+PLUS_MARGIN_Y}); return; } Index: lams_flash/src/central/flash/org/lamsfoundation/lams/learner/Application.as =================================================================== diff -u -r5b44cd0646c0ee06e57059948a5d5f730040f431 -rb5f1c6147aeaaec0f5084813209fe0cf59a1c386 --- lams_flash/src/central/flash/org/lamsfoundation/lams/learner/Application.as (.../Application.as) (revision 5b44cd0646c0ee06e57059948a5d5f730040f431) +++ lams_flash/src/central/flash/org/lamsfoundation/lams/learner/Application.as (.../Application.as) (revision b5f1c6147aeaaec0f5084813209fe0cf59a1c386) @@ -42,6 +42,7 @@ private var _lesson:Lesson; private var _header_mc:MovieClip; private var _scratchpad_mc:MovieClip; + private var _presence_mc:MovieClip; private static var SHOW_DEBUGGER:Boolean = false; private static var MODULE:String = "learner"; @@ -55,6 +56,9 @@ public static var SPAD_X:Number = 0; public static var SPAD_Y:Number = 554; public static var SPAD_H:Number = 220; + public static var PRES_X:Number = 0; + public static var PRES_Y:Number = 554; + public static var PRES_H:Number = 220; private static var APP_ROOT_DEPTH:Number = 10; //depth of the application root @@ -77,21 +81,24 @@ private var _DataLoadCheckIntervalID:Number; private var _dictionaryLoaded:Boolean; //Dictionary loaded flag - private var _dictionaryEventDispatched:Boolean //Event status flag + private var _dictionaryEventDispatched:Boolean; //Event status flag private var _themeLoaded:Boolean; //Theme loaded flag - private var _themeEventDispatched:Boolean //Dictionary loaded flag + private var _themeEventDispatched:Boolean; //Dictionary loaded flag private var _UILoaded:Boolean; //UI Loading status + private var _userDataLoaded:Boolean; //User data status private var _lessonLoaded:Boolean; //Lesson loaded flag private var _headerLoaded:Boolean; private var _scratchpadLoaded:Boolean; + private var _presenceLoaded:Boolean; //Application instance is stored as a static in the application class private static var _instance:Application = null; private var _container_mc:MovieClip; //Main container private var _debugDialog:MovieClip; //Reference to the debug dialog + private var chatDialogs:Array; /** * Application - Constructor @@ -102,8 +109,12 @@ _lessonLoaded = false; _headerLoaded = false; _scratchpadLoaded = false; + _presenceLoaded = false; - _module = Application.MODULE; + _userDataLoaded = false; + + _module = Application.MODULE; + chatDialogs = new Array(); } /** @@ -169,10 +180,9 @@ _themeManager.loadTheme(theme); Debugger.getInstance().crashDumpSeverityLevel = Number(_config.getItem('crashDumpSeverityLevelLog')); - Debugger.getInstance().severityLevel = Number(_config.getItem('severityLevelLog')); - + Debugger.getInstance().severityLevel = Number(_config.getItem('severityLevelLog')); } - + /** * Periodically checks if data has been loaded */ @@ -196,7 +206,9 @@ } } - + /** + * Sets up UI + */ private function setupUI():Void { //Create the application root @@ -208,6 +220,9 @@ _lesson = new Lesson(_appRoot_mc,LESSON_X,LESSON_Y); _lesson.addEventListener('load',Proxy.create(this,UIElementLoaded)); + + _presence_mc = _container_mc.createChildAtDepth('LPresence', DepthManager.kTop, {_x:PRES_X, _y:PRES_Y, _lessonModel:_lesson.model, _lessonController:_lesson.view.getController()}); + _presence_mc.addEventListener('load',Proxy.create(this,UIElementLoaded)); _scratchpad_mc = _container_mc.createChildAtDepth('LScratchPad', DepthManager.kTop, {_x:SPAD_X, _y:SPAD_Y, _lessonModel:_lesson.model, _lessonController:_lesson.view.getController()}); _scratchpad_mc.addEventListener('load', Proxy.create(this, UIElementLoaded)); @@ -217,7 +232,6 @@ * Runs periodically and dispatches events as they are ready */ private function checkUILoaded() { - trace('checking UI loaded...'); //If it's the first time through then set up the interval to keep polling this method if(!_UILoadCheckIntervalID) { _UILoadCheckIntervalID = setInterval(Proxy.create(this,checkUILoaded),UI_LOAD_CHECK_INTERVAL); @@ -258,11 +272,16 @@ case 'Scratchpad' : _scratchpadLoaded = true; break; + case 'Presence' : + _presenceLoaded = true; + _presence_mc._visible = false; + Debugger.log('PRESENCE: presence loaded and set to not visible' ,Debugger.MED,'UIElementLoaded','Application'); + break; default: } //If all of them are loaded set UILoad accordingly - if(_lessonLoaded && _headerLoaded && _scratchpadLoaded){ + if(_lessonLoaded && _headerLoaded && _scratchpadLoaded && _presenceLoaded){ _UILoaded=true; } @@ -283,6 +302,7 @@ } // load lesson + //_lesson.getUserByID(); _lesson.getLesson(); } @@ -295,21 +315,46 @@ var w:Number = Stage.width; var h:Number = Stage.height; + var resizeHeight:Number; + if(_presence_mc._visble) { + resizeHeight = LESSON_Y+_lesson.model.getSpadHeight() +_lesson.model.getPresenceHeight(); + } + else { + resizeHeight = LESSON_Y+_lesson.model.getSpadHeight(); + } + var someListener:Object = new Object(); + someListener.onMouseUp = function () { - _lesson.setSize(w,h-(LESSON_Y+_lesson.model.getSpadHeight())); - + _lesson.setSize(w,h-resizeHeight); _scratchpad_mc._y = h - _lesson.model.getSpadHeight(); + _presence_mc._y = h - _lesson.model.getSpadHeight() - _lesson.model.getPresenceHeight(); } Header(_header_mc).resize(w); - _lesson.setSize(w,h-(LESSON_Y+_lesson.model.getSpadHeight())); + _lesson.setSize(w,h-resizeHeight); _scratchpad_mc._y = h - _lesson.model.getSpadHeight(); + _presence_mc._y = h - _lesson.model.getSpadHeight() - _lesson.model.getPresenceHeight(); } /** + * Handles KEY presses for Application + */ + private function onKeyDown(){ + + // show/hide the debug window: + if (Key.isDown(Key.CONTROL) && Key.isDown(Key.ALT) && Key.isDown(QUESTION_MARK_KEY)) { + if (!_debugDialog.content){ + showDebugger(); + }else { + hideDebugger(); + } + } + } + + /** * Updated the progress data in the lesson model with received progress data * * @param attempted @@ -354,7 +399,6 @@ return _instance._appRoot_mc; } else { //TODO DI 11/05/05 Raise error if _appRoot hasn't been created - } } @@ -370,6 +414,10 @@ return Scratchpad(_scratchpad_mc); } + public function getPresence():Presence{ + return Presence(_presence_mc) + } + public function showDebugger():Void{ _debugDialog = PopUpManager.createPopUp(Application.root, LFWindow, false,{title:'Debug',closeButton:true,scrollContentPath:'debugDialog'}); } @@ -378,19 +426,7 @@ _debugDialog.deletePopUp(); } - /** - * Handles KEY presses for Application - */ - private function onKeyDown(){ - - // show/hide the debug window: - if (Key.isDown(Key.CONTROL) && Key.isDown(Key.ALT) && Key.isDown(QUESTION_MARK_KEY)) { - if (!_debugDialog.content){ - showDebugger(); - }else { - hideDebugger(); - } - } + public function get userDataLoaded():Boolean{ + return _userDataLoaded; } - } \ No newline at end of file Index: lams_flash/src/central/flash/org/lamsfoundation/lams/learner/PresenceXIFF.as =================================================================== diff -u --- lams_flash/src/central/flash/org/lamsfoundation/lams/learner/PresenceXIFF.as (revision 0) +++ lams_flash/src/central/flash/org/lamsfoundation/lams/learner/PresenceXIFF.as (revision b5f1c6147aeaaec0f5084813209fe0cf59a1c386) @@ -0,0 +1,712 @@ +/*************************************************************************** + * Copyright (C) 2008 LAMS Foundation (http://lamsfoundation.org) + * ============================================================= + * License Information: http://lamsfoundation.org/licensing/lams/2.0/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2.0 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + * USA + * + * http://www.gnu.org/licenses/gpl.txt + * ************************************************************************ + */ + +import org.jivesoftware.xiff.conference.Room; +import org.jivesoftware.xiff.data.IQ; +import org.jivesoftware.xiff.conference.InviteListener; +import org.jivesoftware.xiff.data.muc.*; +import org.jivesoftware.xiff.data.DelayExtension; +import org.jivesoftware.xiff.im.Roster; +import org.jivesoftware.xiff.core.XMPPConnection; +import org.jivesoftware.xiff.data.XMPPStanza; +import org.jivesoftware.xiff.data.Message; +import org.jivesoftware.xiff.data.register.RegisterExtension; +import org.jivesoftware.xiff.data.vcard.VCardExtension; +import org.jivesoftware.xiff.data.VCardManager; +import org.jivesoftware.xiff.data.PrivateDataManager; +import org.jivesoftware.xiff.data.PrivateDataExtension; + +import org.lamsfoundation.lams.learner.*; +import org.lamsfoundation.lams.learner.ls.*; +import org.lamsfoundation.lams.common.Sequence; +import org.lamsfoundation.lams.common.ToolTip; +import org.lamsfoundation.lams.common.util.*; +import org.lamsfoundation.lams.common.dict.*; +import org.lamsfoundation.lams.common.style.*; +import org.lamsfoundation.lams.common.ApplicationParent; +import mx.controls.* +import mx.utils.* +import mx.managers.* +import mx.events.* + +class Presence extends MovieClip { + + //Height Properties + private var presenceHeightHide:Number = 20; + private var presenceHeightFull:Number = 217; + + //Open Close Identifier + private var _presenceIsExpanded:Boolean; + + //Component properties + private var _presence_mc:MovieClip; + private var presenceHead_pnl:MovieClip; + private var presenceTitle_lbl:Label; + private var presenceMinIcon:MovieClip; + private var presenceMaxIcon:MovieClip; + private var presenceClickTarget_mc:MovieClip; + private var _tip:ToolTip; + private var _users_dg:DataGrid; + + private var panel:MovieClip; + private var _lessonModel:LessonModel; + private var _lessonController:LessonController; + private var _tm:ThemeManager; + private var _dictionary:Dictionary; + + //These are defined so that the compiler can 'see' the events that are added at runtime by EventDispatcher + private var dispatchEvent:Function; + public var addEventListener:Function; + public var removeEventListener:Function; + + // XIFF things + private var connection:XMPPConnection; + private var room:Room; + private var myHost:InviteListener; + private var buddyList:Roster; + private var vcardManager:VCardManager; + private var privateData:PrivateDataManager; + private var globalHandler:Object; + private var chatHandler:Object; + private var timerTestConnection:Number; + + private var selectedChatItem:Object; + private var lastClickX:Number; + private var lastClickY:Number; + + private var attemptConnectionInterval:Number; + private var testConnectionInterval:Number; + private var clickInterval:Number; + private var rejoinOnIdleInterval:Number; + private var registrationRetryInterval:Number; + private var joinChatRetryInterval:Number; + + private var ROOMCONNECTTIMEOUT:Number =5000; + private var REGRETRYTIME:Number = 1000; + private var JOINCHATRETRYTIME:Number = 1000; + private var DOUBLECLICKSPEED:Number = 500; + + private var regNecessaryFields:Object; + + private var chatDialog:MovieClip; + + // Constructor + public function Presence() { + Debugger.log('PRESENCE: started constructor',Debugger.MED,'Presence','Presence'); + + // Set up this class to use the Flash event delegation model + EventDispatcher.initialize(this); + + _tm = ThemeManager.getInstance(); + _tip = new ToolTip(); + _dictionary = Dictionary.getInstance(); + _dictionary.addEventListener('init',Proxy.create(this,setLabels)); + regNecessaryFields = new Object(); + + connection = new XMPPConnection(); + connection.username = String(_root.userID); + connection.password = String(_root.userID); + connection.server = String(_root.presenceServerUrl); + connection.port = Number(_root.presenceServerPort); + + var myDate = new Date(); + var h = myDate.getHours().toString(), m = myDate.getMinutes().toString(), s = myDate.getSeconds().toString(); + connection.resource = "LAMSPRESENCE"+h+""+m+""+s; + + /* + myHost = new InviteListener(connection); + buddyList = new Roster(connection); + vcardManager = new VCardManager(connection); + privateData= new PrivateDataManager(connection); + */ + + connection.addEventListener("message", Proxy.create(this, handleGlobalEvent)); + connection.addEventListener("login", Proxy.create(this, handleGlobalEvent)); + connection.addEventListener("connection", Proxy.create(this, handleGlobalEvent)); + connection.addEventListener("disconnection", Proxy.create(this, handleGlobalEvent)); + connection.addEventListener("presence", Proxy.create(this, handleGlobalEvent)); + connection.addEventListener("error", Proxy.create(this, handleGlobalEvent)); + connection.addEventListener("changePasswordSuccess", Proxy.create(this, handleGlobalEvent)); + connection.addEventListener("outgoingData", Proxy.create(this, handleGlobalEvent)); + connection.addEventListener("incomingData", Proxy.create(this, handleGlobalEvent)); + connection.addEventListener("registrationSuccess", Proxy.create(this, handleGlobalEvent)); + connection.addEventListener("registrationFields", Proxy.create(this, handleGlobalEvent)); + + /* + buddyList.addEventListener("subscriptionRequest", Proxy.create(this, handleGlobalEvent)); + buddyList.addEventListener("subscriptionRevocation", Proxy.create(this, handleGlobalEvent)); + buddyList.addEventListener("subscriptionDenial", Proxy.create(this, handleGlobalEvent)); + buddyList.addEventListener("userAvailable", Proxy.create(this, handleGlobalEvent)); + buddyList.addEventListener("userUnavailable", Proxy.create(this, handleGlobalEvent)); + + vcardManager.addEventListener("VCardReceived", Proxy.create(this, handleGlobalEvent)); + vcardManager.addEventListener("VCardSent", Proxy.create(this, handleGlobalEvent)); + + privateData.addEventListener("PrivateDataReceived", Proxy.create(this, handleGlobalEvent)); + privateData.addEventListener("PrivateDataSent", Proxy.create(this, handleGlobalEvent)); + + myHost.addEventListener("invited", Proxy.create(this, handleGlobalEvent)); + + Key.addListener(keyListenerGlobal); + buddyList.addEventListener("cellPress", userListener); + */ + + Stage.addListener(this); + + // Let it wait one frame to set up the components. + MovieClipUtils.doLater(Proxy.create(this,init)); + Debugger.log('PRESENCE: calling init method',Debugger.MED,'Presence','Presence'); + } + + // Called a frame after movie attached to allow components to initialise + public function init(){ + Debugger.log('PRESENCE: started init',Debugger.MED,'init','Presence'); + + System.security.loadPolicyFile("xmlsocket://172.20.100.18:9090:5222"); + + //Delete the enterframe dispatcher + delete this.onEnterFrame; + _lessonModel = _lessonModel; + _lessonController = _lessonController; + _presence_mc = this; + _presenceIsExpanded = true; + presenceMaxIcon._visible = false; + presenceMinIcon._visible = true; + _lessonModel.setPresenceHeight(presenceHeightFull); + setLabels(); + resize(Stage.width); + + presenceClickTarget_mc.onRelease = Proxy.create(this, localOnRelease); + + this.onEnterFrame = setLabels; + } + + // Click handler + private function localOnRelease():Void{ + if (_presenceIsExpanded){ + _presenceIsExpanded = false + presenceMinIcon._visible = false; + presenceMaxIcon._visible = true; + _lessonModel.setPresenceHeight(presenceHeightHide); + + }else { + _presenceIsExpanded = true + presenceMinIcon._visible = true; + presenceMaxIcon._visible = false; + _lessonModel.setPresenceHeight(presenceHeightFull); + //Application.getInstance().onResize(); + } + } + + // First connection attempt called once Lesson is loaded correctly + private function attemptFirstConnection():Void{ + attemptConnection(); + checkConnectionEstablished(); + } + + // Attempts a connection with a given Jabber server + private function attemptConnection():Void{ + Debugger.log('PRESENCE: attempting to connect',Debugger.MED,'connectionTimer','Presence'); + connection.connect("flash"); + } + + // Checks to see if a connection has been established + private function checkConnectionEstablished():Void{ + testConnectionInterval = setInterval(Proxy.create(this,connectionEstablishedTimer),500); + } + + // Keeps testing connection + private function connectionEstablishedTimer():Void{ + Debugger.log('PRESENCE: checking if connection is established',Debugger.MED,'connectionEstablishedTimer','Presence'); + + if(connection.isLoggedIn()){ + Debugger.log('PRESENCE: connection established',Debugger.MED,'connectionEstablishedTimer','Presence'); + + clearInterval(testConnectionInterval); + + joinChatRoom(); + setupDataGrid(); + } + } + + // Attempts to register a new user + private function attemptRegistration(){ + Debugger.log('PRESENCE: attempting to register',Debugger.MED,'attemptRegistration','Presence'); + + if(_lessonModel.userFirstName == null || _lessonModel.userLastName == null) { + if(!registrationRetryInterval) { + registrationRetryInterval = setInterval(Proxy.create(this, attemptRegistration), REGRETRYTIME); + } + } + else { + clearInterval(registrationRetryInterval); + var email:String = new String(""); + var name:String = new String(_lessonModel.userFirstName + _lessonModel.userLastName); + var userID:String = new String(_root.userID); + var password:String = new String(_root.userID); + var loginAfter:Boolean = true; + + regNecessaryFields = {username:userID, password:password, name:name, email:email, loginAfter:loginAfter}; + + connection.sendRegistrationFields(regNecessaryFields); + } + } + + // Attempts to join a chat room + private function joinChatRoom():Void{ + Debugger.log('PRESENCE: attempting to create and join chatroom',Debugger.MED,'joinChatRoom','Presence'); + + if(Application.getInstance().userDataLoaded) { + if(_lessonModel.userFirstName == null || _lessonModel.userLastName == null) { + Debugger.log('PRESENCE: names are null, can not join chat room',Debugger.MED,'joinChatRoom','Presence'); + + clearInterval(joinChatRetryInterval); + clearInterval(testConnectionInterval); + } + else { + Debugger.log('PRESENCE: attempting to create and join chatroom',Debugger.MED,'joinChatRoom','Presence'); + + clearInterval(joinChatRetryInterval); + room = new Room(connection); + + room.addEventListener("groupMessage", Proxy.create(this, handleChatEvent)); + room.addEventListener("userJoin", Proxy.create(this, handleChatEvent)); + room.addEventListener("userDeparture", Proxy.create(this, handleChatEvent)); + room.addEventListener("subjectChange", Proxy.create(this, handleChatEvent)); + room.addEventListener("affiliations", Proxy.create(this, handleChatEvent)); + room.addEventListener("roomRosterUpdated", Proxy.create(this, handleChatEvent)); + room.addEventListener("configureForm", Proxy.create(this, handleChatEvent)); + room.addEventListener("declined", Proxy.create(this, handleChatEvent)); + room.addEventListener("nickConflict", Proxy.create(this, handleChatEvent)); + room.addEventListener("privateMessage", Proxy.create(this, handleChatEvent)); + + room.roomName = String(_root.lessonID); + room.nickname = String(_lessonModel.userFirstName + _lessonModel.userLastName); + room.password = null; + room.conferenceServer = "conference." + _root.presenceServerUrl; + room.join(); + } + } + else{ + if(!joinChatRetryInterval) { + joinChatRetryInterval = setInterval(Proxy.create(this, joinChatRoom), JOINCHATRETRYTIME); + } + } + } + + // Chat event handler + private function handleChatEvent(eventObj):Void{ + Debugger.log("PRESENCE: chat event "+eventObj.type,Debugger.MED,'handleChatEvent','Presence'); + switch (eventObj.type) { + + case "nickConflict": + Debugger.log('PRESENCE: nickConflict event',Debugger.MED,'handleChatEvent','Presence'); + /* + popUpErreur(_root.__("ERROR")+" : "+newline+_root.__("nick already in use")+newline+_root.__("I add ~ to the nickname") ); + chatRoom.nickname=nickn.text+"~"; + nickn.text=chatRoom.nickname; + if(!chatRoom.isActive()) + chatRoom.join(); + //SEE PRESENCE EVENT + */ + break; + + case "roomRosterUpdated" : + Debugger.log('PRESENCE: roomRosterUpdated event',Debugger.MED,'handleChatEvent','Presence'); + break; + + case "groupMessage" : + Debugger.log('PRESENCE: groupMessage event',Debugger.MED,'handleChatEvent','Presence'); + /* + //Be careful, if there are many chatroom opened, you need to tell them to recognize their message + var msg = eventObj.data; + + //var msgDelay:DelayExtension = msg.getAllExtensionsByNS(DelayExtension.NS)[0]; + // + var nick = msg.from.split("/")[1]; + + // trace(msgDelay.stamp); + + addToChatOutput(nick, msg.body); + */ + break; + + case "subjectChange" : + Debugger.log('PRESENCE: subject = ' + eventObj.subject,Debugger.MED,'handleChatEvent','Presence'); + break; + + case "login" : + Debugger.log('PRESENCE: room login event',Debugger.MED,'handleChatEvent','Presence'); + + // Rejoin room if automatically disconnected + rejoinOnIdleInterval = setInterval(Proxy.create(this, rejoinTimer), 500); + break; + + case "presence" : + Debugger.log('PRESENCE: room presence event',Debugger.MED,'handleChatEvent','Presence'); + /* + // Some error message, like wrong nickname, or multiple room nickname change (impossible to do on jive...) + if(eventObj.data.type=="error" && chatRoom.isThisRoom(eventObj.data.from)){ //It's this room error + if(eventObj.data.errorCode!=409){ //Not a nickconflict + if (eventObj.data.errorMessage != undefined) { //Some have message, if true, we'll display them + popUpErreur(_root.__("ERROR")+" "+eventObj.data.errorCode+": "+newline+eventObj.data.errorMessage); + removeMyEventListeners(); // remove the event listeners (not needed anymore) + clearInterval(timerTest2); // This "room is active" test + _root.closeFenetre(objectName); //Useless window, we close it + }else{ + popUpErreur(_root.__("ERROR")+" "+eventObj.data.errorCode); //Just the error code! + } + } + } + */ + break; + + case "userJoin" : + Debugger.log('PRESENCE: userJoin event',Debugger.MED,'handleChatEvent','Presence'); + break; + + case "userDeparture" : + Debugger.log('PRESENCE: userDeparture event',Debugger.MED,'handleChatEvent','Presence'); + + break; + + case "affiliations" : + Debugger.log('PRESENCE: affiliations event',Debugger.MED,'handleChatEvent','Presence'); + break; + + case "declined" : + Debugger.log('PRESENCE: declined event',Debugger.MED,'handleChatEvent','Presence'); + break; + + case "privateMessage": + Debugger.log('PRESENCE: privateMessage event',Debugger.MED,'handleChatEvent','Presence'); + /* + //"message" : + // Opening a private chat window on new message + var msg = eventObj.data; + var nick = msg.from.split("/")[0]; // b0ris@usuc.dyndns.org or nomChat@conference.usuc.dyndns.org + var nick2 = msg.from.split("/")[1]; // nomClient b0ris + var nick3 = nick.split("@")[1]; // usuc.dyndns.org conference.usuc.dyndns.org + if (nick3 == roomServer) { + addPrivateChatWindow(nick2, msg); // We add the window, and we send it the message + } + */ + break; + } + } + + // Glocal event handler + private function handleGlobalEvent(eventObj):Void{ + Debugger.log("PRESENCE: global event "+eventObj.type,Debugger.MED,'handleGlobalEvent','Presence'); + + switch (eventObj.type) { + + case "outgoingData": + Debugger.log('PRESENCE: outgoing data ' + eventObj.data,Debugger.MED,'handleGlobalEvent','Presence'); + break; + + case "incomingData": + Debugger.log('PRESENCE: incoming data ' + eventObj.data,Debugger.MED,'handleGlobalEvent','Presence'); + break; + + case "changePasswordSuccess": + Debugger.log('PRESENCE: changePasswordSuccess event',Debugger.MED,'handleGlobalEvent','Presence'); + break; + + case "PrivateDataReceived": + Debugger.log('PRESENCE: PrivateDataReceived event',Debugger.MED,'handleGlobalEvent','Presence'); + /* + wait.log.text+=__("Received private Datas")+"
"; + var tab:Array=new Array(); + tab=PrivateData.getConference(); + for(var i=0;i"; + var resultIQ:IQ=eventObj.resultIQ; + var ext:VCardExtension = resultIQ.getAllExtensionsByNS(VCardExtension.NS)[0]; + var obj:Array=ext.getAllItems(); // By default, the form is the message form + var daForm:Array=obj; + var leJID:String; + if(resultIQ.from!=undefined){ + var objectName = generateObjectName("VCard_"+resultIQ.from); + leJID=resultIQ.from; + }else{ //My VCard + // The displayed form is the complete form. + daForm=ext.getAllFields(); + var objectName = generateObjectName("VCard_"+resultIQ.to); + leJID=resultIQ.to; + } + if (ajouter(objectName)) { + _root.attachMovie("VCard", objectName, curDepth++, {objectName:objectName,leJID:leJID.split("/")[0], receivedMessage:obj, form:daForm}); + barre.addNewTab(objectName, objectName, true); + } + */ + break; + + case "VCardSent": + Debugger.log('PRESENCE: VCardSent event',Debugger.MED,'handleGlobalEvent','Presence'); + /* + var resultIQ:IQ=eventObj.resultIQ; + var objectName = generateObjectName("VCard_"+resultIQ.to); + + if (!ajouter(objectName)) { //We close this window! + closeFenetre(objectName); + } + */ + break; + + case "login" : + Debugger.log('PRESENCE: global login event',Debugger.MED,'handleGlobalEvent','Presence'); + break; + + case "connection" : + Debugger.log('PRESENCE: global connection event',Debugger.MED,'handleGlobalEvent','Presence'); + break; + + case "disconnection" : + Debugger.log('PRESENCE: global disconnection event',Debugger.MED,'handleGlobalEvent','Presence'); + break; + + case "invited": + Debugger.log('PRESENCE: invited event',Debugger.MED,'handleGlobalEvent','Presence'); + break; + + case "registrationFields": + Debugger.log('PRESENCE: registrationFields event - fields required: ' + eventObj.fields,Debugger.MED,'handleGlobalEvent','Presence'); + break; + + case "registrationSuccess": + Debugger.log('PRESENCE: registrationSuccess event',Debugger.MED,'handleGlobalEvent','Presence'); + attemptConnection(); + break; + + case "message" : + Debugger.log('PRESENCE: message from ' + eventObj.data.from,Debugger.MED,'handleGlobalEvent','Presence'); + /* + //Opens private chat windows, listen to all entering messages - display broadcast messages (written to SERVER/announces/motd or SERVER/announces/online) + var msg = eventObj.data; + if(msg.from==domaine){ //It's a jabber server broadcast + d=new Date(); + ch = "{"+d.getUTCHours()+":"+d.getUTCMinutes()+":"+d.getUTCSeconds()+"} - "; + MainMenu.logContacts.text += ch+"Broadcast:
"+msg.body+"
"; + } // We got a b0ris@usuc.dyndns.org/xiff address + var nick = msg.from.split("/")[0]; // b0ris@usuc.dyndns.org + var nick2 = nick.split("@")[0]; // clientName : xiff + var nick3 = nick.split("@")[1]; // Domain Name : usuc.dyndns.org + if (msg.type == Message.CHAT_TYPE) { + // DO IT BETTER ------ parsing chat or conference is not a beautiful solution + if (nick3.split(".")[0].indexOf("chat") == -1 && nick3.split(".")[0].indexOf("conference") == -1 && nick3.split(".")[0].indexOf("public") == -1) { + //It doesn't come from a public chat (the public chat private message interception is made on each public chat) + //trace("global ouvre prive "+nick) + addPrivateChatWindow(nick, msg); //Opens the needed window, and sends the message to the newly created object + } + } + */ + break; + + case "subscriptionRequest" : + Debugger.log('PRESENCE: subscriptionRequest event',Debugger.MED,'handleGlobalEvent','Presence'); + break; + + case "subscriptionRevocation" : + Debugger.log('PRESENCE: subscriptionRevocation event',Debugger.MED,'handleGlobalEvent','Presence'); + break; + + case "subscriptionDenial" : + Debugger.log('PRESENCE: subscriptionDenial event',Debugger.MED,'handleGlobalEvent','Presence'); + break; + + case "presence" : + Debugger.log('PRESENCE: global presence event',Debugger.MED,'handleGlobalEvent','Presence'); + break; + + case "error": + Debugger.log('PRESENCE: errorevent - error code: '+ String(eventObj.data.errorCode) + ' - errorMessage: ' + String(eventObj.data.errorMessage),Debugger.MED,'handleGlobalEvent','Presence'); + + // Switch on error code + switch(eventObj.data.errorCode) { + // Case 401 login unauthorized, attempt to register user + case 401: + Debugger.log('PRESENCE: case 401 - attempting to register',Debugger.MED,'handleGlobalEvent','Presence'); + attemptRegistration(); + break; + // Case 409 registration details incorrect + case 409: + Debugger.log('PRESENCE: case 409 - registration details incorrect',Debugger.MED,'handleGlobalEvent','Presence'); + break; + // Default error case login unauthorized, attempt to register user + default: + Debugger.log('PRESENCE: default case - attempting to register',Debugger.MED,'handleGlobalEvent','Presence'); + attemptRegistration(); + break; + } + break; + + case "userUnavailable" : + Debugger.log('PRESENCE: userUnavailable event',Debugger.MED,'handleGlobalEvent','Presence'); + break; + + case "userAvailable" : + Debugger.log('PRESENCE: userAvailable event',Debugger.MED,'handleGlobalEvent','Presence'); + break; + } + } + + public function isPresenceExpanded():Boolean{ + return _presenceIsExpanded; + } + + public function presenceFullHeight():Number{ + return presenceHeightFull; + } + + public function showToolTip(btnObj, btnTT:String):Void{ + var Xpos = Application.HEADER_X+ 5; + var Ypos = Application.HEADER_Y+( btnObj._y+btnObj._height)+2; + var ttHolder = ApplicationParent.tooltip; + var ttMessage = Dictionary.getValue(btnTT); + var ttWidth = 150 + _tip.DisplayToolTip(ttHolder, ttMessage, Xpos, Ypos, undefined, ttWidth); + } + + public function hideToolTip():Void{ + _tip.CloseToolTip(); + } + + private function setStyles(){ + Debugger.log('PRESENCE: setting styles',Debugger.MED,'setStyles','Presence'); + var styleObj = _tm.getStyleObject('smallLabel'); + + styleObj = _tm.getStyleObject('textarea'); + presenceTitle_lbl.setStyle('styleName', styleObj); + + //For Panels + styleObj = _tm.getStyleObject('BGPanel'); + presenceHead_pnl.setStyle('styleName',styleObj); + } + + private function setLabels(){ + Debugger.log('PRESENCE: setting labels',Debugger.MED,'setLabels','Presence'); + + presenceTitle_lbl.text = Dictionary.getValue('pres_panel_lbl'); + setStyles(); + delete this.onEnterFrame; + dispatchEvent({type:'load',target:this}); + + } + + private function setupDataGrid(){ + Debugger.log('PRESENCE: setting up dataGrid',Debugger.MED,'setLabels','Presence'); + _users_dg.addEventListener("cellPress", Proxy.create(this, cellPress)); + _users_dg.columnNames = ["nickname"]; + + var col:mx.controls.gridclasses.DataGridColumn; + col = _users_dg.getColumnAt(0); + col.headerText = "Learners:"; + col.width = _users_dg._width; + + _users_dg.vScrollPolicy = "auto"; + + _users_dg.dataProvider = room; + _users_dg.sortItemsBy("nickname"); + } + + private function cellPress(event) { + // I'm not clicking on an empty cell + if (event.target.selectedItem.nickname != undefined) { + //Double click action + if (clickInterval != null && _users_dg.selectedItem.nickname == selectedChatItem.nickname) { + Debugger.log('PRESENCE: double click event',Debugger.MED,'cellPress','Presence'); + + //_debugDialog = PopUpManager.createPopUp(Application.root, LFWindow, false,{title:'Debug',closeButton:true,scrollContentPath:'debugDialog'}); + + clearInterval(clickInterval); + clickInterval = null; + // First click + } else { + clearInterval(clickInterval); + clickInterval = null; + selectedChatItem = _users_dg.selectedItem; + lastClickX = _root._xmouse; + lastClickY = _root._ymouse; + clickInterval = setInterval(Proxy.create(this, endClickTimer), DOUBLECLICKSPEED); + } + } + } + + private function endClickTimer() { + // Do actions of first click + Debugger.log('PRESENCE: single click event',Debugger.MED,'cellPress','Presence'); + clearInterval(clickInterval); + //ajoutMenuChat(xK, yK); + clickInterval = null; + } + + function rejoinTimer() { + // If not active, join + if(!room.isActive()) { + room.join(); + // If active, clear the interval + } else{ + clearInterval(rejoinOnIdleInterval); + } + } + + public function resize(width:Number){ + panel._width = width; + + } + + function get className():String { + return 'Presence'; + } +} \ No newline at end of file Index: lams_flash/src/central/flash/org/lamsfoundation/lams/learner/Scratchpad.as =================================================================== diff -u -r5b44cd0646c0ee06e57059948a5d5f730040f431 -rb5f1c6147aeaaec0f5084813209fe0cf59a1c386 --- lams_flash/src/central/flash/org/lamsfoundation/lams/learner/Scratchpad.as (.../Scratchpad.as) (revision 5b44cd0646c0ee06e57059948a5d5f730040f431) +++ lams_flash/src/central/flash/org/lamsfoundation/lams/learner/Scratchpad.as (.../Scratchpad.as) (revision b5f1c6147aeaaec0f5084813209fe0cf59a1c386) @@ -101,10 +101,10 @@ _lessonModel = _lessonModel; _lessonController = _lessonController; _scratchpad_mc = this; - _spadIsExpended = true; + _spadIsExpended = false; maxIcon._visible = true; minIcon._visible = false; - _lessonModel.setSpadHeight(spadHeightFull); + _lessonModel.setSpadHeight(spadHeightHide); setLabels(); resize(Stage.width); @@ -136,14 +136,14 @@ if (_spadIsExpended){ _spadIsExpended = false - minIcon._visible = true; - maxIcon._visible = false; + minIcon._visible = false; + maxIcon._visible = true; _lessonModel.setSpadHeight(spadHeightHide); }else { _spadIsExpended = true - minIcon._visible = false; - maxIcon._visible = true; + minIcon._visible = true; + maxIcon._visible = false; _lessonModel.setSpadHeight(spadHeightFull); //Application.getInstance().onResize(); } Index: lams_flash/src/central/flash/org/lamsfoundation/lams/learner/ls/Lesson.as =================================================================== diff -u -r5b44cd0646c0ee06e57059948a5d5f730040f431 -rb5f1c6147aeaaec0f5084813209fe0cf59a1c386 --- lams_flash/src/central/flash/org/lamsfoundation/lams/learner/ls/Lesson.as (.../Lesson.as) (revision 5b44cd0646c0ee06e57059948a5d5f730040f431) +++ lams_flash/src/central/flash/org/lamsfoundation/lams/learner/ls/Lesson.as (.../Lesson.as) (revision b5f1c6147aeaaec0f5084813209fe0cf59a1c386) @@ -55,8 +55,8 @@ private var _loadCheckCount = 0; private var _loadCheckIntervalID:Number; - - private var dispatchEvent:Function; + + private var dispatchEvent:Function; public var addEventListener:Function; public var removeEventListener:Function; @@ -93,10 +93,16 @@ dispatchEvent({type:'init',target:this}); } + /** + * gets lesson to populate its properties from server reponse dto + */ public function populateFromDTO(dto:Object){ lessonModel.populateFromDTO(dto); } - + + /** + * redirects the view's load event + */ private function viewLoaded(evt:Object){ Debugger.log('viewLoaded called',Debugger.GEN,'viewLoaded','Lesson'); @@ -106,7 +112,10 @@ //Raise error for unrecognized event } } - + + /** + * gets lesson from server given its ID + */ public function getLesson():Boolean { var callback:Function = Proxy.create(this,storeLessonData); @@ -117,8 +126,8 @@ Application.getInstance().getComms().getRequest('learning/learner.do?method=getLesson&lessonID='+String(lessonId), callback, false); return true; - } - + } + public function joinLesson():Boolean { var callback:Function = Proxy.create(this,startLesson); @@ -173,14 +182,13 @@ var exp_url:String = _root.serverURL + 'learning/exportWaitingPage.jsp?mode=learner&lessonID='+String(lessonModel.ID); JsPopup.getInstance().launchPopupWindow(exp_url, 'ExportPortfolioLearner', 410, 640, true, true, false, false, false); - } private function storeLessonData(dto:Object){ lessonModel.populateFromDTO(dto); openLearningDesign(); } - + private function startLesson(pkt:Object){ // set lesson as active lessonModel.setActive(); Index: lams_flash/src/central/flash/org/lamsfoundation/lams/learner/ls/LessonModel.as =================================================================== diff -u -r5b44cd0646c0ee06e57059948a5d5f730040f431 -rb5f1c6147aeaaec0f5084813209fe0cf59a1c386 --- lams_flash/src/central/flash/org/lamsfoundation/lams/learner/ls/LessonModel.as (.../LessonModel.as) (revision 5b44cd0646c0ee06e57059948a5d5f730040f431) +++ lams_flash/src/central/flash/org/lamsfoundation/lams/learner/ls/LessonModel.as (.../LessonModel.as) (revision b5f1c6147aeaaec0f5084813209fe0cf59a1c386) @@ -29,7 +29,7 @@ import org.lamsfoundation.lams.authoring.DesignDataModel; import org.lamsfoundation.lams.authoring.Activity; import org.lamsfoundation.lams.authoring.SequenceActivity; -import org.lamsfoundation.lams.authoring.Transition; +import org.lamsfoundation.lams.authoring.Transition; /* * Model for the Lesson @@ -41,7 +41,8 @@ private var __height:Number; private var __x:Number; private var __y:Number; - private var _spadHeight:Number; + private var _spadHeight:Number; + private var _presenceHeight:Number; private var _isDirty:Boolean; private var infoObj:Object; @@ -61,6 +62,8 @@ private var _lessonStateID:Number; private var _learningDesignID:Number; private var _learnerExportAvailable:Boolean; + private var _learnerPresenceAvailable:Boolean; + private var _learnerImAvailable:Boolean; /* the learningDesignModel gets set when you join a lesson */ private var _learningDesignModel:DesignDataModel; @@ -72,6 +75,11 @@ private var _activeSeq:Array; private var _eventsDisabled:Boolean; + + /* user data */ + private var _userName:String = null; + private var _userFirstName:String = null; + private var _userLastName:String = null; /** * Constructor. @@ -98,8 +106,11 @@ _lessonStateID = dto.lessonStateID; _learningDesignID = dto.learningDesignID; _learnerExportAvailable = dto.learnerExportAvailable; + _learnerPresenceAvailable = dto.learnerPresenceAvailable; + _learnerImAvailable = dto.learnerImAvailable; - + Debugger.log("PRESENCE: " + dto.lessonID + " " + dto.lessonName + " " + dto.learnerExportAvailable + " " + dto.learnerPresenceAvailable + " " + dto.learnerImAvailable,Debugger.MED,'populateUserFromDTO','LessonModel'); + setChanged(); // send update @@ -108,7 +119,6 @@ notifyObservers(infoObj); } - public function setSpadHeight(h:Number){ _spadHeight = h Application.getInstance().onResize(); @@ -118,6 +128,14 @@ return _spadHeight; } + public function setPresenceHeight(h:Number){ + _presenceHeight = h + Application.getInstance().onResize(); + } + + public function getPresenceHeight(){ + return _presenceHeight; + } /** * Set Lesson's unique ID * @@ -143,32 +161,125 @@ } /** - * Set the lesson's name + * Set the userName * - * @param lessonName + * @param userName */ - public function setLessonName(lessonName:String){ - _lessonName = lessonName; + public function setUserName(userName:String){ + _userName = userName; setChanged(); // send update infoObj = {}; - infoObj.updateType = "NAME"; + infoObj.updateType = "USERNAME"; notifyObservers(infoObj); } /** - * Get the lesson's name + * Get the userName * - * @return Lesson Name + * @return userName */ - public function getLessonName():String { - return _lessonName; + public function getUserName():String { + return _userName; } + public function get userName():String{ + return _userName; + } + + /** + * Set the userFirstName + * + * @param userFirstName + */ + + public function setuserFirstName(userFirstName:String){ + _userFirstName = userFirstName; + + setChanged(); + + // send update + infoObj = {}; + infoObj.updateType = "USERFIRSTNAME"; + notifyObservers(infoObj); + } + + /** + * Get the userFirstName + * + * @return userFirstName + */ + + public function getuserFirstName():String { + return _userFirstName; + } + + public function get userFirstName():String{ + return _userFirstName; + } + + /** + * Set the userLastName + * + * @param userLastName + */ + + public function setuserLastName(userLastName:String){ + _userLastName = userLastName; + + setChanged(); + + // send update + infoObj = {}; + infoObj.updateType = "USERLASTNAME"; + notifyObservers(infoObj); + } + + /** + * Get the userLastName + * + * @return userLastName + */ + + public function getuserLastName():String { + return _userLastName; + } + + public function get userLastName():String{ + return _userLastName; + } + + /** + * Set the lesson's name + * + * @param lessonName + */ + + public function setLessonName(lessonName:String){ + _lessonName = lessonName; + + setChanged(); + + // send update + infoObj = {}; + infoObj.updateType = "NAME"; + notifyObservers(infoObj); + } + + /** + * Get the lesson's name + * + * @return Lesson Name + */ + + public function getLessonName():String { + return _lessonName; + } + public function get name():String{ return _lessonName; } @@ -260,6 +371,22 @@ return _learnerExportAvailable; } + public function set learnerPresenceAvailable(b:Boolean) { + _learnerPresenceAvailable = b; + } + + public function get learnerPresenceAvailable():Boolean { + return _learnerPresenceAvailable; + } + + public function set learnerImAvailable(b:Boolean) { + _learnerImAvailable = b; + } + + public function get learnerImAvailable():Boolean { + return _learnerImAvailable; + } + public function getLearningDesignModel():DesignDataModel{ return _learningDesignModel; } Index: lams_flash/src/central/flash/org/lamsfoundation/lams/learner/ls/LessonView.as =================================================================== diff -u -r671b50bb9f03c1f507b621e842b619070d338d65 -rb5f1c6147aeaaec0f5084813209fe0cf59a1c386 --- lams_flash/src/central/flash/org/lamsfoundation/lams/learner/ls/LessonView.as (.../LessonView.as) (revision 671b50bb9f03c1f507b621e842b619070d338d65) +++ lams_flash/src/central/flash/org/lamsfoundation/lams/learner/ls/LessonView.as (.../LessonView.as) (revision b5f1c6147aeaaec0f5084813209fe0cf59a1c386) @@ -153,8 +153,16 @@ removeAll(lm); break; case 'LESSON' : + // if export is available in model, make button available setLessonName(lm.name); Application.getInstance().getHeader().showExportButton(lm.learnerExportAvailable); + + // if presence is available in model, make the panel visible and connect + if(lm.learnerPresenceAvailable) { + Application.getInstance().getPresence().showPresence(lm.learnerPresenceAvailable); + Application.getInstance().getPresence().attemptConnection(); + } + break; case 'DESIGNMODEL' : lm.getLesson().finishedDesign = true; Index: lams_flash/src/central/flash/org/lamsfoundation/lams/monitoring/mv/PlusIcon.as =================================================================== diff -u --- lams_flash/src/central/flash/org/lamsfoundation/lams/monitoring/mv/PlusIcon.as (revision 0) +++ lams_flash/src/central/flash/org/lamsfoundation/lams/monitoring/mv/PlusIcon.as (revision b5f1c6147aeaaec0f5084813209fe0cf59a1c386) @@ -0,0 +1,79 @@ +/*************************************************************************** + * Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) + * ============================================================= + * License Information: http://lamsfoundation.org/licensing/lams/2.0/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2.0 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + * USA + * + * http://www.gnu.org/licenses/gpl.txt + * ************************************************************************ + */ + +import org.lamsfoundation.lams.common.*; +import org.lamsfoundation.lams.common.util.*; +import org.lamsfoundation.lams.common.util.ui.*; +import org.lamsfoundation.lams.authoring.*; +import org.lamsfoundation.lams.authoring.cv.*; +import org.lamsfoundation.lams.monitoring.mv.*; +import org.lamsfoundation.lams.common.style.* + +import com.polymercode.Draw; +import mx.managers.* +import mx.containers.*; +import mx.events.* +import mx.utils.* + +/** +* PlusIcon +*/ +class org.lamsfoundation.lams.monitoring.mv.PlusIcon extends MovieClip { + + /* internal instances */ + private var click_mc:MovieClip; + + /* constants */ + public static var ICON_WIDTH:Number = 8; + public static var ICON_HEIGHT:Number = 20; + + /* references */ + private var _monitorController:MonitorController; + private var _monitorView; + private var _tm:ThemeManager; + private var _activity:Activity; + private var learner:Progress; + + private var _isSelected:Boolean; + private var app:ApplicationParent; + private var toolTip:ToolTip; + + function PlusIcon(){ + Debugger.log('PlusIcon created',Debugger.MED,'PlusIcon','PlusIcon'); + + _tm = ThemeManager.getInstance(); + app = ApplicationParent.getInstance(); + + toolTip = new ToolTip(); + init(); + } + + public function init(initObj):Void{ + if(initObj){ + _monitorController = initObj._monitorController; + _activity = initObj._activity; + this._x = initObj._x; + this._y = initObj._y; + } + } +} \ No newline at end of file Index: lams_flash/src/central/flash/org/lamsfoundation/lams/wizard/Wizard.as =================================================================== diff -u -r5b44cd0646c0ee06e57059948a5d5f730040f431 -rb5f1c6147aeaaec0f5084813209fe0cf59a1c386 --- lams_flash/src/central/flash/org/lamsfoundation/lams/wizard/Wizard.as (.../Wizard.as) (revision 5b44cd0646c0ee06e57059948a5d5f730040f431) +++ lams_flash/src/central/flash/org/lamsfoundation/lams/wizard/Wizard.as (.../Wizard.as) (revision b5f1c6147aeaaec0f5084813209fe0cf59a1c386) @@ -249,10 +249,15 @@ var lessonDesc:String = resultDTO.resourceDescription; var orgId:Number = resultDTO.organisationID; var learnerExpPortfolio:Boolean = resultDTO.learnerExpPortfolio; + var enablePresence:Boolean = resultDTO.enablePresence; + var enableIm:Boolean = resultDTO.enableIm; // get data object to send to servlet - var data = DesignDataModel.getDataForInitializing(lessonName, lessonDesc, designId, orgId, learnerExpPortfolio); + var data = DesignDataModel.getDataForInitializing(lessonName, lessonDesc, designId, orgId, learnerExpPortfolio, enablePresence, enableIm); + trace(data.lessonName + data.enablePresence + data.enableIm); + Debugger.log(data.lessonName + data.enablePresence + data.enableIm, Debugger.MED, "initializeLesson", "Wizard"); + // servlet call Application.getInstance().getComms().sendAndReceive(data, 'monitoring/initializeLesson', callback, false); Index: lams_flash/src/central/flash/org/lamsfoundation/lams/wizard/steps/WizardLessonDetailsView.as =================================================================== diff -u -r5b44cd0646c0ee06e57059948a5d5f730040f431 -rb5f1c6147aeaaec0f5084813209fe0cf59a1c386 --- lams_flash/src/central/flash/org/lamsfoundation/lams/wizard/steps/WizardLessonDetailsView.as (.../WizardLessonDetailsView.as) (revision 5b44cd0646c0ee06e57059948a5d5f730040f431) +++ lams_flash/src/central/flash/org/lamsfoundation/lams/wizard/steps/WizardLessonDetailsView.as (.../WizardLessonDetailsView.as) (revision b5f1c6147aeaaec0f5084813209fe0cf59a1c386) @@ -57,7 +57,9 @@ public static var SUMMERY_OFFSET:Number = 2; private var schedule_cb:CheckBox; - private var learner_expp_cb:CheckBox; + private var learner_expp_cb:CheckBox; + private var learner_enpres_cb:CheckBox; + private var learner_enim_cb:CheckBox; private var start_btn:Button; private var schedule_time:MovieClip; private var summery_lbl:Label; @@ -89,6 +91,7 @@ schedule_btn.addEventListener('click', Delegate.create(this, scheduleNow)); schedule_cb.addEventListener("click", Delegate.create(this, scheduleChange)); learner_expp_cb.addEventListener("click", Delegate.create(this, toogleExpPortfolio)); + learner_enpres_cb.addEventListener("click", Delegate.create(this, toggleEnableIm)); learner_expp_cb.selected = true; } @@ -104,6 +107,8 @@ schedule_cb.label = Dictionary.getValue('schedule_cb_lbl'); learner_expp_cb.label = Dictionary.getValue('wizard_learner_expp_cb_lbl'); + learner_enpres_cb.label = Dictionary.getValue('wizard_learner_enpres_cb_lbl'); + learner_enim_cb.label = Dictionary.getValue('wizard_learner_enim_cb_lbl'); } public function setStyles(_tm:ThemeManager):Void { @@ -138,7 +143,10 @@ start_btn.visible = true; summery_scp.visible = true; summery_lbl.visible = true; - learner_expp_cb.visible = true; + learner_expp_cb.visible = true; + learner_enpres_cb.visible = true; + learner_enim_cb.visible = true; + learner_enim_cb.enabled = false; schedule_cb.visible = true; schedule_time._visible = true; scheduleDate_dt.visible = true; @@ -190,6 +198,8 @@ summery_scp.visible = false; summery_lbl.visible = false; learner_expp_cb.visible = false; + learner_enpres_cb.visible = false; + learner_enim_cb.visible = false; schedule_cb.visible = false; schedule_time._visible = false; scheduleDate_dt.visible = false; @@ -215,7 +225,9 @@ }else { } - + + _parent.resultDTO.enablePresence = learner_enpres_cb.selected; + _parent.resultDTO.enableIm = learner_enim_cb.selected; _parent.resultDTO.learnerExpPortfolio = learner_expp_cb.selected; return valid; @@ -371,6 +383,17 @@ _parent.positionButtons(true); } } + + private function toggleEnableIm(evt:Object) { + Debugger.log("Enable instant messaging checkbox", Debugger.GEN, "toggleEnableIm", "WizardLessonDetailsView"); + if (learner_enpres_cb.selected){ + learner_enim_cb.enabled = true; + } + else{ + learner_enim_cb.selected = false; + learner_enim_cb.enabled = false; + } + } private function toogleExpPortfolio(evt:Object) { Debugger.log("Toogle Staff Selection", Debugger.GEN, "toogleStaffSelection", "WizardLessonDetailsView"); Index: lams_flash/src/common/flash/com/macromedia/javascript/JavaScriptProxy.as =================================================================== diff -u --- lams_flash/src/common/flash/com/macromedia/javascript/JavaScriptProxy.as (revision 0) +++ lams_flash/src/common/flash/com/macromedia/javascript/JavaScriptProxy.as (revision b5f1c6147aeaaec0f5084813209fe0cf59a1c386) @@ -0,0 +1,199 @@ +/* + JavaScriptProxy.as + + Part of the Flash / JavaScript Integration Kit + http://www.macromedia.com/go/flashjavascript + + Created by: + + Mike Chambers + http://weblogs.macromedia.com/mesh/ + mesh@macromedia.com + + Christian Cantrell + http://weblogs.macromedia.com/cantrell/ + cantrell@macromedia.com + + ---- + Macromedia(r) Flash(r)./ JavaScript Integration Kit License + + + Copyright (c) 2005 Macromedia, inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + + 3. The end-user documentation included with the redistribution, if any, must + include the following acknowledgment: + + "This product includes software developed by Macromedia, Inc. + (http://www.macromedia.com)." + + Alternately, this acknowledgment may appear in the software itself, if and + wherever such third-party acknowledgments normally appear. + + 4. The name Macromedia must not be used to endorse or promote products derived + from this software without prior written permission. For written permission, + please contact devrelations@macromedia.com. + + 5. Products derived from this software may not be called "Macromedia" or + “Macromedia Flash”, nor may "Macromedia" or “Macromedia Flash” appear in their + name. + + THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MACROMEDIA OR + ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + DAMAGE. + +*/ + +//import the serializer class +import com.macromedia.javascript.JavaScriptSerializer; + +class com.macromedia.javascript.JavaScriptProxy +{ + private var instance:Object; + private var lcId:String; + private var receiving_lc:LocalConnection + + + /* + Constructor for Class + Public + + Takes two arguments. + + lcId : REQUIRED : an id passed in from HTML / Javascript that is used to + communicate with the gateway swf. The same id must be passed into + the gateway swf. + + instance : the object / class instance that function call will be proxied to. + This is required if function calls will be made from JavaScript + to Flash + + */ + function JavaScriptProxy(lcId:String, instance:Object) + { + + //if either argument is undefined, JavaScript to Flash calls won't work. + //So we just return. + // + //Flash to JavaScript calls will still work + if(lcId == undefined || instance == undefined) + { + return; + } + + this.instance = instance; + + this.lcId = lcId; + + receiving_lc = new LocalConnection(); + + //the incoming function call will occur in the scope of receiving_lc, so we have + //to set a property to let us get back to the correct scope. + receiving_lc.controller = this; + + receiving_lc.callFlash = callFlash; + + //listen for incoming function calls + receiving_lc.connect(this.lcId); + } + + /* + callFlash + Private + + This is called by the FlashProxy in JavaScript to make a functon call into + the Flash content. + */ + private function callFlash(args:Array):Void + { + //get a reference to the correct scope (this method is called in the scope + //of the local connection object) + var con:Object = this["controller"]; + + var functionName:Object = args.shift(); + + var f:Function = con.instance[functionName]; + + //call the function in the correct scope, passing the arguments + f.apply(con.instance, args); + } + + /* + This proxies function calls to the server, which allows you to call JavaScript + functions as if they were functions on JavaScriptProxy instance. + + i.e. + + var j:JavaScriptProxy = new JavaScriptProxy(); + + j.jsFunction("foo", [1, 2]); + */ + public function __resolve(functionName:String):Function + { + var f:Function = function() + { + arguments.splice(0,0, functionName); + var f:Function = call; + f.apply(this, arguments); + }; + + return f; + } + + /* + call + public + + This is used to call functions within JavaScript. + + functionName : A string of the name of the function being called in JavaScript. + + a1, a2 ... an : subsequesnt arguments will be passed to the JavaScript function. + + Example: + + var j:JavaScriptProxy = new JavaScriptProxy(); + + j.call("jsFunction", "foo", [1, 2]); + */ + public function call(functionName:String):Void + { + var len:Number = arguments.length; + + var argsString:String = ""; + + //Serialize the arguments + for(var i:Number = 0; i < len; i++) + { + argsString += JavaScriptSerializer.serializeItem(arguments[i]); + + if(i != len - 1) + { + argsString += ","; + } + } + + //Created the javascript URL + var callString:String = "javascript:FlashProxy.callJS(" + argsString + ");"; + + //call out into the HTML / JavaScript environment + getURL(callString); + } + +} Index: lams_flash/src/common/flash/com/macromedia/javascript/JavaScriptSerializer.as =================================================================== diff -u --- lams_flash/src/common/flash/com/macromedia/javascript/JavaScriptSerializer.as (revision 0) +++ lams_flash/src/common/flash/com/macromedia/javascript/JavaScriptSerializer.as (revision b5f1c6147aeaaec0f5084813209fe0cf59a1c386) @@ -0,0 +1,478 @@ +/* + JavaScriptSerializer.as + + Part of the Flash / JavaScript Integration Kit + http://www.macromedia.com/go/flashjavascript + + Created by: + + Mike Chambers + http://weblogs.macromedia.com/mesh/ + mesh@macromedia.com + + Christian Cantrell + http://weblogs.macromedia.com/cantrell/ + cantrell@macromedia.com + + ---- + Macromedia(r) Flash(r)./ JavaScript Integration Kit License + + + Copyright (c) 2005 Macromedia, inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + + 3. The end-user documentation included with the redistribution, if any, must + include the following acknowledgment: + + "This product includes software developed by Macromedia, Inc. + (http://www.macromedia.com)." + + Alternately, this acknowledgment may appear in the software itself, if and + wherever such third-party acknowledgments normally appear. + + 4. The name Macromedia must not be used to endorse or promote products derived + from this software without prior written permission. For written permission, + please contact devrelations@macromedia.com. + + 5. Products derived from this software may not be called "Macromedia" or + “Macromedia Flash”, nor may "Macromedia" or “Macromedia Flash” appear in their + name. + + THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MACROMEDIA OR + ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + DAMAGE. + +*/ + +class com.macromedia.javascript.JavaScriptSerializer +{ + + /**************** Serialization Methods ****************/ + + /* + Static function that serializes any supported data types. + + Returns a String + */ + public static function serializeItem(item:Object):String + { + var type:String = typeof(item); + var out:String; + + switch (type) + { + case "string": + { + out = JavaScriptSerializer.serializeString(String(item)); + break; + } + case "number": + { + out = JavaScriptSerializer.serializeNumber(Number(item)); + break; + } + case "boolean": + { + out = JavaScriptSerializer.serializeBoolean(Boolean(item)); + break; + } + case "null": + { + out = JavaScriptSerializer.serializeNull(); + break; + } + case "undefined": + { + out = JavaScriptSerializer.serializeUndefined(); + break; + } + case "object": + { + if(item instanceof Date) + { + out = JavaScriptSerializer.serializeDate(new Date(item.getTime())); + } + else if(item instanceof Array) + { + out = JavaScriptSerializer.serializeArray(item); + } + else + { + //treat it as regular Object + out = JavaScriptSerializer.serializeObject(item); + } + + break; + } + } + + return out; + + } + + /* Serializes an Object */ + public static function serializeObject(o:Object):String + { + var sb:String = "{"; + + for(var x:String in o) + { + + //dont include functions + if(typeof(x[o]) == "function") + { + continue; + } + + sb += x + ":" + serializeItem(o[x]) + ","; + } + + //remove the trailing "," + if(sb.substring(sb.length - 1) == ",") + { + sb = sb.substring(0, sb.length - 1); + } + + sb += "}"; + + return sb; + } + + /* Serializes an Array */ + //not typed since I can't cast an object to Array + public static function serializeArray(o):String + { + var len:Number = o.length; + + var sb:String = "["; + + for(var i:Number = 0; i < len; i++) + { + sb += serializeItem(o[i]); + + if(i != len - 1) + { + sb += ","; + } + } + + sb += "]"; + + return sb; + } + + /* Serializes a String */ + public static function serializeString(s:String):String + { + return "'" + s + "'"; + } + + /* Serializes a Number */ + public static function serializeNumber(n:Number):String + { + return String(n); + } + + /* Serializes a Boolean value */ + public static function serializeBoolean(b:Boolean):String + { + return String(b); + } + + /* Serializes undefined */ + public static function serializeUndefined(Void):String + { + return "undefined"; + } + + /* Serializes null */ + public static function serializeNull(Void):String + { + return "null"; + } + + /* Serializes a Date */ + public static function serializeDate(d:Date):String + { + return "new Date(" + d.getTime() + ")"; + } + + + /**************** De-Serialization Methods ****************/ + + /* + Static function that de-serializes any supported data types. + + Returns a String + */ + public static function deserializeItem(type:String, data:String):Object + { + var out:Object; + + switch (type) + { + case "str": + { + out = JavaScriptSerializer.deserializeString(data); + break; + } + case "num": + { + out = JavaScriptSerializer.deserializeNumber(data); + break; + } + case "bool": + { + out = JavaScriptSerializer.deserializeBoolean(data); + break; + } + case "null": + { + out = JavaScriptSerializer.deserializeNull(); + break; + } + case "undf": + { + out = JavaScriptSerializer.deserializeUndefined(); + break; + } + case "date": + { + out = JavaScriptSerializer.deserializeDate(data); + + break; + } + case "xser": + { + out = JavaScriptSerializer.deserializeXMLSerializedItem(data); + + trace(data); + + break; + } + + } + + return out; + } + + /* Deserializes a String */ + public static function deserializeString(s:String):String + { + return s; + } + + /* Deserializes a Number */ + public static function deserializeNumber(s:String):Number + { + return Number(s); + } + + /* Deserializes a Boolean Value */ + public static function deserializeBoolean(s:String):String + { + return Boolean(s); + } + + /* Deserializes undefined */ + //returns undefined + public static function deserializeUndefined(s:String) + { + return undefined; + } + + /* Deserializes null */ + //returns null + public static function deserializeNull(s:String) + { + return null; + } + + /* Deserializes a Date */ + public static function deserializeDate(s:String):Date + { + return new Date(Number(s)); + } + + + /**************** De-Serialization XML Methods ****************/ + + /* + The methods below are for deserializing data serialized in XML format. + + This is used for serializing Objects and Arrays + */ + + + /* + Static function that de-serializes any supported XML serialized data types. + + Returns a String + */ + public static function deserializeXMLSerializedItem(data:String):Object + { + var x:XML = new XML(); + x.ignoreWhite = true; + x.parseXML(data); + + var out:Object = parseNode(x.firstChild.firstChild, new Object); + + return out; + } + + /* recursive function that parses the xml tree */ + public static function parseNode(x:XMLNode, o:Object):Object + { + + var nodeName:String = x.nodeName; + var nodeValue:String = x.firstChild.nodeValue; + var varName:String = x.attributes["name"]; + + var children:Array = x.childNodes; + var len:Number = children.length; + + switch(nodeName) + { + case "obj": + { + if(varName == null) + { + o = new Object(); + } + else + { + o[varName] = new Object(); + } + break; + } + case "str": + { + if(varName == undefined) + { + o = String(nodeValue); + } + else + { + o[varName] = nodeValue; + } + + break; + } + case "num": + { + if(varName == null) + { + o = Number(nodeValue); + } + else + { + o[varName] = Number(nodeValue); + } + + break; + } + case "bool": + { + if(varName == null) + { + o = Boolean(nodeValue); + } + else + { + o[varName] = Boolean(nodeValue); + } + + break; + } + case "null": + { + if(varName == null) + { + o = null; + } + else + { + o[varName] = null; + } + + break; + } + case "undf": + { + if(varName == null) + { + o = undefined; + } + else + { + o[varName] = undefined; + } + + break; + } + case "date": + { + if(varName == null) + { + o = new Date(Number(nodeValue)); + } + else + { + o[varName] = new Date(Number(nodeValue)); + } + + break; + } + case "array": + { + //this is not typed because the compiler gets confused about + //the explicit type change for o below. + var arr; + if(varName == null) + { + o = new Array(); + arr = o; + } + else + { + o[varName] = new Array(); + arr = o[varName]; + } + + for(var x:Number = 0; x < len; x++) + { + arr.push(parseNode(children[x], o)); + } + + return arr; + } + } + + for(var i:Number = 0; i < len; i++) + { + parseNode(children[i], o); + } + + + return o; + } + + + +} Index: lams_flash/src/common/flash/org/lamsfoundation/lams/common/util/StringUtils.as =================================================================== diff -u -r5402161894c885b6aa39fd5f86a12b854f377ffc -rb5f1c6147aeaaec0f5084813209fe0cf59a1c386 --- lams_flash/src/common/flash/org/lamsfoundation/lams/common/util/StringUtils.as (.../StringUtils.as) (revision 5402161894c885b6aa39fd5f86a12b854f377ffc) +++ lams_flash/src/common/flash/org/lamsfoundation/lams/common/util/StringUtils.as (.../StringUtils.as) (revision b5f1c6147aeaaec0f5084813209fe0cf59a1c386) @@ -327,6 +327,16 @@ } else { return 0; } + } + + public static function scanString(s:String, char:String):Array { + var charArray:Array = new Array(); + for(var i:Number = 0; i < s.length; i++) { + if(s.charAt(i) == char){ + charArray.push(i); + } + } + return charArray; } } \ No newline at end of file Index: lams_learning/build.xml =================================================================== diff -u -rfc53b89c646f614926e03ccaae7ca4a66e641cfd -rb5f1c6147aeaaec0f5084813209fe0cf59a1c386 --- lams_learning/build.xml (.../build.xml) (revision fc53b89c646f614926e03ccaae7ca4a66e641cfd) +++ lams_learning/build.xml (.../build.xml) (revision b5f1c6147aeaaec0f5084813209fe0cf59a1c386) @@ -249,6 +249,8 @@ + + Index: lams_learning/web/controlFrame.jsp =================================================================== diff -u -r64938df458cbab9999f9a826ef2902d061648d7d -rb5f1c6147aeaaec0f5084813209fe0cf59a1c386 --- lams_learning/web/controlFrame.jsp (.../controlFrame.jsp) (revision 64938df458cbab9999f9a826ef2902d061648d7d) +++ lams_learning/web/controlFrame.jsp (.../controlFrame.jsp) (revision b5f1c6147aeaaec0f5084813209fe0cf59a1c386) @@ -34,7 +34,11 @@ + + + + @@ -103,16 +112,21 @@ String clientVersion = Configuration.get(ConfigurationKeys.LEARNER_CLIENT_VERSION); String serverLanguage = Configuration.get(ConfigurationKeys.SERVER_LANGUAGE); String languageDate = Configuration.get(ConfigurationKeys.DICTIONARY_DATE_CREATED); + String jabberServer = Configuration.get(ConfigurationKeys.XMPP_DOMAIN); %> - ?userID=&serverURL=&build=<%=clientVersion%>&lang=&country=&langDate=<%=languageDate%>&theme=&lessonID=&uniqueID=&mode= + ?userID=&firstName=&lastName=&serverURL=&presenceServerUrl=<%=jabberServer%>&build=<%=clientVersion%>&lang=&country=&langDate=<%=languageDate%>&theme=&lessonID=&uniqueID=&mode= lams_learner lams_learner.swf + +