From 35cdd55c4925b8518e73264097801073d746c17f Mon Sep 17 00:00:00 2001 From: lukeIam Date: Tue, 18 Feb 2014 16:37:41 +0100 Subject: [PATCH 1/6] Use auto-properties in CServer --- ClientServerLib/ClientServerLib/CServer.cs | 184 ++++----------------- 1 file changed, 28 insertions(+), 156 deletions(-) diff --git a/ClientServerLib/ClientServerLib/CServer.cs b/ClientServerLib/ClientServerLib/CServer.cs index ac50a6d5..76c762de 100644 --- a/ClientServerLib/ClientServerLib/CServer.cs +++ b/ClientServerLib/ClientServerLib/CServer.cs @@ -1,8 +1,8 @@ using System; -using System.ServiceModel; -using System.ServiceModel.Web; using System.Diagnostics; using System.Net; +using System.ServiceModel; +using System.ServiceModel.Web; namespace ServerLib { @@ -12,192 +12,64 @@ namespace ServerLib private Uri _BaseAddress; private bool _Encrypted = false; - private static SendKeyEventDelegate _SendKeyEvent; - public static SendKeyEventDelegate SendKeyEvent - { - internal get { return CServer._SendKeyEvent; } - set { CServer._SendKeyEvent = value; } - } + public static SendKeyEventDelegate SendKeyEvent { internal get; set; } #region profile + public static GetProfileDataDelegate GetProfileData { internal get; set; } - private static GetProfileDataDelegate _GetProfileData; - public static GetProfileDataDelegate GetProfileData - { - internal get { return CServer._GetProfileData; } - set { CServer._GetProfileData = value; } - } - - private static SendProfileDataDelegate _SendProfileData; - public static SendProfileDataDelegate SendProfileData - { - internal get { return CServer._SendProfileData; } - set { CServer._SendProfileData = value; } - } - - private static GetProfileListDelegate _GetProfileList; - public static GetProfileListDelegate GetProfileList - { - internal get { return CServer._GetProfileList; } - set { CServer._GetProfileList = value; } - } + public static SendProfileDataDelegate SendProfileData { internal get; set; } + public static GetProfileListDelegate GetProfileList { internal get; set; } #endregion #region photo - private static SendPhotoDelegate _SendPhoto; - public static SendPhotoDelegate SendPhoto - { - get { return CServer._SendPhoto; } - set { CServer._SendPhoto = value; } - } - + public static SendPhotoDelegate SendPhoto { internal get; set; } #endregion #region website + public static GetSiteFileDelegate GetSiteFile { internal get; set; } - private static GetSiteFileDelegate _GetSiteFile; - public static GetSiteFileDelegate GetSiteFile - { - internal get { return CServer._GetSiteFile; } - set { CServer._GetSiteFile = value; } - } - - private static GetDelayedImageDelegate _GetDelayedImage; - public static GetDelayedImageDelegate GetDelayedImage - { - internal get { return CServer._GetDelayedImage; } - set { CServer._GetDelayedImage = value; } - } - + public static GetDelayedImageDelegate GetDelayedImage { internal get; set; } #endregion #region songs + public static GetSongDelegate GetSong { internal get; set; } - private static GetSongDelegate _GetSong; - public static GetSongDelegate GetSong - { - internal get { return CServer._GetSong; } - set { CServer._GetSong = value; } - } - - private static GetAllSongsDelegate _GetAllSongs; - public static GetAllSongsDelegate GetAllSongs - { - internal get { return CServer._GetAllSongs; } - set { CServer._GetAllSongs = value; } - } - - private static GetCurrentSongIdDelegate _GetCurrentSongId; - public static GetCurrentSongIdDelegate GetCurrentSongId - { - internal get { return CServer._GetCurrentSongId; } - set { CServer._GetCurrentSongId = value; } - } - + public static GetAllSongsDelegate GetAllSongs { internal get; set; } + public static GetCurrentSongIdDelegate GetCurrentSongId { internal get; set; } #endregion #region playlist + public static GetPlaylistsDelegate GetPlaylists { internal get; set; } - private static GetPlaylistsDelegate _GetPlaylists; - public static GetPlaylistsDelegate GetPlaylists - { - internal get { return _GetPlaylists; } - set { _GetPlaylists = value; } - } + public static GetPlaylistDelegate GetPlaylist { internal get; set; } + public static AddSongToPlaylistDelegate AddSongToPlaylist { internal get; set; } - private static GetPlaylistDelegate _GetPlaylist; - public static GetPlaylistDelegate GetPlaylist - { - internal get { return _GetPlaylist; } - set { _GetPlaylist = value; } - } + public static RemoveSongFromPlaylistDelegate RemoveSongFromPlaylist { internal get; set; } - private static AddSongToPlaylistDelegate _AddSongToPlaylist; - public static AddSongToPlaylistDelegate AddSongToPlaylist - { - internal get { return _AddSongToPlaylist; } - set { _AddSongToPlaylist = value; } - } + public static MoveSongInPlaylistDelegate MoveSongInPlaylist { internal get; set; } - private static RemoveSongFromPlaylistDelegate _RemoveSongFromPlaylist; - public static RemoveSongFromPlaylistDelegate RemoveSongFromPlaylist - { - internal get { return _RemoveSongFromPlaylist; } - set { _RemoveSongFromPlaylist = value; } - } + public static PlaylistContainsSongDelegate PlaylistContainsSong { internal get; set; } - private static MoveSongInPlaylistDelegate _MoveSongInPlaylist; - public static MoveSongInPlaylistDelegate MoveSongInPlaylist - { - internal get { return _MoveSongInPlaylist; } - set { _MoveSongInPlaylist = value; } - } + public static GetPlaylistSongsDelegate GetPlaylistSongs { internal get; set; } - private static PlaylistContainsSongDelegate _PlaylistContainsSong; - public static PlaylistContainsSongDelegate PlaylistContainsSong - { - internal get { return _PlaylistContainsSong; } - set { _PlaylistContainsSong = value; } - } - - private static GetPlaylistSongsDelegate _GetPlaylistSongs; - public static GetPlaylistSongsDelegate GetPlaylistSongs - { - internal get { return _GetPlaylistSongs; } - set { _GetPlaylistSongs = value; } - } - - private static RemovePlaylistDelegate _RemovePlaylist; - public static RemovePlaylistDelegate RemovePlaylist - { - internal get { return _RemovePlaylist; } - set { _RemovePlaylist = value; } - } - - private static AddPlaylistDelegate _AddPlaylist; - public static AddPlaylistDelegate AddPlaylist - { - internal get { return _AddPlaylist; } - set { _AddPlaylist = value; } - } + public static RemovePlaylistDelegate RemovePlaylist { internal get; set; } + public static AddPlaylistDelegate AddPlaylist { internal get; set; } #endregion #region user management + public static ValidatePasswordDelegate ValidatePassword { internal get; set; } - private static ValidatePasswordDelegate _ValidatePassword; - public static ValidatePasswordDelegate ValidatePassword - { - internal get { return CServer._ValidatePassword; } - set { CServer._ValidatePassword = value; } - } + public static GetUserRoleDelegate GetUserRole { internal get; set; } - private static GetUserRoleDelegate _GetUserRole; - public static GetUserRoleDelegate GetUserRole - { - internal get { return CServer._GetUserRole; } - set { CServer._GetUserRole = value; } - } + public static SetUserRoleDelegate SetUserRole { internal get; set; } - private static SetUserRoleDelegate _SetUserRole; - public static SetUserRoleDelegate SetUserRole - { - internal get { return CServer._SetUserRole; } - set { CServer._SetUserRole = value; } - } - - private static GetUserIdFromUsernameDelegate _GetUserIdFromUsername; - public static GetUserIdFromUsernameDelegate GetUserIdFromUsername - { - internal get { return CServer._GetUserIdFromUsername; } - set { CServer._GetUserIdFromUsername = value; } - } - + public static GetUserIdFromUsernameDelegate GetUserIdFromUsername { internal get; set; } #endregion - + public CServer(int port, bool encrypted) { _Init(port, encrypted); @@ -206,7 +78,7 @@ namespace ServerLib public string GetBaseAddress() { return _BaseAddress.AbsoluteUri; - + /*IPAddress[] ips = Dns.GetHostAddresses(Dns.GetHostName()); foreach (IPAddress ip in ips) { @@ -305,7 +177,7 @@ namespace ServerLib ProcessStartInfo info = new ProcessStartInfo { FileName = "VocaluxeServerConfig.exe", - Arguments = port.ToString() + " " + (_Encrypted?"true":"false"), + Arguments = port.ToString() + " " + (_Encrypted ? "true" : "false"), UseShellExecute = true, CreateNoWindow = true, WindowStyle = ProcessWindowStyle.Hidden, From 3144ea24b9c230636ed2fcdbf7d09a5fd3649b8d Mon Sep 17 00:00:00 2001 From: lukeIam Date: Sat, 1 Mar 2014 15:43:02 +0100 Subject: [PATCH 2/6] Implemented a per player comunicationsystem for the app. --- ClientServerLib/ClientServerLib/CServer.cs | 4 +- .../ClientServerLib/CWebservice.cs | 36 ++- .../ClientServerLib/DataStructs.cs | 40 ++-- .../ClientServerLib/ICWebservice.cs | 7 + .../PlayerComunication/CUserCommunication.cs | 209 ++++++++++++++++++ .../DataTypes/CPlayerComunicationData.cs | 10 + .../CPlayerComunicationDataString.cs | 13 ++ .../CPlayerComunicationDataSubscription.cs | 15 ++ .../DataTypes/EPlayerComunicationType.cs | 12 + .../ClientServerLib/ServerLib.csproj | 6 + Vocaluxe.sln | 3 + Vocaluxe/Website/js/main.js | 144 ++++++++++-- 12 files changed, 455 insertions(+), 44 deletions(-) create mode 100644 ClientServerLib/ClientServerLib/PlayerComunication/CUserCommunication.cs create mode 100644 ClientServerLib/ClientServerLib/PlayerComunication/DataTypes/CPlayerComunicationData.cs create mode 100644 ClientServerLib/ClientServerLib/PlayerComunication/DataTypes/CPlayerComunicationDataString.cs create mode 100644 ClientServerLib/ClientServerLib/PlayerComunication/DataTypes/CPlayerComunicationDataSubscription.cs create mode 100644 ClientServerLib/ClientServerLib/PlayerComunication/DataTypes/EPlayerComunicationType.cs diff --git a/ClientServerLib/ClientServerLib/CServer.cs b/ClientServerLib/ClientServerLib/CServer.cs index 76c762de..a9306a8b 100644 --- a/ClientServerLib/ClientServerLib/CServer.cs +++ b/ClientServerLib/ClientServerLib/CServer.cs @@ -1,4 +1,5 @@ -using System; +using ServerLib.PlayerComunication; +using System; using System.Diagnostics; using System.Net; using System.ServiceModel; @@ -73,6 +74,7 @@ namespace ServerLib public CServer(int port, bool encrypted) { _Init(port, encrypted); + CPlayerCommunication.Init(); } public string GetBaseAddress() diff --git a/ClientServerLib/ClientServerLib/CWebservice.cs b/ClientServerLib/ClientServerLib/CWebservice.cs index 8da01ab2..4b319335 100644 --- a/ClientServerLib/ClientServerLib/CWebservice.cs +++ b/ClientServerLib/ClientServerLib/CWebservice.cs @@ -1,9 +1,10 @@ -using System; +using ServerLib.PlayerComunication; +using System; +using System.IO; using System.Net; using System.ServiceModel; -using System.ServiceModel.Web; -using System.IO; using System.ServiceModel.Channels; +using System.ServiceModel.Web; namespace ServerLib { @@ -82,8 +83,8 @@ namespace ServerLib if (profile.ProfileId != -1) //-1 is the id for a new profile { - if (CSessionControl.GetUserIdFromSession(sessionKey) != profile.ProfileId - && !(_CheckRight(EUserRights.EditAllProfiles) )) + if (CSessionControl.GetUserIdFromSession(sessionKey) != profile.ProfileId + && !(_CheckRight(EUserRights.EditAllProfiles))) { return; } @@ -303,7 +304,7 @@ namespace ServerLib { return true; } - + #endregion #region songs @@ -403,7 +404,7 @@ namespace ServerLib CServer.SetUserRole(profileId, userRole); } } - + public bool HasUserRight(int right) { return _CheckRightWithNoErrorMessage((EUserRights)right); @@ -452,7 +453,26 @@ namespace ServerLib return true; } + public SPlayerComunicationFrame[] PlayerComunication(SPlayerComunicationFrame[] recivedData) + { + Guid sessionKey = _GetSession(); + + if (sessionKey == Guid.Empty) + { + if (WebOperationContext.Current != null) + { + WebOperationContext.Current.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.Forbidden; + WebOperationContext.Current.OutgoingResponse.StatusDescription = "No session"; + } + + return null; + } + int userId = CSessionControl.GetUserIdFromSession(sessionKey); + CPlayerCommunication.AddMessagesFromPlayer(recivedData, userId); + + return CPlayerCommunication.GetAllMessagesForPlayer(userId); + } #endregion - + } } diff --git a/ClientServerLib/ClientServerLib/DataStructs.cs b/ClientServerLib/ClientServerLib/DataStructs.cs index cf52fd80..faba1680 100644 --- a/ClientServerLib/ClientServerLib/DataStructs.cs +++ b/ClientServerLib/ClientServerLib/DataStructs.cs @@ -1,9 +1,10 @@ -using System; +using ServerLib.PlayerComunication.DataTypes; +using System; +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; using System.Linq; using System.Runtime.Serialization; -using System.Drawing; -using System.IO; -using System.Drawing.Imaging; using System.Text.RegularExpressions; namespace ServerLib @@ -108,8 +109,8 @@ namespace ServerLib public delegate SSongInfo[] GetAllSongsDelegate(); public delegate int GetCurrentSongIdDelegate(); - - + + [DataContract] public struct SSongInfo { @@ -155,26 +156,26 @@ namespace ServerLib [DataContract] public struct SPlaylistSongInfo { - [DataMember] + [DataMember] public SSongInfo Song; [DataMember] public int PlaylistId; - [DataMember] + [DataMember] public int PlaylistPosition; [DataMember] public int GameMode; } - + [DataContract] public struct SPlaylistInfo { - [DataMember] + [DataMember] public int PlaylistId; - [DataMember] + [DataMember] public string PlaylistName; - [DataMember] + [DataMember] public int SongCount; - [DataMember] + [DataMember] public string LastChanged; } @@ -192,5 +193,18 @@ namespace ServerLib public delegate int GetUserIdFromUsernameDelegate(string username); + [DataContract] + public struct SPlayerComunicationFrame + { + [DataMember] + public int ProfileId; + [DataMember] + public DateTime ValidTill; + [DataMember] + public EPlayerComunicationType Type; + [DataMember] + public String Data; + } + #endregion } diff --git a/ClientServerLib/ClientServerLib/ICWebservice.cs b/ClientServerLib/ClientServerLib/ICWebservice.cs index 3e79d8ce..b7401c6e 100644 --- a/ClientServerLib/ClientServerLib/ICWebservice.cs +++ b/ClientServerLib/ClientServerLib/ICWebservice.cs @@ -209,6 +209,13 @@ namespace ServerLib UriTemplate = "/hasUserRight?right={right}")] bool HasUserRight(int right); + [OperationContract] + [WebInvoke(Method = "POST", + ResponseFormat = WebMessageFormat.Json, + RequestFormat = WebMessageFormat.Json, + UriTemplate = "/playerComunication")] + SPlayerComunicationFrame[] PlayerComunication(SPlayerComunicationFrame[] recivedData); + #endregion } } \ No newline at end of file diff --git a/ClientServerLib/ClientServerLib/PlayerComunication/CUserCommunication.cs b/ClientServerLib/ClientServerLib/PlayerComunication/CUserCommunication.cs new file mode 100644 index 00000000..d1a3fce3 --- /dev/null +++ b/ClientServerLib/ClientServerLib/PlayerComunication/CUserCommunication.cs @@ -0,0 +1,209 @@ +using ServerLib.PlayerComunication.DataTypes; +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; +using System.Threading; +using System.Web.Script.Serialization; + +namespace ServerLib.PlayerComunication +{ + public static class CPlayerCommunication + { + public delegate void IncommingMessageDelegate(CPlayerComunicationData data); + + private static readonly Dictionary> _OutgoingMessagesPerUser + = new Dictionary>(); + + private static readonly Queue _IncommingMessages = new Queue(); + + private static readonly Dictionary> _IncommingMessageHandler + = new Dictionary>(); + + private static readonly Dictionary> _Subscriptions + = new Dictionary>(); + + private static readonly Dictionary _TypeMapping + = new Dictionary(); + + internal static void Init() + { + SetDataType(EPlayerComunicationType.RegisterSubscription, typeof(CPlayerComunicationDataSubscription)); + AddIncommingHandler(EPlayerComunicationType.RegisterSubscription, + data => _AddSubscription(((CPlayerComunicationDataSubscription)data).Type, + ((CPlayerComunicationDataSubscription)data).PlayerId)); + + SetDataType(EPlayerComunicationType.UnregisterSubscription, typeof(CPlayerComunicationDataSubscription)); + AddIncommingHandler(EPlayerComunicationType.UnregisterSubscription, + data => _RemoveSubscription(((CPlayerComunicationDataSubscription)data).Type, + ((CPlayerComunicationDataSubscription)data).PlayerId)); + } + + public static void AddNewPlayerMessage(int targetPlayerId, + EPlayerComunicationType type, ISerializable data, + DateTime validTill) + { + if (!_OutgoingMessagesPerUser.ContainsKey(targetPlayerId)) + { + _OutgoingMessagesPerUser.Add(targetPlayerId, new List(2)); + } + + _OutgoingMessagesPerUser[targetPlayerId].Add(new SPlayerComunicationFrame + { + ProfileId = targetPlayerId, + Type = type, + Data = _SerializeHelper(data), + ValidTill = validTill + }); + } + + public static void AddNewPlayerMessage(int tagertPlayerId, + EPlayerComunicationType type, ISerializable data) + { + AddNewPlayerMessage(tagertPlayerId, type, data, DateTime.Now.AddMinutes(1)); + } + + public static void AddNewPlayerMessage(EPlayerComunicationType type, ISerializable data, + DateTime validTill) + { + if (_Subscriptions.ContainsKey(type)) + { + foreach (int subscribedPlayers in _Subscriptions[type]) + { + AddNewPlayerMessage(subscribedPlayers, type, data, validTill); + } + } + + } + + public static void AddNewPlayerMessage(EPlayerComunicationType type, ISerializable data) + { + AddNewPlayerMessage(type, data, DateTime.Now.AddMinutes(1)); + } + + internal static SPlayerComunicationFrame[] GetAllMessagesForPlayer(int playerId) + { + SPlayerComunicationFrame[] messages = null; + if (_OutgoingMessagesPerUser.ContainsKey(playerId)) + { + messages = _OutgoingMessagesPerUser[playerId].ToArray(); + _OutgoingMessagesPerUser[playerId].Clear(); + } + return new SPlayerComunicationFrame[]{ + new SPlayerComunicationFrame() + { + ProfileId = 0, + Type = EPlayerComunicationType.RegisterSubscription, + ValidTill = DateTime.Now.AddMinutes(1), + Data = _SerializeHelper(new CPlayerComunicationDataString(){Data = "Test"}) + } + }; + //return messages; + } + + public static void RemoveAllMessages(int playerId, EPlayerComunicationType type) + { + if (_OutgoingMessagesPerUser.ContainsKey(playerId)) + { + _OutgoingMessagesPerUser[playerId].RemoveAll(m => m.Type == type); + } + } + + internal static void AddMessagesFromPlayer(IEnumerable messages, int playerId) + { + if (messages == null || playerId < 0) + { + return; + } + + foreach (SPlayerComunicationFrame message in messages) + { + SPlayerComunicationFrame data = message; + data.ProfileId = playerId; + _IncommingMessages.Enqueue(data); + } + + if (_IncommingMessages.Count > 0) + { + ThreadPool.QueueUserWorkItem(_ProcessIncommingQueue); + } + } + + private static void _ProcessIncommingQueue(object dummy) + { + lock (_IncommingMessages) + { + foreach (SPlayerComunicationFrame message in _IncommingMessages) + { + if (_IncommingMessageHandler.ContainsKey(message.Type)) + { + List handlers = _IncommingMessageHandler[message.Type]; + var deserializedData = _DeserializeHelper(message.Data, message.Type); + foreach (IncommingMessageDelegate handler in handlers) + { + handler(deserializedData); + } + } + } + } + } + + public static void SetDataType(EPlayerComunicationType type, Type dataType) + { + if (_TypeMapping.ContainsKey(type)) + { + _TypeMapping.Add(type, dataType); + } + else + { + _TypeMapping[type] = dataType; + } + } + + public static void AddIncommingHandler(EPlayerComunicationType type, IncommingMessageDelegate handler) + { + if (!_IncommingMessageHandler.ContainsKey(type)) + { + _IncommingMessageHandler.Add(type, new List(2)); + } + + _IncommingMessageHandler[type].Add(handler); + } + + private static void _AddSubscription(EPlayerComunicationType type, int playerId) + { + if (!_Subscriptions.ContainsKey(type)) + { + _Subscriptions.Add(type, new List(2)); + } + if (!_Subscriptions[type].Contains(playerId)) + { + _Subscriptions[type].Add(playerId); + } + } + + private static void _RemoveSubscription(EPlayerComunicationType type, int playerId) + { + if (_Subscriptions.ContainsKey(type) && _Subscriptions[type].Contains(playerId)) + { + _Subscriptions[type].Remove(playerId); + } + } + + private static CPlayerComunicationData _DeserializeHelper(String data, EPlayerComunicationType type) + { + if (_TypeMapping.ContainsKey(type)) + { + return (CPlayerComunicationData)(new JavaScriptSerializer()).Deserialize(data, _TypeMapping[type]); + } + else + { + return new CPlayerComunicationDataString { Data = data }; + } + } + + private static string _SerializeHelper(Object data) + { + return (new JavaScriptSerializer()).Serialize(data); + } + } +} diff --git a/ClientServerLib/ClientServerLib/PlayerComunication/DataTypes/CPlayerComunicationData.cs b/ClientServerLib/ClientServerLib/PlayerComunication/DataTypes/CPlayerComunicationData.cs new file mode 100644 index 00000000..93a84041 --- /dev/null +++ b/ClientServerLib/ClientServerLib/PlayerComunication/DataTypes/CPlayerComunicationData.cs @@ -0,0 +1,10 @@ + +using System; + +namespace ServerLib.PlayerComunication.DataTypes +{ + [Serializable] + public abstract class CPlayerComunicationData + { + } +} diff --git a/ClientServerLib/ClientServerLib/PlayerComunication/DataTypes/CPlayerComunicationDataString.cs b/ClientServerLib/ClientServerLib/PlayerComunication/DataTypes/CPlayerComunicationDataString.cs new file mode 100644 index 00000000..dc933e80 --- /dev/null +++ b/ClientServerLib/ClientServerLib/PlayerComunication/DataTypes/CPlayerComunicationDataString.cs @@ -0,0 +1,13 @@ + +using System; +using System.Runtime.Serialization; + +namespace ServerLib.PlayerComunication.DataTypes +{ + [Serializable] + public class CPlayerComunicationDataString : CPlayerComunicationData + { + [DataMember] + public string Data { get; set; } + } +} diff --git a/ClientServerLib/ClientServerLib/PlayerComunication/DataTypes/CPlayerComunicationDataSubscription.cs b/ClientServerLib/ClientServerLib/PlayerComunication/DataTypes/CPlayerComunicationDataSubscription.cs new file mode 100644 index 00000000..e68c9630 --- /dev/null +++ b/ClientServerLib/ClientServerLib/PlayerComunication/DataTypes/CPlayerComunicationDataSubscription.cs @@ -0,0 +1,15 @@ + +using System; +using System.Runtime.Serialization; + +namespace ServerLib.PlayerComunication.DataTypes +{ + [Serializable] + public class CPlayerComunicationDataSubscription : CPlayerComunicationData + { + [DataMember] + public EPlayerComunicationType Type { get; set; } + [DataMember] + public int PlayerId { get; set; } + } +} diff --git a/ClientServerLib/ClientServerLib/PlayerComunication/DataTypes/EPlayerComunicationType.cs b/ClientServerLib/ClientServerLib/PlayerComunication/DataTypes/EPlayerComunicationType.cs new file mode 100644 index 00000000..de16c795 --- /dev/null +++ b/ClientServerLib/ClientServerLib/PlayerComunication/DataTypes/EPlayerComunicationType.cs @@ -0,0 +1,12 @@ + +using System; + +namespace ServerLib.PlayerComunication.DataTypes +{ + [Serializable] + public enum EPlayerComunicationType + { + RegisterSubscription, + UnregisterSubscription + } +} diff --git a/ClientServerLib/ClientServerLib/ServerLib.csproj b/ClientServerLib/ClientServerLib/ServerLib.csproj index 21ee0f0e..27606601 100644 --- a/ClientServerLib/ClientServerLib/ServerLib.csproj +++ b/ClientServerLib/ClientServerLib/ServerLib.csproj @@ -58,6 +58,7 @@ + @@ -67,9 +68,14 @@ + + + + + diff --git a/Vocaluxe.sln b/Vocaluxe.sln index 5d225110..091b83d9 100644 --- a/Vocaluxe.sln +++ b/Vocaluxe.sln @@ -183,4 +183,7 @@ Global GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(Performance) = preSolution + HasPerformanceSessions = true + EndGlobalSection EndGlobal diff --git a/Vocaluxe/Website/js/main.js b/Vocaluxe/Website/js/main.js index 53b892be..75220d70 100644 --- a/Vocaluxe/Website/js/main.js +++ b/Vocaluxe/Website/js/main.js @@ -8,6 +8,7 @@ var customSelectPlaylistSongCallback = null; var sessionId = ""; var serverBaseAddress = ""; var translationLoaded; +var playerComunication = new PlayerComunication(); if (document.location.protocol == "file:") { if (typeof (window.deviceAndJqmLoaded) == "undefined") { @@ -39,7 +40,6 @@ function start() { initMainPageHandler(); initDiscoverPageHandler(); initLoginPageHandler(); - initHeartbeat(); initVideoPopup(); } @@ -1055,33 +1055,15 @@ function logout() { profileIdRequest = -1; songIdRequest = -1; sessionId = ""; + + playerComunication.reset(); + if (window.localStorage) { window.localStorage.setItem("VocaluxeSessionKey", ""); } $.mobile.changePage("#login", { transition: "slidefade" }); } -function checkSession() { - if (ownProfileId == -1 - && profileIdRequest == -1 - && ($.mobile.activePage.attr("id") == "displayProfile" || $.mobile.activePage.attr("id") == "login" || $.mobile.activePage.attr("id") == "discover")) { - return; - } - request({ - url: "getOwnProfileId" - }, "noOverlay").done(function (result) { - if (result == -1) { - logout(); - } - }).fail(function (result) { - logout(); - }); -} - -function initHeartbeat() { - setInterval(checkSession, 20000); -} - function request(data, message) { if ((typeof message) == "undefined" || message == null) { message = "Loading..."; @@ -1286,3 +1268,121 @@ function translate() { $('body').i18n(); repairButtons(); } + +function PlayerComunication() { + var playerComunicationToServer = []; + var playerComunicationFromServerHandler = {}; + var defaultHeartbeatIntervall = 5000; + var heartbeatIntervalls = []; + var heartbeatIntervallId; + + var init = function () { + startHeartbeat(); + }; + + var checkPlayerMessages = function () { + if (ownProfileId == -1 + && profileIdRequest == -1 + && ($.mobile.activePage.attr("id") == "displayProfile" + || $.mobile.activePage.attr("id") == "login" + || $.mobile.activePage.attr("id") == "discover")) { + return; + } + + request({ + url: "playerComunication", + type: "POST", + dataType: "json", + contentType: "application/json", + data: JSON.stringify(playerComunicationToServer) + }, "noOverlay").done(function (result) { + if (result.length > 0) { + handlePlayerComunicationFromServer(result); + } + }).fail(function (result) { + if (result.status == 403 || result.status == 0) { + logout(); + } + }); + + if (playerComunicationToServer.length > 0) { + setTimeout(checkPlayerMessages, 50); + } + + playerComunicationToServer = []; + }; + + var handlePlayerComunicationFromServer = function (items) { + for (var i = 0; i < items.length; i++) { + if (items[i].ProfileId == ownProfileId && playerComunicationFromServerHandler[items[i].Type]) { + if (new Date() - new Date(parseInt("\/Date(1234656000000)\/".match(/[0-9]+/)[0])) <= 0) { + var deserializedData = JSON.parse(items[i].Data); + for (var j = 0; j < playerComunicationFromServerHandler[items[i].Type]; j++) { + playerComunicationFromServerHandler[items[i].Type][j](deserializedData); + } + } + } + } + }; + + var startHeartbeat = function () { + var interv = defaultHeartbeatIntervall; + for (var i = 0; i < heartbeatIntervalls.length; i++) { + if (interv > heartbeatIntervalls[i] && heartbeatIntervalls[i] >= 50) { + interv = heartbeatIntervalls[i]; + } + } + + if (interv == defaultHeartbeatIntervall && heartbeatIntervalls.length != 0) { + heartbeatIntervalls = []; + } + + clearInterval(heartbeatIntervallId); + heartbeatIntervallId = setInterval(checkPlayerMessages, interv); + }; + + var sendPlayerComunicationToServer = function (packet) { + playerComunicationToServer.push(packet); + }; + + this.registerPlayerComunicationFromServerHandler = function (type, handler) { + if (!playerComunicationFromServerHandler[type]) { + playerComunicationFromServerHandler[type] = []; + } + playerComunicationFromServerHandler[type].push(handler); + }; + + this.sendDataToServer = function (data, type) { + sendPlayerComunicationToServer({ + "ProfileId": ownProfileId, + "ValidTill": "\/Date(" + (((new Date())).getTime() + 60000) + ")\/", + "Type": type, + "Data": JSON.stringify(data) + }); + }; + + //mim 50ms + this.requestIntervall = function (newIntervall) { + heartbeatIntervalls.push(newIntervall); + }; + + this.removeIntervall = function (oldIntervall) { + var index = heartbeatIntervalls.indexOf(oldIntervall); + if (index > -1) { + heartbeatIntervalls.splice(oldIntervall, 1); + } + }; + + this.reset = function () { + playerComunicationToServer = []; + playerComunicationFromServerHandler = {}; + heartbeatIntervalls = []; + }; + + this.EPlayerComunicationType = { + "RegisterSubscription": 0, + "UnregisterSubscription": 1 + }; + + init(); +} \ No newline at end of file From c93262fc5415881732784c010833282cb3d83f6a Mon Sep 17 00:00:00 2001 From: lukeIam Date: Sun, 2 Mar 2014 12:02:30 +0100 Subject: [PATCH 3/6] Fix: can't show own profile --- ClientServerLib/ClientServerLib/CWebservice.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ClientServerLib/ClientServerLib/CWebservice.cs b/ClientServerLib/ClientServerLib/CWebservice.cs index 4b319335..1fa5251a 100644 --- a/ClientServerLib/ClientServerLib/CWebservice.cs +++ b/ClientServerLib/ClientServerLib/CWebservice.cs @@ -106,7 +106,7 @@ namespace ServerLib public SProfileData GetProfile(int profileId) { Guid sessionKey = _GetSession(); - if (_CheckRight(EUserRights.ViewOtherProfiles) || CSessionControl.GetUserIdFromSession(sessionKey) == profileId) + if (CSessionControl.GetUserIdFromSession(sessionKey) == profileId || _CheckRight(EUserRights.ViewOtherProfiles)) { if (CServer.GetProfileData == null) { @@ -469,7 +469,7 @@ namespace ServerLib } int userId = CSessionControl.GetUserIdFromSession(sessionKey); CPlayerCommunication.AddMessagesFromPlayer(recivedData, userId); - + return CPlayerCommunication.GetAllMessagesForPlayer(userId); } #endregion From 3350eb16deb6af81a1e4aec595addccec3a6f244 Mon Sep 17 00:00:00 2001 From: lukeIam Date: Sun, 2 Mar 2014 12:14:38 +0100 Subject: [PATCH 4/6] Fix: sometimes there is no back button in app --- Vocaluxe/Website/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Vocaluxe/Website/index.html b/Vocaluxe/Website/index.html index 1ce7b1e6..0501220f 100644 --- a/Vocaluxe/Website/index.html +++ b/Vocaluxe/Website/index.html @@ -78,7 +78,7 @@ -
+

Volcaluxe

From 7680aad78c64dda7d0022abcadfbc6693c7c947c Mon Sep 17 00:00:00 2001 From: lukeIam Date: Sun, 2 Mar 2014 12:18:51 +0100 Subject: [PATCH 5/6] Mod: Refactored main.js for better structure and readability (grouped methods, which belongs together) --- Vocaluxe/Website/js/main.js | 2665 ++++++++++++++++++----------------- 1 file changed, 1387 insertions(+), 1278 deletions(-) diff --git a/Vocaluxe/Website/js/main.js b/Vocaluxe/Website/js/main.js index 75220d70..9f960bd1 100644 --- a/Vocaluxe/Website/js/main.js +++ b/Vocaluxe/Website/js/main.js @@ -1,628 +1,1358 @@ -var ownProfileId = -1; -var profileIdRequest = -1; -var songIdRequest = -1; -var allSongsCache = null; -var playlistIdRequest = -1; -var playlistRequestName = ""; -var customSelectPlaylistSongCallback = null; -var sessionId = ""; -var serverBaseAddress = ""; -var translationLoaded; -var playerComunication = new PlayerComunication(); +(function () { + var playerComunication; + var imageLoader; + var externalServices; + var translator; + var pageHandler; + var sessionHandler; -if (document.location.protocol == "file:") { - if (typeof (window.deviceAndJqmLoaded) == "undefined") { - window.deviceAndJqmLoaded = $.Deferred(); - } - window.deviceAndJqmLoaded.done(function () { - preStart(); - }); -} else { - $(document).ready(function () { - preStart(); - }); -} - -function preStart() { - translationLoaded = $.Deferred(); - initTranslation(); - - translationLoaded.done(function () { - translate(); - start(); - }); -} - -function start() { - replaceTransitionHandler(); - initPageLoadHandler(); - initKeyboardPageHandler(); - initMainPageHandler(); - initDiscoverPageHandler(); - initLoginPageHandler(); - initVideoPopup(); -} - -function replaceTransitionHandler() { - //Thx to http://stackoverflow.com/a/14096311 - var oldDefaultTransitionHandler = $.mobile.defaultTransitionHandler; - - $.mobile.defaultTransitionHandler = function (name, reverse, $to, $from) { - var promise = $to.data('promise'); - if (promise) { - $to.removeData('promise'); - /*$('div[data-role="content"]').wrap('
'); - $.mobile.loading('show', { - text: 'Loading data...', - textVisible: true - });*/ - return promise.then(function () { - /*$.mobile.loading('hide'); - $('div[data-role="content"]').unwrap();*/ - return oldDefaultTransitionHandler(name, reverse, $to, $from); + var initMain = function () { + if (document.location.protocol == "file:") { + if (typeof (window.deviceAndJqmLoaded) == "undefined") { + window.deviceAndJqmLoaded = $.Deferred(); + } + window.deviceAndJqmLoaded.done(function () { + preStart(); + }); + } else { + $(document).ready(function () { + translator = new Translator(); + preStart(); }); } - return oldDefaultTransitionHandler(name, reverse, $to, $from); }; -} -function initPageLoadHandler() { - //pageLoadHandler for discover - $(document).on('pagebeforeshow', '#discover', pagebeforeshowDiscover); + function preStart() { + translator.translationLoaded.done(function () { + translator.translate(); + + sessionHandler = new SessionHandler(); + imageLoader = new ImageLoader(); + externalServices = new ExternalServices(); + pageHandler = new PageHandler(); + playerComunication = new PlayerComunication(); + - //pageLoadHandler for displayProfile - $(document).on('pagebeforeshow', '#displayProfile', function () { - if (profileIdRequest >= 0) { - var promise = request({ - url: "getProfile?profileId=" + profileIdRequest - }).done(function (result) { - handleDisplayProfileData(result); - - $('#playerSaveButton').click(function () { - var dataToUpload = {}; - - dataToUpload["ProfileId"] = profileIdRequest; - dataToUpload["PlayerName"] = $('#playerName').prop("value"); - dataToUpload["Type"] = $('#playerType').prop("value"); - dataToUpload["Difficulty"] = $('#playerDifficulty').prop("value"); - dataToUpload["Avatar"] = $('#playerAvatar').data("changed") ? { "base64Data": $('#playerAvatar').prop("src") } : null; - - var pass = $('#playerPassword').prop("value"); - if (pass != "***__oldPassword__***") { - if (pass == "") { - dataToUpload["Password"] = "***__CLEAR_PASSWORD__***"; - } else { - dataToUpload["Password"] = pass; - } - } else { - dataToUpload["Password"] = null; - } - - request({ - url: "sendProfile", - contentType: "application/json;charset=utf-8", - type: "POST", - data: JSON.stringify(dataToUpload), - }, "Uploading profile...").done(function () { - history.back(); - }); - - }); - }); - - // Save promise on page so the transition handler can find it. - $(this).data('promise', promise); - } - else { - //new profile - handleDisplayProfileData({ - "Avatar": { "base64Data": null }, - "Difficulty": 0, - "IsEditable": true, - "PlayerName": i18n.t("YourName") || "YourName", - "ProfileId": -1, - "Type": 1 - }); - $('#playerType').prop("value", 0); - $('#playerDifficulty').prop("value", 0); - - $('#playerSaveButton').click(function () { - var dataToUpload = {}; - - dataToUpload["ProfileId"] = -1; - dataToUpload["PlayerName"] = $('#playerName').prop("value"); - dataToUpload["Type"] = $('#playerType').prop("value"); - dataToUpload["Difficulty"] = $('#playerDifficulty').prop("value"); - dataToUpload["Avatar"] = $('#playerAvatar').data("changed") ? { "base64Data": $('#playerAvatar').prop("src") } : null; - - var pass = $('#playerPassword').prop("value"); - if (pass != "***__oldPassword__***") { - if (pass == "") { - dataToUpload["Password"] = "***__CLEAR_PASSWORD__***"; - } else { - dataToUpload["Password"] = pass; - } - } else { - dataToUpload["Password"] = null; - } - - request({ - url: "sendProfile", - contentType: "application/json;charset=utf-8", - type: "POST", - data: JSON.stringify(dataToUpload) - }, 'Creating profile...').done(function () { - $.mobile.changePage("#login", { transition: "slidefade" }); - }); - - }); - } - }); - - function handleDisplayProfileData(data) { - $('#playerName').prop("value", data.PlayerName); - - addImage($('#playerAvatar')[0], data.Avatar, "img/profile.png"); - - $('#playerAvatar').data("changed", false); - $('#playerType').prop("selectedIndex", data.Type).selectmenu("refresh"); - $('#playerDifficulty').prop("selectedIndex", data.Difficulty).selectmenu("refresh"); - if (data.IsEditable) { - $('#playerName').prop('disabled', false); - $('#playerType').prop('disabled', false); - $('#playerDifficulty').prop('disabled', false); - $('#playerSaveButton').show().unbind("click"); - $('#playerAvatar').unbind("click"); - $('#playerPassword').prop('disabled', false).prop("value", "***__oldPassword__***").parent().show(); - $('#playerPasswordLabel').show(); - - $('#playerAvatar').click(function () { - if ($('#captureContainer').length > 0) { - $('#captureContainer').remove(); - } - - if (document.location.protocol == "file:" - && typeof (navigator) != 'undefined' - && typeof (navigator.camera) != 'undefined' - && typeof (navigator.camera.getPicture) != 'undefined') { - navigator.camera.getPicture(function (imageData) { - $('#playerAvatar').prop("src", "data:image/jpeg;base64," + imageData); - $('#playerAvatar').data("changed", true); - }, function () { - //Fail - do nothing - }, { - destinationType: navigator.camera.DestinationType.DATA_URL, - allowEdit: true, - correctOrientation: true, - saveToPhotoAlbum: true, - quality: 50 - }); - - } else { - $(document.body).append('
'); - - $('#capture').change(function (eventData) { - if (eventData && eventData.target && eventData.target.files && eventData.target.files.length == 1) { - var file = eventData.target.files[0]; - var reader = new FileReader(); - reader.onloadend = function (e) { - $('#playerAvatar').prop("src", e.target.result); - $('#playerAvatar').data("changed", true); - $('#captureContainer').remove(); - }; - reader.readAsDataURL(file); - } - }); - - $('#capture').click(); - } - }); - } - else { - $('#playerName').prop('disabled', true); - $('#playerType').prop('disabled', true); - $('#playerDifficulty').prop('disabled', true); - $('#playerSaveButton').hide().unbind("click"); - $('#playerAvatar').unbind("click"); - $('#playerPassword').prop('disabled', true).parent().hide(); - $('#playerPasswordLabel').hide(); - } + pageHandler.init(); + }); + translator.initTranslation(); } - //pageLoadHandler for selectProfile - $(document).on('pagebeforeshow', '#selectProfile', function () { - var promise = request({ - url: "getProfileList" - }).done(function (data) { - $('#selectProfileList').children().remove(); + function request(data, message) { + if ((typeof message) == "undefined" || message == null) { + message = "Loading..."; + } - function handleProfileSelectLineClick(e) { - profileIdRequest = parseInt(e.currentTarget.id.replace("ProfileSelectLine_", "")); - $.mobile.changePage("#displayProfile", { transition: "slidefade" }); + if ((typeof data.timeout) == "undefined") { + data.timeout = 10000; //10 sec. timeout + } + + if (message != "noOverlay") { + var message2 = message; + if (i18n.t) { + message2 = i18n.t(message2); } + $('div[data-role="content"]').wrap('
'); + $.mobile.loading('show', { + text: message2, + textVisible: true + }); + } - for (var profile in data) { - var img = $('
  • ' + data[profile].PlayerName + '

    Click here to show the profile of ' + data[profile].PlayerName + '

  • ') - .appendTo('#selectProfileList') - .click(handleProfileSelectLineClick) - .find("img")[0]; + if (!data["headers"]) { + data["headers"] = {}; + } - addImage(img, data[profile].Avatar, "img/profile.png"); + if (message == "external") { + message = "Loading (external)..."; + if (i18n.t) { + message = i18n.t(message) || message; } + } else { + data["headers"]["session"] = sessionHandler.sessionId; + data.url = sessionHandler.serverBaseAddress + data.url; + } - $('#selectProfileList').listview('refresh'); + return $.ajax(data).always(function (result) { + if (message != "noOverlay") { + $.mobile.loading('hide'); + $('div[data-role="content"]').unwrap(); + } + }).fail(function (result) { + if (result.statusText.indexOf("No session") != -1) { + sessionHandler.logout(); + return; + } + if (message != "noOverlay") { + var msg = result.statusText.length <= 20 ? result.statusText : "Error..."; + if (msg == "error" && result.readyState == 0) { + msg = "No connection"; + } + showError(msg); + } }); + } - // Save promise on page so the transition handler can find it. - $(this).data('promise', promise); - }); + function showError(message) { + if (!message) { + message = "Error..."; + } - //pageLoadHandler for displaySong - $(document).on('pagebeforeshow', '#displaySong', function () { - var promise = request({ - url: "getSong?songId=" + songIdRequest - }).done(function (result) { - $('#displaySongAddPlaylist').hide(); + if (i18n.t) { + message = i18n.t(message) || message; + } - if (result.Title != null) { - $('#displaySongTitle').text(result.Title); - } - else { - $('#displaySongTitle').text("No current song"); - } + $('div[data-role="content"]').wrap('
    '); + $.mobile.loading('show', { + text: message, + textVisible: true + }); + $('.ui-loader').find('span').removeClass('ui-icon-loading').addClass('ui-custom-errorIcon'); - addImage($('#displaySongCover')[0], result.Cover, "img/noCover.png"); + setTimeout(function () { + $.mobile.loading('hide'); + $('div[data-role="content"]').unwrap(); + $('.ui-loader').find('span').removeClass('ui-custom-errorIcon').addClass('ui-icon-loading'); + }, 1000); + } - if (result.Artist != null) { - $('#displaySongArtist').text(result.Artist); - } - else { - $('#displaySongArtist').text("-"); - } + function ImageLoader() { + var cachedImages = {}; - if (result.Genre != null) { - $('#displaySongGenre').text(result.Genre); - } - else { - $('#displaySongGenre').text("-"); - } + this.delayedImageLoad = function (elem, id, fail) { + if (elem && id) { + if (cachedImages[id]) { + elem.src = cachedImages[id].base64Data; + return; + } - if (result.Year != null && result.Year != "") { - $('#displaySongYear').text(result.Year); - } - else { - $('#displaySongYear').text("-"); - } - - if (result.Language != null) { - $('#displaySongLanguage').text(result.Language); - } - else { - $('#displaySongLanguage').text("-"); - } - - $('#displaySongIsDuet').text(result.IsDuet ? "Yes" : "No"); - - if (result.Title != null || result.Artist != null) { - $('#displaySongLinks').show(); - - $('#displaySongAddPlaylist').unbind('click').click(function () { - customSelectPlaylistSongCallback = function (playlistId) { - request({ url: "addSongToPlaylist?songId=" + result.SongId + "&playlistId=" + playlistId + "&duplicates=false" }, "Add to playlist..."); - history.back(); - }; - $.mobile.changePage("#selectPlaylist", { transition: "slidefade" }); + elem.src = ""; + $(elem).addClass("imageLoaderImg"); + request({ + url: "delayedImage?id=" + id + }).done(function (result) { + $(elem).removeClass("imageLoaderImg"); + elem.src = result.base64Data; + cachedImages[id] = result; + }).fail(function () { + $(elem).removeClass("imageLoaderImg"); + if (fail) { + elem.src = fail; + } }); + } + }; - $('#displaySongLinkYoutube').unbind('click').click(function () { - showYoutube(result.Artist, result.Title); - }); - - $('#displaySongLinkSpotify').unbind('click').click(function () { - showSpotify(result.Artist, result.Title); - }); - - $('#displaySongLinkWikipedia').unbind('click').click(function () { - showWikipedia(result.Artist); - }); + this.addImage = function (img, base64Image, defaultImg) { + if (base64Image && (base64Image.base64Data || base64Image.imageId)) { + if (base64Image.base64Data) { + $(img).prop("src", base64Image.base64Data); + } else { + imageLoader.delayedImageLoad(img, base64Image.imageId, defaultImg); + } } else { - $('#displaySongLinks').hide(); + $(img).prop("src", defaultImg); + } + }; + } + + function PlayerComunication() { + var playerComunicationToServer = []; + var playerComunicationFromServerHandler = {}; + var defaultHeartbeatIntervall = 5000; + var heartbeatIntervalls = []; + var heartbeatIntervallId; + + var init = function () { + startHeartbeat(); + }; + + var checkPlayerMessages = function () { + if (sessionHandler.ownProfileId == -1 + && pageHandler.profileIdRequest == -1 + && ($.mobile.activePage.attr("id") == "displayProfile" + || $.mobile.activePage.attr("id") == "login" + || $.mobile.activePage.attr("id") == "discover")) { + return; } request({ - url: "hasUserRight?right=" + 32 - }).done(function (result2) { - if (result2) { - $('#displaySongAddPlaylist').show(); - } else { - $('#displaySongAddPlaylist').hide(); + url: "playerComunication", + type: "POST", + dataType: "json", + contentType: "application/json", + data: JSON.stringify(playerComunicationToServer) + }, "noOverlay").done(function (result) { + if (result.length > 0) { + handlePlayerComunicationFromServer(result); + } + }).fail(function (result) { + if (result.status == 403 || result.status == 0) { + sessionHandler.logout(); } }); - }); - // Save promise on page so the transition handler can find it. - $(this).data('promise', promise); - }); - - //pageLoadHandler for selectSong - $(document).on('pagebeforeshow', '#selectSong', function () { - function handleGetAllSongs() { - $('#selectSongList').children().remove(); - - function handleSelectSongLineClick(e) { - songIdRequest = parseInt(e.currentTarget.id.replace("selectSongLine_", "")); - $.mobile.changePage("#displaySong", { transition: "slidefade" }); + if (playerComunicationToServer.length > 0) { + setTimeout(checkPlayerMessages, 50); } - for (var id in allSongsCache) { - $('
  • '/*+' '*/ + '

    ' + allSongsCache[id].Artist + '

    ' + allSongsCache[id].Title + '

  • ') - .appendTo('#selectSongList') - .click(handleSelectSongLineClick); + playerComunicationToServer = []; + }; + + var handlePlayerComunicationFromServer = function (items) { + for (var i = 0; i < items.length; i++) { + if (items[i].ProfileId == sessionHandler.ownProfileId && playerComunicationFromServerHandler[items[i].Type]) { + if (new Date() - new Date(parseInt("\/Date(1234656000000)\/".match(/[0-9]+/)[0])) <= 0) { + var deserializedData = JSON.parse(items[i].Data); + for (var j = 0; j < playerComunicationFromServerHandler[items[i].Type]; j++) { + playerComunicationFromServerHandler[items[i].Type][j](deserializedData); + } + } + } + } + }; + + var startHeartbeat = function () { + var interv = defaultHeartbeatIntervall; + for (var i = 0; i < heartbeatIntervalls.length; i++) { + if (interv > heartbeatIntervalls[i] && heartbeatIntervalls[i] >= 50) { + interv = heartbeatIntervalls[i]; + } } - $('#selectSongList').listview('refresh'); - } + if (interv == defaultHeartbeatIntervall && heartbeatIntervalls.length != 0) { + heartbeatIntervalls = []; + } - if (allSongsCache == null) { - var promise = request({ - url: "getAllSongs" - }).done(function (data) { - allSongsCache = data; - handleGetAllSongs(); + clearInterval(heartbeatIntervallId); + heartbeatIntervallId = setInterval(checkPlayerMessages, interv); + }; + + var sendPlayerComunicationToServer = function (packet) { + playerComunicationToServer.push(packet); + }; + + this.registerPlayerComunicationFromServerHandler = function (type, handler) { + if (!playerComunicationFromServerHandler[type]) { + playerComunicationFromServerHandler[type] = []; + } + playerComunicationFromServerHandler[type].push(handler); + }; + + this.sendDataToServer = function (data, type) { + sendPlayerComunicationToServer({ + "ProfileId": sessionHandler.ownProfileId, + "ValidTill": "\/Date(" + (((new Date())).getTime() + 60000) + ")\/", + "Type": type, + "Data": JSON.stringify(data) + }); + }; + + //mim 50ms + this.requestIntervall = function (newIntervall) { + heartbeatIntervalls.push(newIntervall); + }; + + this.removeIntervall = function (oldIntervall) { + var index = heartbeatIntervalls.indexOf(oldIntervall); + if (index > -1) { + heartbeatIntervalls.splice(oldIntervall, 1); + } + }; + + this.reset = function () { + playerComunicationToServer = []; + playerComunicationFromServerHandler = {}; + heartbeatIntervalls = []; + }; + + this.EPlayerComunicationType = { + "RegisterSubscription": 0, + "UnregisterSubscription": 1 + }; + + init(); + } + + function ExternalServices() { + var popupVideoHeight = 390; + var popupVideoWidth = 640; + + var init = function () { + initVideoPopup(); + }; + + var initVideoPopup = function () { + + function scale(width, height, padding, border) { + var scrWidth = $(window).width() - 30, + scrHeight = $(window).height() - 30, + ifrPadding = 2 * padding, + ifrBorder = 2 * border, + ifrWidth = width + ifrPadding + ifrBorder, + ifrHeight = height + ifrPadding + ifrBorder, + h, w; + + if (ifrWidth < scrWidth && ifrHeight < scrHeight) { + w = ifrWidth; + h = ifrHeight; + } else if ((ifrWidth / scrWidth) > (ifrHeight / scrHeight)) { + w = scrWidth; + h = (scrWidth / ifrWidth) * ifrHeight; + } else { + h = scrHeight; + w = (scrHeight / ifrHeight) * ifrWidth; + } + + return { + 'width': w - (ifrPadding + ifrBorder), + 'height': h - (ifrPadding + ifrBorder) + }; + } + + ; + $("#popupVideo").find("a").click(function () { + $("#popupVideo").popup("close"); + $("#popupVideo").popup("close"); //Sometimes twice?? }); - // Save promise on page so the transition handler can find it. - $(this).data('promise', promise); - } - else { - handleGetAllSongs(); - } - }); + $("#popupVideo iframe") + .attr("width", 0) + .attr("height", 0); - //pageLoadHandler for selectUserAdmin - $(document).on('pagebeforeshow', '#selectUserAdmin', function () { - var promise = request({ - url: "getProfileList" - }).done(function (data) { - $('#selectUserAdminList').children().remove(); + $("#popupVideo").on({ + popupbeforeposition: function () { + var size = scale(popupVideoWidth, popupVideoHeight, 15, 1), + w = size.width, + h = size.height; - function handleSelectUserAdminLineClick(e) { - profileIdRequest = parseInt(e.currentTarget.id.replace("SelectUserAdminLine_", "")); - $.mobile.changePage("#displayUserAdmin", { transition: "slidefade" }); - } + $("#popupVideo iframe") + .attr("width", w) + .attr("height", h); + }, + popupafterclose: function () { + $("#popupVideo iframe") + .attr("width", 0) + .attr("height", 0) + .attr("src", ""); + } + }); + }; - for (var profile in data) { - $('
  • ' + data[profile].PlayerName + '

    Click here to edit roles for ' + data[profile].PlayerName + '

  • ') - .appendTo('#selectUserAdminList') - .click(handleSelectUserAdminLineClick); - } + this.showYoutube = function (artist, title) { + request({ + url: "http://gdata.youtube.com/feeds/api/videos/-/Music?max-results=1&alt=json&format=5&q=" + artist + " " + title, + dataType: "json", + }, "external") + .done(function (result) { + if (result && result.feed && result.feed.entry && result.feed.entry.length > 0) { + var vidId = result.feed.entry[0].id.$t.replace("http://gdata.youtube.com/feeds/api/videos/", ""); + popupVideoHeight = 390; + popupVideoWidth = 640; - $('#selectUserAdminList').listview('refresh'); - }); + $("#popupVideo iframe").attr("src", "http://www.youtube.com/embed/" + vidId + "?&autoplay=1&rel=0&showinfo=0&disablekb=1&autohide=1"); + $("#popupVideo").popup("open"); + } + }); + }; - // Save promise on page so the transition handler can find it. - $(this).data('promise', promise); - }); + this.showSpotify = function (artist, title) { + request({ + url: "http://ws.spotify.com/search/1/track.json?q=" + title + "+artist:" + artist, + dataType: "json", + }, "external") + .done(function (result) { + if (result && result.tracks && result.tracks.length > 0) { + var spotId = result.tracks[0].href; + popupVideoHeight = 80; + popupVideoWidth = 300; - //pageLoadHandler for displayUserAdmin - $(document).on('pagebeforeshow', '#displayUserAdmin', function () { - var promise = request({ - url: "getUserRole?profileId=" + profileIdRequest - }).done(function (result) { - var userRoles = { - TR_USERROLE_ADMIN: 2, - TR_USERROLE_KEYBOARDUSER: 4, - TR_USERROLE_ADDSONGSUSER: 8, - TR_USERROLE_PLAYLISTEDITOR: 16, - TR_USERROLE_PROFILEEDITOR: 32 + $("#popupVideo iframe").attr("src", "https://embed.spotify.com/?uri=" + spotId); + $("#popupVideo").popup("open"); + } + }); + }; + + this.showWikipedia = function (artist) { + popupVideoHeight = 800; + popupVideoWidth = 600; + + $("#popupVideo iframe").attr("src", "http://m.wikipedia.org/wiki/Special:Search/" + artist); + $("#popupVideo").popup("open"); + }; + + init(); + } + + function Translator() { + this.translationLoaded = $.Deferred(); + var translationLoaded = this.translationLoaded; + + this.initTranslation = function () { + $.i18n.init({ + resGetPath: 'locales/__lng__.json', + supportedLngs: ['en', 'de', 'fr', 'sv', 'cs'], + fallbackLng: 'en', + keyseparator: '::', + nsseparator: ':::' + }).done(function () { + translationLoaded.resolve(); + }); + }; + + this.translate = function () { + //repair broken buttons on the first page (get broken while translating) + var repairButtons = function () { + $($('#discoverConnect')[0].childNodes).wrap(' '); + $($('#discoverReadQr')[0].childNodes).wrap(' '); + }; + $('body').i18n(); + repairButtons(); + }; + } + + function PageHandler() { + var loginPageHandler; + var discoverPageHandler; + var mainPageHandler; + var keyboardPageHandler; + var userPageHandler; + var songPageHandler; + var playlistPageHandler; + + this.customSelectPlaylistSongCallback = null; + this.profileIdRequest = -1; + this.songIdRequest = -1; + + this.init = function () { + replaceTransitionHandler(); + loginPageHandler = new LoginPageHandler(); + discoverPageHandler = new DiscoverPageHandler(); + mainPageHandler = new MainPageHandler(); + keyboardPageHandler = new KeyboardPageHandler(); + userPageHandler = new UserPageHandler(); + songPageHandler = new SongPageHandler(); + playlistPageHandler = new PlaylistPageHandler(); + }; + + this.reset = function () { + this.customSelectPlaylistSongCallback = null; + this.profileIdRequest = -1; + this.songIdRequest = -1; + }; + + var replaceTransitionHandler = function () { + //Thx to http://stackoverflow.com/a/14096311 + var oldDefaultTransitionHandler = $.mobile.defaultTransitionHandler; + + $.mobile.defaultTransitionHandler = function (name, reverse, $to, $from) { + var promise = $to.data('promise'); + if (promise) { + $to.removeData('promise'); + /*$('div[data-role="content"]').wrap('
    '); + $.mobile.loading('show', { + text: 'Loading data...', + textVisible: true + });*/ + return promise.then(function () { + /*$.mobile.loading('hide'); + $('div[data-role="content"]').unwrap();*/ + return oldDefaultTransitionHandler(name, reverse, $to, $from); + }); + } + return oldDefaultTransitionHandler(name, reverse, $to, $from); + }; + }; + + var DiscoverPageHandler = function () { + var init = function () { + //pageLoadHandler for discover + $(document).on('pagebeforeshow', '#discover', pagebeforeshowDiscover); + + initDiscoverPageHandler(); }; - for (var roleName in userRoles) { - $('#' + roleName).prop("checked", ((result & userRoles[roleName]) != 0)).checkboxradio("refresh"); - } - - - $('#btnRoleSave').unbind('click').click(function () { - var role = 0; - - for (var roleName2 in userRoles) { - if ($('#' + roleName2).prop("checked")) { - role = (role | userRoles[roleName2]); + var initDiscoverPageHandler = function () { + var keyPressed = function (e) { + if (e.which == 13) { + $('#discoverConnect').click(); } + }; + + $('#discoverServerAddress').keypress(keyPressed); + + function handleAddress(address) { + if (address != null && address != "") { + if (address.indexOf("http") != 0) { + address = "http://" + address; + } + if (address.slice(-1) != '/') { + address = address + '/'; + } + sessionHandler.serverBaseAddress = ""; + request({ + url: address + "isServerOnline", + timeout: 10000 + }, "Checking...") + .done(function () { + sessionHandler.serverBaseAddress = address; + window.localStorage.setItem("VocaluxeServerAddress", address); + $.mobile.changePage("#login", { transition: "slidefade" }); + }) + .fail(function () { + $('#discoverServerAddress').prop("value", ""); + if (document.location.protocol == "file:" + && typeof window.BarcodeScanner != "undefined") { + $('#discoverReadQr').show(); + } + }); + } + } + + $('#discoverConnect').click(function () { + handleAddress($('#discoverServerAddress').prop("value")); + }); + + try { + window.BarcodeScanner = cordova.require("cordova/plugin/BarcodeScanner"); + } catch (e) { + } + + $('#discoverReadQr').hide().click(function () { + window.BarcodeScanner.scan( + function (result) { + handleAddress(result.text); + }, + function () { + showError("Scan faild"); + } + ); + }); + + //Fire pageLoadHandler for discover (first page shown after start) + setTimeout(function () { + pagebeforeshowDiscover(); + $(this).removeData('promise'); + }, 1); + }; + + var pagebeforeshowDiscover = function () { + if (document.location.protocol == "file:") { + if (window.localStorage) { + var address = window.localStorage.getItem("VocaluxeServerAddress"); + if (address != null) { + sessionHandler.serverBaseAddress = ""; + var prom = request({ + url: address + "isServerOnline", + timeout: 10000 + }, "Checking...").done(function () { + sessionHandler.serverBaseAddress = address; + window.localStorage.setItem("VocaluxeServerAddress", address); + $.mobile.changePage("#login", { transition: "none" }); + }).fail(function () { + if (typeof window.BarcodeScanner != "undefined") { + $('#discoverReadQr').show(); + } + }); + $(this).data('promise', prom); + return; + } + if (typeof window.BarcodeScanner != "undefined") { + $('#discoverReadQr').show(); + } + } + } else { + $('#discoverReadQr').hide(); + $.mobile.changePage("#login", { transition: "none" }); + } + }; + + init(); + }; + + var LoginPageHandler = function () { + var init = function () { + //pageLoadHandler for login + $(document).on('pagebeforeshow', '#login', pagebeforeshowLogin); + + initLoginPageHandler(); + }; + + var pagebeforeshowLogin = function () { + if (window.localStorage) { + var value = window.localStorage.getItem("VocaluxeSessionKey"); + if (value != null && value != "") { + sessionHandler.sessionId = value; + } + } + + if (sessionHandler.sessionId != "") { + if (sessionHandler.ownProfileId != -1) { + $.mobile.changePage("#main", { transition: "slidefade" }); + } else { + request({ + url: "getOwnProfileId", + headers: { "session": sessionHandler.sessionId } + }, 'Login...').done(function (result) { + sessionHandler.ownProfileId = result; + $.mobile.changePage("#main", { transition: "slidefade" }); + }); + } + } + }; + + var initLoginPageHandler = function () { + var keyPressed = function (e) { + if (e.which == 13) { + $('#loginButton').click(); + } + }; + + $('#loginName').keypress(keyPressed); + $('#loginPassword').keypress(keyPressed); + + $('#loginButton').click(function () { + var username = $('#loginName').prop("value"); + var password = $('#loginPassword').prop("value"); + + request({ + url: "login?username=" + username + "&password=" + password + }).done(function (result) { + sessionHandler.sessionId = result; + if (window.localStorage) { + window.localStorage.setItem("VocaluxeSessionKey", sessionHandler.sessionId); + } + request({ + url: "getOwnProfileId", + headers: { "session": sessionHandler.sessionId } + }, 'Login...').done(function (result2) { + sessionHandler.ownProfileId = result2; + $.mobile.changePage("#main", { transition: "slidefade" }); + }); + }); + }); + + $('#registerButton').click(function () { + sessionHandler.ownProfileId = -1; + pageHandler.profileIdRequest = -1; + $.mobile.changePage("#displayProfile", { transition: "slidefade" }); + }); + }; + + init(); + }; + + var MainPageHandler = function () { + var init = function () { + //pageLoadHandler for main + $(document).on('pagebeforeshow', '#main', pagebeforeshowMain); + + initMainPageHandler(); + }; + + var pagebeforeshowMain = function () { + request({ + url: "hasUserRight?right=" + 2 + }).done(function (result) { + if (result) { + $('#mainPageTakePhotoLink').parent().parent().parent().show(); + } else { + $('#mainPageTakePhotoLink').parent().parent().parent().hide(); + } + }); + + request({ + url: "hasUserRight?right=" + 8 + }).done(function (result) { + if (result) { + $('#mainPageKeyboard').parent().parent().parent().show(); + } else { + $('#mainPageKeyboard').parent().parent().parent().hide(); + } + }); + + request({ + url: "hasUserRight?right=" + 4 + }).done(function (result) { + if (result) { + $('#mainPageSelectProfile').parent().parent().parent().show(); + } else { + $('#mainPageSelectProfile').parent().parent().parent().hide(); + } + }); + }; + + var initMainPageHandler = function () { + $('#yourProfileLink').click(function () { + pageHandler.profileIdRequest = sessionHandler.ownProfileId; + $.mobile.changePage("#displayProfile", { transition: "slidefade" }); + }); + + $('#currentSongLink').click(function () { + request({ + url: "getCurrentSongId", + headers: { "session": sessionHandler.sessionId } + }, 'Getting current song...').done(function (result) { + pageHandler.songIdRequest = parseInt(result); + $.mobile.changePage("#displaySong", { transition: "slidefade" }); + }); + }); + + function uploadImg(imgData) { + request({ + url: "sendPhoto", + contentType: "application/json;charset=utf-8", + type: "POST", + data: JSON.stringify({ Photo: { base64Data: imgData } }) + }, 'Uploading photo...'); + } + + $('#mainPageTakePhotoLink').click(function () { + if ($('#captureContainer').length > 0) { + $('#captureContainer').remove(); + } + + if (document.location.protocol == "file:" + && typeof (navigator) != 'undefined' + && typeof (navigator.camera) != 'undefined' + && typeof (navigator.camera.getPicture) != 'undefined') { + navigator.camera.getPicture(function (imageData) { + uploadImg("data:image/jpeg;base64," + imageData); + }, function () { + //Fail - do nothing + }, { + destinationType: navigator.camera.DestinationType.DATA_URL, + allowEdit: true, + correctOrientation: true, + saveToPhotoAlbum: true, + quality: 100 + }); + + } else { + $(document.body).append('
    '); + + $('#capture').change(function (eventData) { + if (eventData && eventData.target && eventData.target.files && eventData.target.files.length == 1) { + var file = eventData.target.files[0]; + var reader = new FileReader(); + + reader.onloadend = function (e) { + uploadImg(e.target.result); + $('#capture').remove(); + }; + + reader.readAsDataURL(file); + } + }); + + $('#capture').click(); + } + }); + + $('#mainPageLogoutLink').click(function () { + sessionHandler.logout(); + }); + }; + + init(); + }; + + var KeyboardPageHandler = function () { + var init = function () { + + initKeyboardPageHandler(); + }; + + var initKeyboardPageHandler = function () { + $('#keyboardButtonUp').click(function () { + request({ + url: "sendKeyEvent?key=up" + }); + }); + + $('#keyboardButtonDown').click(function () { + request({ + url: "sendKeyEvent?key=down" + }); + }); + + $('#keyboardButtonLeft').click(function () { + request({ + url: "sendKeyEvent?key=left" + }); + }); + + $('#keyboardButtonRight').click(function () { + request({ + url: "sendKeyEvent?key=right" + }); + }); + + $('#keyboardButtonEscape').click(function () { + request({ + url: "sendKeyEvent?key=escape" + }); + }); + + $('#keyboardButtonTab').click(function () { + request({ + url: "sendKeyEvent?key=tab" + }); + }); + + $('#keyboardButtonReturn').click(function () { + request({ + url: "sendKeyEvent?key=return" + }); + }); + + $('#keyboardButtonP').click(function () { + request({ + url: "sendKeyEvent?key=p" + }); + }); + + $('#keyboardButtonKeys').keyup(function (e) { + var c = String.fromCharCode(e.keyCode); + if (c.match(/\w/)) { + c = e.keyCode >= 65 ? c.toLowerCase() : c; + request({ + url: "sendKeyEvent?key=" + c + }); + } + var oldText = $('#keyboardButtonKeys')[0].value; + if (oldText.length > 0) { + $('#keyboardButtonKeys')[0].value = oldText.slice(1); + } + }); + }; + + init(); + }; + + var UserPageHandler = function () { + var init = function () { + //pageLoadHandler for displayProfile + $(document).on('pagebeforeshow', '#displayProfile', pagebeforeshowDisplayProfile); + + //pageLoadHandler for selectProfile + $(document).on('pagebeforeshow', '#selectProfile', pagebeforeshowSelectProfile); + + //pageLoadHandler for selectUserAdmin + $(document).on('pagebeforeshow', '#selectUserAdmin', pagebeforeshowSelectUserAdmin); + + //pageLoadHandler for displayUserAdmin + $(document).on('pagebeforeshow', '#displayUserAdmin', pagebeforeshowDisplayUserAdmin); + }; + + var pagebeforeshowDisplayProfile = function () { + if (pageHandler.profileIdRequest >= 0) { + var promise = request({ + url: "getProfile?profileId=" + pageHandler.profileIdRequest + }).done(function (result) { + handleDisplayProfileData(result); + + $('#playerSaveButton').click(function () { + var dataToUpload = {}; + + dataToUpload["ProfileId"] = pageHandler.profileIdRequest; + dataToUpload["PlayerName"] = $('#playerName').prop("value"); + dataToUpload["Type"] = $('#playerType').prop("value"); + dataToUpload["Difficulty"] = $('#playerDifficulty').prop("value"); + dataToUpload["Avatar"] = $('#playerAvatar').data("changed") ? { "base64Data": $('#playerAvatar').prop("src") } : null; + + var pass = $('#playerPassword').prop("value"); + if (pass != "***__oldPassword__***") { + if (pass == "") { + dataToUpload["Password"] = "***__CLEAR_PASSWORD__***"; + } else { + dataToUpload["Password"] = pass; + } + } else { + dataToUpload["Password"] = null; + } + + request({ + url: "sendProfile", + contentType: "application/json;charset=utf-8", + type: "POST", + data: JSON.stringify(dataToUpload), + }, "Uploading profile...").done(function () { + history.back(); + }); + + }); + }); + + // Save promise on page so the transition handler can find it. + $(this).data('promise', promise); + } else { + //new profile + handleDisplayProfileData({ + "Avatar": { "base64Data": null }, + "Difficulty": 0, + "IsEditable": true, + "PlayerName": i18n.t("YourName") || "YourName", + "ProfileId": -1, + "Type": 1 + }); + $('#playerType').prop("value", 0); + $('#playerDifficulty').prop("value", 0); + + $('#playerSaveButton').click(function () { + var dataToUpload = {}; + + dataToUpload["ProfileId"] = -1; + dataToUpload["PlayerName"] = $('#playerName').prop("value"); + dataToUpload["Type"] = $('#playerType').prop("value"); + dataToUpload["Difficulty"] = $('#playerDifficulty').prop("value"); + dataToUpload["Avatar"] = $('#playerAvatar').data("changed") ? { "base64Data": $('#playerAvatar').prop("src") } : null; + + var pass = $('#playerPassword').prop("value"); + if (pass != "***__oldPassword__***") { + if (pass == "") { + dataToUpload["Password"] = "***__CLEAR_PASSWORD__***"; + } else { + dataToUpload["Password"] = pass; + } + } else { + dataToUpload["Password"] = null; + } + + request({ + url: "sendProfile", + contentType: "application/json;charset=utf-8", + type: "POST", + data: JSON.stringify(dataToUpload) + }, 'Creating profile...').done(function () { + $.mobile.changePage("#login", { transition: "slidefade" }); + }); + + }); + } + }; + + var handleDisplayProfileData = function(data) { + $('#playerName').prop("value", data.PlayerName); + + imageLoader.addImage($('#playerAvatar')[0], data.Avatar, "img/profile.png"); + + $('#playerAvatar').data("changed", false); + $('#playerType').prop("selectedIndex", data.Type).selectmenu("refresh"); + $('#playerDifficulty').prop("selectedIndex", data.Difficulty).selectmenu("refresh"); + if (data.IsEditable) { + $('#playerName').prop('disabled', false); + $('#playerType').prop('disabled', false); + $('#playerDifficulty').prop('disabled', false); + $('#playerSaveButton').show().unbind("click"); + $('#playerAvatar').unbind("click"); + $('#playerPassword').prop('disabled', false).prop("value", "***__oldPassword__***").parent().show(); + $('#playerPasswordLabel').show(); + + $('#playerAvatar').click(function() { + if ($('#captureContainer').length > 0) { + $('#captureContainer').remove(); + } + + if (document.location.protocol == "file:" + && typeof(navigator) != 'undefined' + && typeof(navigator.camera) != 'undefined' + && typeof(navigator.camera.getPicture) != 'undefined') { + navigator.camera.getPicture(function(imageData) { + $('#playerAvatar').prop("src", "data:image/jpeg;base64," + imageData); + $('#playerAvatar').data("changed", true); + }, function() { + //Fail - do nothing + }, { + destinationType: navigator.camera.DestinationType.DATA_URL, + allowEdit: true, + correctOrientation: true, + saveToPhotoAlbum: true, + quality: 50 + }); + + } else { + $(document.body).append('
    '); + + $('#capture').change(function(eventData) { + if (eventData && eventData.target && eventData.target.files && eventData.target.files.length == 1) { + var file = eventData.target.files[0]; + var reader = new FileReader(); + reader.onloadend = function(e) { + $('#playerAvatar').prop("src", e.target.result); + $('#playerAvatar').data("changed", true); + $('#captureContainer').remove(); + }; + reader.readAsDataURL(file); + } + }); + + $('#capture').click(); + } + }); + } else { + $('#playerName').prop('disabled', true); + $('#playerType').prop('disabled', true); + $('#playerDifficulty').prop('disabled', true); + $('#playerSaveButton').hide().unbind("click"); + $('#playerAvatar').unbind("click"); + $('#playerPassword').prop('disabled', true).parent().hide(); + $('#playerPasswordLabel').hide(); + } + }; + + var pagebeforeshowSelectProfile = function () { + var promise = request({ + url: "getProfileList" + }).done(function (data) { + $('#selectProfileList').children().remove(); + + function handleProfileSelectLineClick(e) { + pageHandler.profileIdRequest = parseInt(e.currentTarget.id.replace("ProfileSelectLine_", "")); + $.mobile.changePage("#displayProfile", { transition: "slidefade" }); + } + + for (var profile in data) { + var img = $('
  • ' + data[profile].PlayerName + '

    Click here to show the profile of ' + data[profile].PlayerName + '

  • ') + .appendTo('#selectProfileList') + .click(handleProfileSelectLineClick) + .find("img")[0]; + + imageLoader.addImage(img, data[profile].Avatar, "img/profile.png"); + } + + $('#selectProfileList').listview('refresh'); + }); + + // Save promise on page so the transition handler can find it. + $(this).data('promise', promise); + }; + + var pagebeforeshowSelectUserAdmin = function () { + var promise = request({ + url: "getProfileList" + }).done(function (data) { + $('#selectUserAdminList').children().remove(); + + function handleSelectUserAdminLineClick(e) { + pageHandler.profileIdRequest = parseInt(e.currentTarget.id.replace("SelectUserAdminLine_", "")); + $.mobile.changePage("#displayUserAdmin", { transition: "slidefade" }); + } + + for (var profile in data) { + $('
  • ' + data[profile].PlayerName + '

    Click here to edit roles for ' + data[profile].PlayerName + '

  • ') + .appendTo('#selectUserAdminList') + .click(handleSelectUserAdminLineClick); + } + + $('#selectUserAdminList').listview('refresh'); + }); + + // Save promise on page so the transition handler can find it. + $(this).data('promise', promise); + }; + + var pagebeforeshowDisplayUserAdmin = function () { + var promise = request({ + url: "getUserRole?profileId=" + pageHandler.profileIdRequest + }).done(function (result) { + var userRoles = { + TR_USERROLE_ADMIN: 2, + TR_USERROLE_KEYBOARDUSER: 4, + TR_USERROLE_ADDSONGSUSER: 8, + TR_USERROLE_PLAYLISTEDITOR: 16, + TR_USERROLE_PROFILEEDITOR: 32 + }; + + for (var roleName in userRoles) { + $('#' + roleName).prop("checked", ((result & userRoles[roleName]) != 0)).checkboxradio("refresh"); + } + + + $('#btnRoleSave').unbind('click').click(function () { + var role = 0; + + for (var roleName2 in userRoles) { + if ($('#' + roleName2).prop("checked")) { + role = (role | userRoles[roleName2]); + } + } + + request({ + url: "setUserRole?profileId=" + pageHandler.profileIdRequest + "&userRole=" + role, + headers: { "session": sessionHandler.sessionId } + }, "Saving...").done(function (result) { + history.back(); + }); + }); + }); + + // Save promise on page so the transition handler can find it. + $(this).data('promise', promise); + }; + + init(); + }; + } + + function SongPageHandler() { + var allSongsCache = null; + + var init = function () { + //pageLoadHandler for displaySong + $(document).on('pagebeforeshow', '#displaySong', pagebeforeshowDisplaySong); + + //pageLoadHandler for selectSong + $(document).on('pagebeforeshow', '#selectSong', pagebeforeshowSelectSong); + }; + + var pagebeforeshowDisplaySong = function () { + var promise = request({ + url: "getSong?songId=" + pageHandler.songIdRequest + }).done(function (result) { + $('#displaySongAddPlaylist').hide(); + + if (result.Title != null) { + $('#displaySongTitle').text(result.Title); + } else { + $('#displaySongTitle').text("No current song"); + } + + imageLoader.addImage($('#displaySongCover')[0], result.Cover, "img/noCover.png"); + + if (result.Artist != null) { + $('#displaySongArtist').text(result.Artist); + } else { + $('#displaySongArtist').text("-"); + } + + if (result.Genre != null) { + $('#displaySongGenre').text(result.Genre); + } else { + $('#displaySongGenre').text("-"); + } + + if (result.Year != null && result.Year != "") { + $('#displaySongYear').text(result.Year); + } else { + $('#displaySongYear').text("-"); + } + + if (result.Language != null) { + $('#displaySongLanguage').text(result.Language); + } else { + $('#displaySongLanguage').text("-"); + } + + $('#displaySongIsDuet').text(result.IsDuet ? "Yes" : "No"); + + if (result.Title != null || result.Artist != null) { + $('#displaySongLinks').show(); + + $('#displaySongAddPlaylist').unbind('click').click(function () { + pageHandler.customSelectPlaylistSongCallback = function (playlistId) { + request({ url: "addSongToPlaylist?songId=" + result.SongId + "&playlistId=" + playlistId + "&duplicates=false" }, "Add to playlist..."); + history.back(); + }; + $.mobile.changePage("#selectPlaylist", { transition: "slidefade" }); + }); + + $('#displaySongLinkYoutube').unbind('click').click(function () { + externalServices.showYoutube(result.Artist, result.Title); + }); + + $('#displaySongLinkSpotify').unbind('click').click(function () { + externalServices.showSpotify(result.Artist, result.Title); + }); + + $('#displaySongLinkWikipedia').unbind('click').click(function () { + externalServices.showWikipedia(result.Artist); + }); + } else { + $('#displaySongLinks').hide(); } request({ - url: "setUserRole?profileId=" + profileIdRequest + "&userRole=" + role, - headers: { "session": sessionId } - }, "Saving...").done(function (result) { - history.back(); + url: "hasUserRight?right=" + 32 + }).done(function (result2) { + if (result2) { + $('#displaySongAddPlaylist').show(); + } else { + $('#displaySongAddPlaylist').hide(); + } }); }); - }); - // Save promise on page so the transition handler can find it. - $(this).data('promise', promise); - }); + // Save promise on page so the transition handler can find it. + $(this).data('promise', promise); + }; - //pageLoadHandler for login - $(document).on('pagebeforeshow', '#login', pagebeforeshowLogin); + var pagebeforeshowSelectSong = function () { - //pageLoadHandler for main - $(document).on('pagebeforeshow', '#main', function () { - request({ - url: "hasUserRight?right=" + 2 - }).done(function (result) { - if (result) { - $('#mainPageTakePhotoLink').parent().parent().parent().show(); - } else { - $('#mainPageTakePhotoLink').parent().parent().parent().hide(); - } - }); + function handleGetAllSongs() { + $('#selectSongList').children().remove(); - request({ - url: "hasUserRight?right=" + 8 - }).done(function (result) { - if (result) { - $('#mainPageKeyboard').parent().parent().parent().show(); - } else { - $('#mainPageKeyboard').parent().parent().parent().hide(); - } - }); - - request({ - url: "hasUserRight?right=" + 4 - }).done(function (result) { - if (result) { - $('#mainPageSelectProfile').parent().parent().parent().show(); - } else { - $('#mainPageSelectProfile').parent().parent().parent().hide(); - } - }); - }); - - //pageLoadHandler for selectPlaylist - $(document).on('pagebeforeshow', '#selectPlaylist', function () { - function handleGetAllPlaylists(data) { - $('#selectPlaylistContentList').children().remove(); - $('#selectPlaylistAddPlaylistButton').hide(); - - function handleSelectSongLineClick(e) { - playlistIdRequest = parseInt(e.currentTarget.parentElement.parentElement.parentElement.id.replace("selectPlaylistLine_", "")); - playlistRequestName = $(e.currentTarget.parentElement.parentElement.parentElement).find('h2').text(); - if (customSelectPlaylistSongCallback != null) { - customSelectPlaylistSongCallback(playlistIdRequest, playlistRequestName); - customSelectPlaylistSongCallback = null; - } else { - - $.mobile.changePage("#displayPlaylist", { transition: "slidefade" }); + function handleSelectSongLineClick(e) { + pageHandler.songIdRequest = parseInt(e.currentTarget.id.replace("selectSongLine_", "")); + $.mobile.changePage("#displaySong", { transition: "slidefade" }); } + + for (var id in allSongsCache) { + $('
  • '/*+' '*/ + '

    ' + allSongsCache[id].Artist + '

    ' + allSongsCache[id].Title + '

  • ') + .appendTo('#selectSongList') + .click(handleSelectSongLineClick); + } + + $('#selectSongList').listview('refresh'); } - function handleSelectSongLineDeleteClick(e) { - var playlistToDeleteId = parseInt(e.currentTarget.parentElement.id.replace("selectPlaylistLine_", "")); - var playlistToDeleteName = $(e.currentTarget.parentElement).find('h2').text(); - if (window.confirm("Do you really want to delete this playlist:\n" + playlistToDeleteName)) { - request({ url: "removePlaylist?playlistId=" + playlistToDeleteId }, "Loading...").done(function () { - request({ - url: "getPlaylists" - }).done(function (data2) { - handleGetAllPlaylists(data2); + if (allSongsCache == null) { + var promise = request({ + url: "getAllSongs" + }).done(function (data) { + allSongsCache = data; + handleGetAllSongs(); + }); + + // Save promise on page so the transition handler can find it. + $(this).data('promise', promise); + } else { + handleGetAllSongs(); + } + }; + + init(); + } + + function PlaylistPageHandler() { + var playlistIdRequest = -1; + var playlistRequestName = ""; + + var init = function () { + //pageLoadHandler for selectPlaylist + $(document).on('pagebeforeshow', '#selectPlaylist', pagebeforeshowSelectPlaylist); + + //pageLoadHandler for displayPlaylist + $(document).on('pagebeforeshow', '#displayPlaylist', pagebeforeshowDisplayPlaylist); + }; + + var pagebeforeshowSelectPlaylist = function () { + + function handleGetAllPlaylists(data) { + $('#selectPlaylistContentList').children().remove(); + $('#selectPlaylistAddPlaylistButton').hide(); + + function handleSelectSongLineClick(e) { + playlistIdRequest = parseInt(e.currentTarget.parentElement.parentElement.parentElement.id.replace("selectPlaylistLine_", "")); + playlistRequestName = $(e.currentTarget.parentElement.parentElement.parentElement).find('h2').text(); + if (pageHandler.customSelectPlaylistSongCallback != null) { + pageHandler.customSelectPlaylistSongCallback(playlistIdRequest, playlistRequestName); + pageHandler.customSelectPlaylistSongCallback = null; + } else { + + $.mobile.changePage("#displayPlaylist", { transition: "slidefade" }); + } + } + + function handleSelectSongLineDeleteClick(e) { + var playlistToDeleteId = parseInt(e.currentTarget.parentElement.id.replace("selectPlaylistLine_", "")); + var playlistToDeleteName = $(e.currentTarget.parentElement).find('h2').text(); + if (window.confirm("Do you really want to delete this playlist:\n" + playlistToDeleteName)) { + request({ url: "removePlaylist?playlistId=" + playlistToDeleteId }, "Loading...").done(function () { + request({ + url: "getPlaylists" + }).done(function (data2) { + handleGetAllPlaylists(data2); + }); }); - }); + } } - } - for (var id in data) { - var line = $('
  • '/*+' '*/ - + '

    ' + data[id].PlaylistName + '

    ' - + data[id].SongCount - + ' ' + i18n.t('songs') + '

    Delete
  • ') - .appendTo('#selectPlaylistContentList'); - line.find('a:not(.delete)').click(handleSelectSongLineClick); - line.find('a.delete').click(handleSelectSongLineDeleteClick); - } - - $('#selectPlaylistContentList').listview('refresh'); - - request({ - url: "hasUserRight?right=" + 128 - }).done(function (result) { - if (result) { - $('#selectPlaylistContentList').find('.delete').show(); - $('#selectPlaylistContentList').listview('refresh'); - } else { - $('#selectPlaylistContentList').find('.delete').hide(); - $('#selectPlaylistContentList').listview('refresh'); + for (var id in data) { + var line = $('
  • '/*+' '*/ + + '

    ' + data[id].PlaylistName + '

    ' + + data[id].SongCount + + ' ' + i18n.t('songs') + '

    Delete
  • ') + .appendTo('#selectPlaylistContentList'); + line.find('a:not(.delete)').click(handleSelectSongLineClick); + line.find('a.delete').click(handleSelectSongLineDeleteClick); } - }); - $('#selectPlaylistAddPlaylistButton').unbind('click').hide().click(function () { - var name = prompt("Name of the new playlist:", "NewPlaylistName"); - if (name != null - && name.replace(" ", "") != "" - && $('h2').filter(function () { return this.textContent == name; }).length == 0) { - request({ url: "addPlaylist?playlistName=" + name }, "Creating...").done(function () { - request({ - url: "getPlaylists" - }).done(function (data2) { - handleGetAllPlaylists(data2); - }); - }); - } else { - alert(i18n.t("This is not a valid name.")); - } - }); + $('#selectPlaylistContentList').listview('refresh'); - request({ - url: "hasUserRight?right=" + 64 - }).done(function (result) { - if (result) { - $('#selectPlaylistAddPlaylistButton').show(); - } else { - $('#selectPlaylistAddPlaylistButton').hide(); - } - }); - } - - var promise = request({ - url: "getPlaylists" - }).done(function (data) { - handleGetAllPlaylists(data); - }); - - // Save promise on page so the transition handler can find it. - $(this).data('promise', promise); - - }); - - //pageLoadHandler for displayPlaylist - $(document).on('pagebeforeshow', '#displayPlaylist', function () { - function handleGetAllPlaylistSongs(data) { - $('#displayPlaylistHeader').find('h1').text(playlistRequestName); - - $('#displayPlaylistSaveButton').hide().unbind('click').click(function () { - var promises = []; - $('#displayPlaylistContentList').find('li').each(function (indx, elem) { - var newPos = $(elem).index(); - var oldPos = $(elem).data("oldPos"); - if (newPos != oldPos) { - var movedId = elem.id.replace("selectSongLine_", ""); - - promises.push(request({ - url: "moveSongInPlaylist?&newPosition=" + newPos + "&playlistId=" + playlistIdRequest + "&songId=" + movedId - }, "Resorting...")); + request({ + url: "hasUserRight?right=" + 128 + }).done(function (result) { + if (result) { + $('#selectPlaylistContentList').find('.delete').show(); + $('#selectPlaylistContentList').listview('refresh'); + } else { + $('#selectPlaylistContentList').find('.delete').hide(); + $('#selectPlaylistContentList').listview('refresh'); } }); - $.when.apply(promises).done(function () { - //reload data - request({ - url: "getPlaylistSongs?playlistId=" + playlistIdRequest - }).done(function (data2) { - handleGetAllPlaylistSongs(data2); - }); + $('#selectPlaylistAddPlaylistButton').unbind('click').hide().click(function () { + var name = prompt("Name of the new playlist:", "NewPlaylistName"); + if (name != null + && name.replace(" ", "") != "" + && $('h2').filter(function () { return this.textContent == name; }).length == 0) { + request({ url: "addPlaylist?playlistName=" + name }, "Creating...").done(function () { + request({ + url: "getPlaylists" + }).done(function (data2) { + handleGetAllPlaylists(data2); + }); + }); + } else { + alert(i18n.t("This is not a valid name.")); + } }); - }); - $('#displayPlaylistContentList').children().remove(); - - function handleSelectPlaylistSongLineClick(e) { - songIdRequest = parseInt(e.currentTarget.parentElement.parentElement.parentElement.id.replace("selectSongLine_", "")); - $.mobile.changePage("#displaySong", { transition: "slidefade" }); + request({ + url: "hasUserRight?right=" + 64 + }).done(function (result) { + if (result) { + $('#selectPlaylistAddPlaylistButton').show(); + } else { + $('#selectPlaylistAddPlaylistButton').hide(); + } + }); } - function handleSelectPlaylistSongLineDeleteClick(e) { - var songToDeleteId = parseInt(e.currentTarget.parentElement.id.replace("selectSongLine_", "")); - var songToDeleteName = $(e.currentTarget.parentElement).find('h2').text(); + var promise = request({ + url: "getPlaylists" + }).done(function (data) { + handleGetAllPlaylists(data); + }); - if (window.confirm("Do you really want to delete this song from playlist:\n" + songToDeleteName)) { - request({ - url: "/removeSongFromPlaylist?position=" + $('#selectSongLine_' + songToDeleteId).index() - + "&playlistId=" + playlistIdRequest - + "&songId=" + songToDeleteId - }, "Loading...").done(function () { + // Save promise on page so the transition handler can find it. + $(this).data('promise', promise); + + }; + + var pagebeforeshowDisplayPlaylist = function () { + + function handleGetAllPlaylistSongs(data) { + $('#displayPlaylistHeader').find('h1').text(playlistRequestName); + + $('#displayPlaylistSaveButton').hide().unbind('click').click(function () { + var promises = []; + $('#displayPlaylistContentList').find('li').each(function (indx, elem) { + var newPos = $(elem).index(); + var oldPos = $(elem).data("oldPos"); + if (newPos != oldPos) { + var movedId = elem.id.replace("selectSongLine_", ""); + + promises.push(request({ + url: "moveSongInPlaylist?&newPosition=" + newPos + "&playlistId=" + playlistIdRequest + "&songId=" + movedId + }, "Resorting...")); + } + }); + + $.when.apply(promises).done(function () { //reload data request({ url: "getPlaylistSongs?playlistId=" + playlistIdRequest @@ -630,759 +1360,138 @@ function initPageLoadHandler() { handleGetAllPlaylistSongs(data2); }); }); + }); + + $('#displayPlaylistContentList').children().remove(); + + function handleSelectPlaylistSongLineClick(e) { + pageHandler.songIdRequest = parseInt(e.currentTarget.parentElement.parentElement.parentElement.id.replace("selectSongLine_", "")); + $.mobile.changePage("#displaySong", { transition: "slidefade" }); } + function handleSelectPlaylistSongLineDeleteClick(e) { + var songToDeleteId = parseInt(e.currentTarget.parentElement.id.replace("selectSongLine_", "")); + var songToDeleteName = $(e.currentTarget.parentElement).find('h2').text(); - } - - var sortedData = []; - - for (var id1 in data) { - sortedData[data[id1].PlaylistPosition] = data[id1].Song; - } - var i = 0; - for (var id in sortedData) { - var line = $('
  • ' - + sortedData[id].Artist - + '

    ' - + sortedData[id].Title - + '

    Delete
  • ') - .appendTo('#displayPlaylistContentList').data("oldPos", i++); - - line.find('a:not(.delete)').click(handleSelectPlaylistSongLineClick); - line.find('a.delete').click(handleSelectPlaylistSongLineDeleteClick); - - var img = line.find("img")[0]; - - addImage(img, sortedData[id].Cover, "img/noCover.png"); - } - - $('#displayPlaylistContentList').listview('refresh'); - - request({ - url: "hasUserRight?right=" + 256 - }).done(function (result) { - if (result) { - $('#displayPlaylistContentList').find('.delete').show(); - $('#displayPlaylistContentList').listview('refresh'); - } else { - $('#displayPlaylistContentList').find('.delete').hide(); - $('#displayPlaylistContentList').listview('refresh'); - } - }); - - request({ - url: "hasUserRight?right=" + 16 - }).done(function (result) { - if (result) { - $('#displayPlaylistContentList').sortable({ - axis: 'y', - sort: function () { - $('#displayPlaylistSaveButton').show(); - - var $lis = $(this).children('li'); - $lis.each(function () { - var $li = $(this); - var hindex = $lis.filter('.ui-sortable-helper').index(); - if (!$li.is('.ui-sortable-helper')) { - var index = $li.index(); - index = index < hindex ? index + 1 : index; - - $li.val(index); - - if ($li.is('.ui-sortable-placeholder')) { - $lis.filter('.ui-sortable-helper').val(index); - } - } + if (window.confirm("Do you really want to delete this song from playlist:\n" + songToDeleteName)) { + request({ + url: "/removeSongFromPlaylist?position=" + $('#selectSongLine_' + songToDeleteId).index() + + "&playlistId=" + playlistIdRequest + + "&songId=" + songToDeleteId + }, "Loading...").done(function () { + //reload data + request({ + url: "getPlaylistSongs?playlistId=" + playlistIdRequest + }).done(function (data2) { + handleGetAllPlaylistSongs(data2); }); - } - }); + }); + } + + } - }); - } - var promise = request({ - url: "getPlaylistSongs?playlistId=" + playlistIdRequest - }).done(function (data) { - handleGetAllPlaylistSongs(data); - }); + var sortedData = []; - // Save promise on page so the transition handler can find it. - $(this).data('promise', promise); + for (var id1 in data) { + sortedData[data[id1].PlaylistPosition] = data[id1].Song; + } + var i = 0; + for (var id in sortedData) { + var line = $('
  • ' + + sortedData[id].Artist + + '

    ' + + sortedData[id].Title + + '

    Delete
  • ') + .appendTo('#displayPlaylistContentList').data("oldPos", i++); - }); -} + line.find('a:not(.delete)').click(handleSelectPlaylistSongLineClick); + line.find('a.delete').click(handleSelectPlaylistSongLineDeleteClick); -function pagebeforeshowLogin() { - if (window.localStorage) { - var value = window.localStorage.getItem("VocaluxeSessionKey"); - if (value != null && value != "") { - sessionId = value; - } - } + var img = line.find("img")[0]; - if (sessionId != "") { - if (ownProfileId != -1) { - $.mobile.changePage("#main", { transition: "slidefade" }); - } - else { - request({ - url: "getOwnProfileId", - headers: { "session": sessionId } - }, 'Login...').done(function (result) { - ownProfileId = result; - $.mobile.changePage("#main", { transition: "slidefade" }); - }); - } - } -} + imageLoader.addImage(img, sortedData[id].Cover, "img/noCover.png"); + } -function pagebeforeshowDiscover() { - if (document.location.protocol == "file:") { - if (window.localStorage) { - var address = window.localStorage.getItem("VocaluxeServerAddress"); - if (address != null) { - serverBaseAddress = ""; - var prom = request({ - url: address + "isServerOnline", - timeout: 10000 - }, "Checking...").done(function () { - serverBaseAddress = address; - window.localStorage.setItem("VocaluxeServerAddress", address); - $.mobile.changePage("#login", { transition: "none" }); - }).fail(function () { - if (typeof window.BarcodeScanner != "undefined") { - $('#discoverReadQr').show(); + $('#displayPlaylistContentList').listview('refresh'); + + request({ + url: "hasUserRight?right=" + 256 + }).done(function (result) { + if (result) { + $('#displayPlaylistContentList').find('.delete').show(); + $('#displayPlaylistContentList').listview('refresh'); + } else { + $('#displayPlaylistContentList').find('.delete').hide(); + $('#displayPlaylistContentList').listview('refresh'); } }); - $(this).data('promise', prom); - return; - } - if (typeof window.BarcodeScanner != "undefined") { - $('#discoverReadQr').show(); - } - } - } else { - $('#discoverReadQr').hide(); - $.mobile.changePage("#login", { transition: "none" }); - } -} -function initLoginPageHandler() { - var keyPressed = function (e) { - if (e.which == 13) { - $('#loginButton').click(); - } - }; + request({ + url: "hasUserRight?right=" + 16 + }).done(function (result) { + if (result) { + $('#displayPlaylistContentList').sortable({ + axis: 'y', + sort: function () { + $('#displayPlaylistSaveButton').show(); - $('#loginName').keypress(keyPressed); - $('#loginPassword').keypress(keyPressed); + var $lis = $(this).children('li'); + $lis.each(function () { + var $li = $(this); + var hindex = $lis.filter('.ui-sortable-helper').index(); + if (!$li.is('.ui-sortable-helper')) { + var index = $li.index(); + index = index < hindex ? index + 1 : index; - $('#loginButton').click(function () { - var username = $('#loginName').prop("value"); - var password = $('#loginPassword').prop("value"); + $li.val(index); - request({ - url: "login?username=" + username + "&password=" + password - }).done(function (result) { - sessionId = result; - if (window.localStorage) { - window.localStorage.setItem("VocaluxeSessionKey", sessionId); - } - request({ - url: "getOwnProfileId", - headers: { "session": sessionId } - }, 'Login...').done(function (result2) { - ownProfileId = result2; - $.mobile.changePage("#main", { transition: "slidefade" }); - }); - }); - }); - - $('#registerButton').click(function () { - ownProfileId = -1; - profileIdRequest = -1; - $.mobile.changePage("#displayProfile", { transition: "slidefade" }); - }); - - //Fire pageLoadHandler for login - //pagebeforeshowLogin(); -} - -function initMainPageHandler() { - $('#yourProfileLink').click(function () { - profileIdRequest = ownProfileId; - $.mobile.changePage("#displayProfile", { transition: "slidefade" }); - }); - - $('#currentSongLink').click(function () { - request({ - url: "getCurrentSongId", - headers: { "session": sessionId } - }, 'Getting current song...').done(function (result) { - songIdRequest = parseInt(result); - $.mobile.changePage("#displaySong", { transition: "slidefade" }); - }); - }); - - function uploadImg(imgData) { - request({ - url: "sendPhoto", - contentType: "application/json;charset=utf-8", - type: "POST", - data: JSON.stringify({ Photo: { base64Data: imgData } }) - }, 'Uploading photo...'); - } - - $('#mainPageTakePhotoLink').click(function () { - if ($('#captureContainer').length > 0) { - $('#captureContainer').remove(); - } - - if (document.location.protocol == "file:" - && typeof (navigator) != 'undefined' - && typeof (navigator.camera) != 'undefined' - && typeof (navigator.camera.getPicture) != 'undefined') { - navigator.camera.getPicture(function (imageData) { - uploadImg("data:image/jpeg;base64," + imageData); - }, function () { - //Fail - do nothing - }, { - destinationType: navigator.camera.DestinationType.DATA_URL, - allowEdit: true, - correctOrientation: true, - saveToPhotoAlbum: true, - quality: 100 - }); - - } else { - $(document.body).append('
    '); - - $('#capture').change(function (eventData) { - if (eventData && eventData.target && eventData.target.files && eventData.target.files.length == 1) { - var file = eventData.target.files[0]; - var reader = new FileReader(); - - reader.onloadend = function (e) { - uploadImg(e.target.result); - $('#capture').remove(); - }; - - reader.readAsDataURL(file); - } - }); - - $('#capture').click(); - } - }); - - $('#mainPageLogoutLink').click(function () { - logout(); - }); -} - -function initKeyboardPageHandler() { - $('#keyboardButtonUp').click(function () { - request({ - url: "sendKeyEvent?key=up" - }); - }); - - $('#keyboardButtonDown').click(function () { - request({ - url: "sendKeyEvent?key=down" - }); - }); - - $('#keyboardButtonLeft').click(function () { - request({ - url: "sendKeyEvent?key=left" - }); - }); - - $('#keyboardButtonRight').click(function () { - request({ - url: "sendKeyEvent?key=right" - }); - }); - - $('#keyboardButtonEscape').click(function () { - request({ - url: "sendKeyEvent?key=escape" - }); - }); - - $('#keyboardButtonTab').click(function () { - request({ - url: "sendKeyEvent?key=tab" - }); - }); - - $('#keyboardButtonReturn').click(function () { - request({ - url: "sendKeyEvent?key=return" - }); - }); - - $('#keyboardButtonP').click(function () { - request({ - url: "sendKeyEvent?key=p" - }); - }); - - $('#keyboardButtonKeys').keyup(function (e) { - var c = String.fromCharCode(e.keyCode); - if (c.match(/\w/)) { - c = e.keyCode >= 65 ? c.toLowerCase() : c; - request({ - url: "sendKeyEvent?key=" + c - }); - } - var oldText = $('#keyboardButtonKeys')[0].value; - if (oldText.length > 0) { - $('#keyboardButtonKeys')[0].value = oldText.slice(1); - } - }); -} - -function initDiscoverPageHandler() { - var keyPressed = function (e) { - if (e.which == 13) { - $('#discoverConnect').click(); - } - }; - - $('#discoverServerAddress').keypress(keyPressed); - - function handleAddress(address) { - if (address != null && address != "") { - if (address.indexOf("http") != 0) { - address = "http://" + address; - } - if (address.slice(-1) != '/') { - address = address + '/'; - } - serverBaseAddress = ""; - request({ - url: address + "isServerOnline", - timeout: 10000 - }, "Checking...") - .done(function () { - serverBaseAddress = address; - window.localStorage.setItem("VocaluxeServerAddress", address); - $.mobile.changePage("#login", { transition: "slidefade" }); - }) - .fail(function () { - $('#discoverServerAddress').prop("value", ""); - if (document.location.protocol == "file:" - && typeof window.BarcodeScanner != "undefined") { - $('#discoverReadQr').show(); + if ($li.is('.ui-sortable-placeholder')) { + $lis.filter('.ui-sortable-helper').val(index); + } + } + }); + } + }); } }); - } - } - - $('#discoverConnect').click(function () { - handleAddress($('#discoverServerAddress').prop("value")); - }); - - try { - window.BarcodeScanner = cordova.require("cordova/plugin/BarcodeScanner"); - } catch (e) { } - - $('#discoverReadQr').hide().click(function () { - window.BarcodeScanner.scan( - function (result) { - handleAddress(result.text); - }, - function () { - showError("Scan faild"); - } - ); - }); - - //Fire pageLoadHandler for discover (first page shown after start) - setTimeout(function () { - pagebeforeshowDiscover(); - $(this).removeData('promise'); - }, 1); -} - -var cachedImages = {}; - -function delayedImageLoad(elem, id, fail) { - if (elem && id) { - if (cachedImages[id]) { - elem.src = cachedImages[id].base64Data; - return; - } - - elem.src = ""; - $(elem).addClass("imageLoaderImg"); - request({ - url: "delayedImage?id=" + id - }).done(function (result) { - $(elem).removeClass("imageLoaderImg"); - elem.src = result.base64Data; - cachedImages[id] = result; - }).fail(function () { - $(elem).removeClass("imageLoaderImg"); - if (fail) { - elem.src = fail; } - }); - } -} -function addImage(img, base64Image, defaultImg) { - if (base64Image && (base64Image.base64Data || base64Image.imageId)) { - if (base64Image.base64Data) { - $(img).prop("src", base64Image.base64Data); - } - else { - delayedImageLoad(img, base64Image.imageId, defaultImg); - } - } - else { - $(img).prop("src", defaultImg); - } -} + var promise = request({ + url: "getPlaylistSongs?playlistId=" + playlistIdRequest + }).done(function (data) { + handleGetAllPlaylistSongs(data); + }); -function logout() { - ownProfileId = -1; - profileIdRequest = -1; - songIdRequest = -1; - sessionId = ""; + // Save promise on page so the transition handler can find it. + $(this).data('promise', promise); - playerComunication.reset(); - - if (window.localStorage) { - window.localStorage.setItem("VocaluxeSessionKey", ""); - } - $.mobile.changePage("#login", { transition: "slidefade" }); -} - -function request(data, message) { - if ((typeof message) == "undefined" || message == null) { - message = "Loading..."; - } - - if ((typeof data.timeout) == "undefined") { - data.timeout = 10000; //10 sec. timeout - } - - if (message != "noOverlay") { - var message2 = message; - if (i18n.t) { - message2 = i18n.t(message2); - } - $('div[data-role="content"]').wrap('
    '); - $.mobile.loading('show', { - text: message2, - textVisible: true - }); - } - - if (!data["headers"]) { - data["headers"] = {}; - } - - if (message == "external") { - message = "Loading (external)..."; - if (i18n.t) { - message = i18n.t(message) || message; - } - } else { - data["headers"]["session"] = sessionId; - data.url = serverBaseAddress + data.url; - } - - return $.ajax(data).always(function (result) { - if (message != "noOverlay") { - $.mobile.loading('hide'); - $('div[data-role="content"]').unwrap(); - } - }).fail(function (result) { - if (result.statusText.indexOf("No session") != -1) { - logout(); - return; - } - if (message != "noOverlay") { - var msg = result.statusText.length <= 20 ? result.statusText : "Error..."; - if (msg == "error" && result.readyState == 0) { - msg = "No connection"; - } - showError(msg); - } - }); -} - -function showError(message) { - if (!message) { - message = "Error..."; - } - - if (i18n.t) { - message = i18n.t(message) || message; - } - - $('div[data-role="content"]').wrap('
    '); - $.mobile.loading('show', { - text: message, - textVisible: true - }); - $('.ui-loader').find('span').removeClass('ui-icon-loading').addClass('ui-custom-errorIcon'); - - setTimeout(function () { - $.mobile.loading('hide'); - $('div[data-role="content"]').unwrap(); - $('.ui-loader').find('span').removeClass('ui-custom-errorIcon').addClass('ui-icon-loading'); - }, 1000); -} - -var popupVideoHeight = 390; -var popupVideoWidth = 640; -function initVideoPopup() { - function scale(width, height, padding, border) { - var scrWidth = $(window).width() - 30, - scrHeight = $(window).height() - 30, - ifrPadding = 2 * padding, - ifrBorder = 2 * border, - ifrWidth = width + ifrPadding + ifrBorder, - ifrHeight = height + ifrPadding + ifrBorder, - h, w; - - if (ifrWidth < scrWidth && ifrHeight < scrHeight) { - w = ifrWidth; - h = ifrHeight; - } else if ((ifrWidth / scrWidth) > (ifrHeight / scrHeight)) { - w = scrWidth; - h = (scrWidth / ifrWidth) * ifrHeight; - } else { - h = scrHeight; - w = (scrHeight / ifrHeight) * ifrWidth; - } - - return { - 'width': w - (ifrPadding + ifrBorder), - 'height': h - (ifrPadding + ifrBorder) }; - }; - $("#popupVideo").find("a").click(function () { - $("#popupVideo").popup("close"); - $("#popupVideo").popup("close"); //Sometimes twice?? - }); - $("#popupVideo iframe") - .attr("width", 0) - .attr("height", 0); + init(); + } - $("#popupVideo").on({ - popupbeforeposition: function () { - var size = scale(popupVideoWidth, popupVideoHeight, 15, 1), - w = size.width, - h = size.height; + function SessionHandler() { + this.ownProfileId = -1; + this.sessionId = ""; + this.serverBaseAddress = ""; - $("#popupVideo iframe") - .attr("width", w) - .attr("height", h); - }, - popupafterclose: function () { - $("#popupVideo iframe") - .attr("width", 0) - .attr("height", 0) - .attr("src", ""); - } - }); -}; + this.logout = function () { + this.ownProfileId = -1; + + this.sessionId = ""; + + pageHandler.reset(); + playerComunication.reset(); -function showYoutube(artist, title) { - request({ - url: "http://gdata.youtube.com/feeds/api/videos/-/Music?max-results=1&alt=json&format=5&q=" + artist + " " + title, - dataType: "json", - }, "external") - .done(function (result) { - if (result && result.feed && result.feed.entry && result.feed.entry.length > 0) { - var vidId = result.feed.entry[0].id.$t.replace("http://gdata.youtube.com/feeds/api/videos/", ""); - popupVideoHeight = 390; - popupVideoWidth = 640; - - $("#popupVideo iframe").attr("src", "http://www.youtube.com/embed/" + vidId + "?&autoplay=1&rel=0&showinfo=0&disablekb=1&autohide=1"); - $("#popupVideo").popup("open"); - } - }); -} - -function showSpotify(artist, title) { - request({ - url: "http://ws.spotify.com/search/1/track.json?q=" + title + "+artist:" + artist, - dataType: "json", - }, "external") - .done(function (result) { - if (result && result.tracks && result.tracks.length > 0) { - var spotId = result.tracks[0].href; - popupVideoHeight = 80; - popupVideoWidth = 300; - - $("#popupVideo iframe").attr("src", "https://embed.spotify.com/?uri=" + spotId); - $("#popupVideo").popup("open"); - } - }); -} - -function showWikipedia(artist) { - popupVideoHeight = 800; - popupVideoWidth = 600; - - $("#popupVideo iframe").attr("src", "http://m.wikipedia.org/wiki/Special:Search/" + artist); - $("#popupVideo").popup("open"); -} - -function initTranslation() { - - //repair broken buttons on the first page (get broken while translating) - var repairButtons = function () { - $($('#discoverConnect')[0].childNodes).wrap(' '); - $($('#discoverReadQr')[0].childNodes).wrap(' '); - }; - - $.i18n.init({ - resGetPath: 'locales/__lng__.json', - supportedLngs: ['en', 'de', 'fr', 'sv', 'cs'], - fallbackLng: 'en', - keyseparator: '::', - nsseparator: ':::' - }).done(function () { - translationLoaded.resolve(); - }); -} - -function translate() { - //repair broken buttons on the first page (get broken while translating) - var repairButtons = function () { - $($('#discoverConnect')[0].childNodes).wrap(' '); - $($('#discoverReadQr')[0].childNodes).wrap(' '); - }; - $('body').i18n(); - repairButtons(); -} - -function PlayerComunication() { - var playerComunicationToServer = []; - var playerComunicationFromServerHandler = {}; - var defaultHeartbeatIntervall = 5000; - var heartbeatIntervalls = []; - var heartbeatIntervallId; - - var init = function () { - startHeartbeat(); - }; - - var checkPlayerMessages = function () { - if (ownProfileId == -1 - && profileIdRequest == -1 - && ($.mobile.activePage.attr("id") == "displayProfile" - || $.mobile.activePage.attr("id") == "login" - || $.mobile.activePage.attr("id") == "discover")) { - return; - } - - request({ - url: "playerComunication", - type: "POST", - dataType: "json", - contentType: "application/json", - data: JSON.stringify(playerComunicationToServer) - }, "noOverlay").done(function (result) { - if (result.length > 0) { - handlePlayerComunicationFromServer(result); + if (window.localStorage) { + window.localStorage.setItem("VocaluxeSessionKey", ""); } - }).fail(function (result) { - if (result.status == 403 || result.status == 0) { - logout(); - } - }); + $.mobile.changePage("#login", { transition: "slidefade" }); + }; + } - if (playerComunicationToServer.length > 0) { - setTimeout(checkPlayerMessages, 50); - } - - playerComunicationToServer = []; - }; - - var handlePlayerComunicationFromServer = function (items) { - for (var i = 0; i < items.length; i++) { - if (items[i].ProfileId == ownProfileId && playerComunicationFromServerHandler[items[i].Type]) { - if (new Date() - new Date(parseInt("\/Date(1234656000000)\/".match(/[0-9]+/)[0])) <= 0) { - var deserializedData = JSON.parse(items[i].Data); - for (var j = 0; j < playerComunicationFromServerHandler[items[i].Type]; j++) { - playerComunicationFromServerHandler[items[i].Type][j](deserializedData); - } - } - } - } - }; - - var startHeartbeat = function () { - var interv = defaultHeartbeatIntervall; - for (var i = 0; i < heartbeatIntervalls.length; i++) { - if (interv > heartbeatIntervalls[i] && heartbeatIntervalls[i] >= 50) { - interv = heartbeatIntervalls[i]; - } - } - - if (interv == defaultHeartbeatIntervall && heartbeatIntervalls.length != 0) { - heartbeatIntervalls = []; - } - - clearInterval(heartbeatIntervallId); - heartbeatIntervallId = setInterval(checkPlayerMessages, interv); - }; - - var sendPlayerComunicationToServer = function (packet) { - playerComunicationToServer.push(packet); - }; - - this.registerPlayerComunicationFromServerHandler = function (type, handler) { - if (!playerComunicationFromServerHandler[type]) { - playerComunicationFromServerHandler[type] = []; - } - playerComunicationFromServerHandler[type].push(handler); - }; - - this.sendDataToServer = function (data, type) { - sendPlayerComunicationToServer({ - "ProfileId": ownProfileId, - "ValidTill": "\/Date(" + (((new Date())).getTime() + 60000) + ")\/", - "Type": type, - "Data": JSON.stringify(data) - }); - }; - - //mim 50ms - this.requestIntervall = function (newIntervall) { - heartbeatIntervalls.push(newIntervall); - }; - - this.removeIntervall = function (oldIntervall) { - var index = heartbeatIntervalls.indexOf(oldIntervall); - if (index > -1) { - heartbeatIntervalls.splice(oldIntervall, 1); - } - }; - - this.reset = function () { - playerComunicationToServer = []; - playerComunicationFromServerHandler = {}; - heartbeatIntervalls = []; - }; - - this.EPlayerComunicationType = { - "RegisterSubscription": 0, - "UnregisterSubscription": 1 - }; - - init(); -} \ No newline at end of file + initMain(); +})(); \ No newline at end of file From 6a1b3567f4580b2f8757f6f9a15cbcdc75226675 Mon Sep 17 00:00:00 2001 From: lukeIam Date: Sun, 2 Mar 2014 12:46:23 +0100 Subject: [PATCH 6/6] Fix: removed a ; --- Vocaluxe/Website/js/main.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Vocaluxe/Website/js/main.js b/Vocaluxe/Website/js/main.js index 9f960bd1..127a41cd 100644 --- a/Vocaluxe/Website/js/main.js +++ b/Vocaluxe/Website/js/main.js @@ -309,8 +309,7 @@ 'height': h - (ifrPadding + ifrBorder) }; } - - ; + $("#popupVideo").find("a").click(function () { $("#popupVideo").popup("close"); $("#popupVideo").popup("close"); //Sometimes twice??