V1.0
6
.gitignore
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
Client/spiderbasic.js
|
||||
Client/SpiderBasic_Compilation0.html
|
||||
Server/kumos.db
|
||||
/Server/blobs
|
||||
/Server/apps
|
||||
/Server/tmp
|
||||
411
Client/Default Apps/AppManager.sbi
Normal file
@ -0,0 +1,411 @@
|
||||
DeclareModule AppManager
|
||||
Declare Open()
|
||||
EndDeclareModule
|
||||
|
||||
Module AppManager
|
||||
EnableExplicit
|
||||
|
||||
;- Layout
|
||||
#Win_W = 520
|
||||
#Win_H = 380
|
||||
#Toolbar_H = 40
|
||||
#Statusbar_H = 26
|
||||
#List_Row_H = 48
|
||||
|
||||
;- Colors
|
||||
Global Color_Bg = RGB( 22, 22, 34)
|
||||
Global Color_Row_Odd = RGB( 28, 28, 42)
|
||||
Global Color_Row_Even = RGB( 22, 22, 34)
|
||||
Global Color_Sel = RGB( 52, 52, 72)
|
||||
Global Color_Accent = RGB(100, 120, 255)
|
||||
Global Color_Text = RGB(200, 200, 215)
|
||||
Global Color_Dim = RGB(110, 110, 135)
|
||||
Global Color_Sep = RGB( 48, 48, 65)
|
||||
|
||||
Global Font_UI = LoadFont(#PB_Any, "sans-serif", 13)
|
||||
Global Font_Small = LoadFont(#PB_Any, "sans-serif", 11)
|
||||
|
||||
;- App list
|
||||
Structure InstalledApp
|
||||
ID.s
|
||||
Name.s
|
||||
Manifest.s
|
||||
Permissions.s
|
||||
EndStructure
|
||||
|
||||
Global NewList _Apps.InstalledApp()
|
||||
|
||||
;- State
|
||||
Global Window = 0
|
||||
Global _Canvas
|
||||
Global _StatusLabel
|
||||
Global _InstallBtn
|
||||
Global _LaunchBtn
|
||||
Global _UninstallBtn
|
||||
Global _Hover = -1
|
||||
Global _Selected = -1
|
||||
Global _PendingUninstall.s = ""
|
||||
|
||||
;- Install dialog
|
||||
Global _InputWin = 0
|
||||
Global _URLField
|
||||
Global _OKBtn
|
||||
Global _CancelBtn
|
||||
|
||||
;- Private declarations
|
||||
Declare _Refresh()
|
||||
Declare _DrawList()
|
||||
Declare _UpdateButtons()
|
||||
Declare _Status(Msg.s)
|
||||
Declare _OpenInstallDialog()
|
||||
Declare _CloseInstallDialog()
|
||||
Declare _ListCallback(Success, DataString.s)
|
||||
Declare _InstallCallback(Success, DataString.s)
|
||||
Declare _UninstallCallback(Success, DataString.s)
|
||||
Declare _DoUninstall(Result)
|
||||
Declare Handler_Close()
|
||||
Declare Handler_Canvas()
|
||||
Declare Handler_Install()
|
||||
Declare Handler_Launch()
|
||||
Declare Handler_Uninstall()
|
||||
Declare Handler_InputOK()
|
||||
Declare Handler_InputCancel()
|
||||
Declare Handler_Resize()
|
||||
|
||||
;- Public
|
||||
Procedure Open()
|
||||
If IsWindow(Window)
|
||||
SetActiveWindow(Window) : ProcedureReturn
|
||||
EndIf
|
||||
|
||||
Window = OpenWindow(#PB_Any, 160, 100, #Win_W, #Win_H, "App Manager",
|
||||
#PB_Window_TitleBar | #PB_Window_SizeGadget | #PB_Window_SystemMenu)
|
||||
SetWindowColor(Window, Color_Bg)
|
||||
|
||||
_InstallBtn = ButtonGadget(#PB_Any, 4, 6, 100, #Toolbar_H - 12, "+ Install")
|
||||
_LaunchBtn = ButtonGadget(#PB_Any, 112, 6, 80, #Toolbar_H - 12, "Launch")
|
||||
_UninstallBtn = ButtonGadget(#PB_Any, 200, 6, 90, #Toolbar_H - 12, "Uninstall")
|
||||
|
||||
_Canvas = CanvasGadget(#PB_Any, 0, #Toolbar_H,
|
||||
#Win_W, #Win_H - #Toolbar_H - #Statusbar_H)
|
||||
|
||||
_StatusLabel = TextGadget(#PB_Any, 4, #Win_H - #Statusbar_H + 4,
|
||||
#Win_W - 8, #Statusbar_H - 8, "")
|
||||
SetGadgetColor(_StatusLabel, #PB_Gadget_FrontColor, Color_Dim)
|
||||
SetGadgetColor(_StatusLabel, #PB_Gadget_BackColor, Color_Bg)
|
||||
|
||||
BindGadgetEvent(_InstallBtn, @Handler_Install())
|
||||
BindGadgetEvent(_LaunchBtn, @Handler_Launch())
|
||||
BindGadgetEvent(_UninstallBtn, @Handler_Uninstall())
|
||||
BindGadgetEvent(_Canvas, @Handler_Canvas())
|
||||
BindEvent(#PB_Event_SizeWindow, @Handler_Resize(), Window)
|
||||
BindEvent(#PB_Event_CloseWindow, @Handler_Close(), Window)
|
||||
|
||||
Desktop::Register("App Manager", Window, "📦")
|
||||
_UpdateButtons()
|
||||
_Refresh()
|
||||
EndProcedure
|
||||
|
||||
;- Private
|
||||
Procedure _Refresh()
|
||||
_Status("Loading...")
|
||||
ClearList(_Apps())
|
||||
_Selected = -1
|
||||
_DrawList()
|
||||
HTTPRequest(#PB_HTTP_Get, "/api/apps/list", "", @_ListCallback())
|
||||
EndProcedure
|
||||
|
||||
Procedure _DrawList()
|
||||
If Not IsGadget(_Canvas) : ProcedureReturn : EndIf
|
||||
If Not StartDrawing(CanvasOutput(_Canvas)) : ProcedureReturn : EndIf
|
||||
|
||||
Protected W = OutputWidth()
|
||||
Protected H = OutputHeight()
|
||||
|
||||
Box(0, 0, W, H, Color_Bg)
|
||||
|
||||
If IsFont(Font_UI) : DrawingFont(FontID(Font_UI)) : EndIf
|
||||
Protected TH = TextHeight("A")
|
||||
|
||||
ForEach _Apps()
|
||||
Protected i = ListIndex(_Apps())
|
||||
Protected Y = i * #List_Row_H
|
||||
If Y + #List_Row_H > H : Break : EndIf
|
||||
|
||||
Protected RowBg
|
||||
If i = _Selected
|
||||
RowBg = Color_Sel
|
||||
ElseIf i = _Hover
|
||||
RowBg = RGB(40, 40, 58)
|
||||
ElseIf i % 2 = 0
|
||||
RowBg = Color_Row_Even
|
||||
Else
|
||||
RowBg = Color_Row_Odd
|
||||
EndIf
|
||||
|
||||
Box(0, Y, W, #List_Row_H, RowBg)
|
||||
If i = _Selected : Box(0, Y, 3, #List_Row_H, Color_Accent) : EndIf
|
||||
|
||||
DrawingMode(#PB_2DDrawing_Transparent)
|
||||
DrawText(14, Y + (#List_Row_H / 2) - TH - 1, _Apps()\Name, Color_Text)
|
||||
|
||||
If IsFont(Font_Small) : DrawingFont(FontID(Font_Small)) : EndIf
|
||||
DrawText(14, Y + (#List_Row_H / 2) + 2, _Apps()\ID, Color_Dim)
|
||||
If IsFont(Font_UI) : DrawingFont(FontID(Font_UI)) : EndIf
|
||||
|
||||
Box(0, Y + #List_Row_H - 1, W, 1, Color_Sep)
|
||||
Next
|
||||
|
||||
If ListSize(_Apps()) = 0
|
||||
DrawingMode(#PB_2DDrawing_Transparent)
|
||||
If IsFont(Font_UI) : DrawingFont(FontID(Font_UI)) : EndIf
|
||||
DrawText((W - TextWidth("No apps installed")) / 2,
|
||||
(H - TH) / 2, "No apps installed", Color_Dim)
|
||||
EndIf
|
||||
|
||||
StopDrawing()
|
||||
EndProcedure
|
||||
|
||||
Procedure _UpdateButtons()
|
||||
DisableGadget(_LaunchBtn, Bool(_Selected < 0))
|
||||
DisableGadget(_UninstallBtn, Bool(_Selected < 0))
|
||||
EndProcedure
|
||||
|
||||
Procedure _Status(Msg.s)
|
||||
If IsGadget(_StatusLabel) : SetGadgetText(_StatusLabel, Msg) : EndIf
|
||||
EndProcedure
|
||||
|
||||
Procedure _OpenInstallDialog()
|
||||
If IsWindow(_InputWin) : ProcedureReturn : EndIf
|
||||
|
||||
Protected X = WindowX(Window) + (#Win_W / 2) - 170
|
||||
Protected Y = WindowY(Window) + (#Win_H / 2) - 50
|
||||
|
||||
_InputWin = OpenWindow(#PB_Any, X, Y, 340, 100, "Install App from URL",
|
||||
#PB_Window_TitleBar | #PB_Window_SystemMenu)
|
||||
TextGadget(#PB_Any, 10, 14, 320, 18, "Package URL (.zip):")
|
||||
_URLField = StringGadget(#PB_Any, 10, 34, 320, 26, "")
|
||||
_OKBtn = ButtonGadget(#PB_Any, 10, 68, 150, 24, "Install")
|
||||
_CancelBtn = ButtonGadget(#PB_Any, 170, 68, 160, 24, "Cancel")
|
||||
SetActiveGadget(_URLField)
|
||||
|
||||
BindGadgetEvent(_OKBtn, @Handler_InputOK())
|
||||
BindGadgetEvent(_CancelBtn, @Handler_InputCancel())
|
||||
BindEvent(#PB_Event_CloseWindow, @Handler_InputCancel(), _InputWin)
|
||||
EndProcedure
|
||||
|
||||
Procedure _CloseInstallDialog()
|
||||
If Not IsWindow(_InputWin) : ProcedureReturn : EndIf
|
||||
UnbindGadgetEvent(_OKBtn, @Handler_InputOK())
|
||||
UnbindGadgetEvent(_CancelBtn, @Handler_InputCancel())
|
||||
UnbindEvent(#PB_Event_CloseWindow, @Handler_InputCancel(), _InputWin)
|
||||
CloseWindow(_InputWin)
|
||||
_InputWin = 0
|
||||
EndProcedure
|
||||
|
||||
;- HTTP callbacks
|
||||
Procedure _ListCallback(Success, DataString.s)
|
||||
If Not IsWindow(Window) : ProcedureReturn : EndIf
|
||||
|
||||
ClearList(_Apps())
|
||||
_Selected = -1
|
||||
|
||||
If Success And ParseJSON(0, DataString)
|
||||
Protected Root = JSONValue(0)
|
||||
Protected Total = JSONArraySize(Root)
|
||||
Protected i
|
||||
|
||||
For i = 0 To Total - 1
|
||||
Protected Item = GetJSONElement(Root, i)
|
||||
Protected ManiNode = GetJSONMember(Item, "manifest")
|
||||
|
||||
AddElement(_Apps())
|
||||
_Apps()\ID = GetJSONString(GetJSONMember(Item, "app_id"))
|
||||
|
||||
Protected N.s = GetJSONString(GetJSONMember(ManiNode, "name"))
|
||||
If N <> ""
|
||||
_Apps()\Name = N
|
||||
Else
|
||||
_Apps()\Name = _Apps()\ID
|
||||
EndIf
|
||||
|
||||
; Re-serialise manifest to a JSON string
|
||||
Protected Icon.s = GetJSONString(GetJSONMember(ManiNode, "icon"))
|
||||
_Apps()\Manifest = "{" +
|
||||
~"\"id\":\"" + GetJSONString(GetJSONMember(ManiNode, "id")) + ~"\"," +
|
||||
~"\"name\":\"" + GetJSONString(GetJSONMember(ManiNode, "name")) + ~"\"," +
|
||||
~"\"version\":\"" + GetJSONString(GetJSONMember(ManiNode, "version")) + ~"\"," +
|
||||
~"\"icon\":\"" + ReplaceString(Icon, ~"\"", ~"\\\"") + ~"\"," +
|
||||
~"\"entry\":\"" + GetJSONString(GetJSONMember(ManiNode, "entry")) + ~"\"}"
|
||||
|
||||
; Re-serialise permissions array to a JSON string
|
||||
Protected PermNode = GetJSONMember(Item, "permissions")
|
||||
Protected PermCount = JSONArraySize(PermNode)
|
||||
Protected j, Perms.s = "["
|
||||
For j = 0 To PermCount - 1
|
||||
If j > 0 : Perms + "," : EndIf
|
||||
Perms + ~"\"" + GetJSONString(GetJSONElement(PermNode, j)) + ~"\""
|
||||
Next
|
||||
_Apps()\Permissions = Perms + "]"
|
||||
|
||||
; Sync with the desktop start menu
|
||||
Desktop::InstallThirdPartyApp(_Apps()\ID, _Apps()\Manifest,
|
||||
_Apps()\Permissions, Icon)
|
||||
Next
|
||||
FreeJSON(0)
|
||||
|
||||
Protected Count = ListSize(_Apps())
|
||||
If Count = 1
|
||||
_Status("1 app installed")
|
||||
Else
|
||||
_Status(Str(Count) + " apps installed")
|
||||
EndIf
|
||||
Else
|
||||
_Status("Failed to load app list.")
|
||||
EndIf
|
||||
|
||||
_DrawList()
|
||||
_UpdateButtons()
|
||||
EndProcedure
|
||||
|
||||
Procedure _InstallCallback(Success, DataString.s)
|
||||
If Not IsWindow(Window) : ProcedureReturn : EndIf
|
||||
DisableGadget(_InstallBtn, #False)
|
||||
|
||||
If Success And ParseJSON(0, DataString)
|
||||
Protected Root = JSONValue(0)
|
||||
If GetJSONBoolean(GetJSONMember(Root, "success"))
|
||||
Protected AppID.s = GetJSONString(GetJSONMember(Root, "app_id"))
|
||||
FreeJSON(0)
|
||||
Notify::Toast("Installed: " + AppID, Notify::#Success)
|
||||
_Refresh()
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
Protected Err.s = GetJSONString(GetJSONMember(Root, "error"))
|
||||
FreeJSON(0)
|
||||
Notify::Toast(Err, Notify::#Error)
|
||||
Else
|
||||
Notify::Toast("Install failed.", Notify::#Error)
|
||||
EndIf
|
||||
_Status("Ready.")
|
||||
EndProcedure
|
||||
|
||||
Procedure _UninstallCallback(Success, DataString.s)
|
||||
If Not IsWindow(Window) : ProcedureReturn : EndIf
|
||||
If Success And ParseJSON(0, DataString)
|
||||
If GetJSONBoolean(GetJSONMember(JSONValue(0), "success"))
|
||||
FreeJSON(0)
|
||||
Notify::Toast("App uninstalled.", Notify::#Success)
|
||||
Desktop::UninstallThirdPartyApp(_PendingUninstall)
|
||||
_PendingUninstall = ""
|
||||
_Refresh()
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
FreeJSON(0)
|
||||
EndIf
|
||||
Notify::Toast("Uninstall failed.", Notify::#Error)
|
||||
_PendingUninstall = ""
|
||||
_Status("Ready.")
|
||||
EndProcedure
|
||||
|
||||
;- Event handlers
|
||||
Procedure Handler_Canvas()
|
||||
Protected EType = EventType()
|
||||
Protected MY = GetGadgetAttribute(_Canvas, #PB_Canvas_MouseY)
|
||||
Protected Row = MY / #List_Row_H
|
||||
|
||||
Select EType
|
||||
Case #PB_EventType_MouseMove
|
||||
If Row >= ListSize(_Apps()) : Row = -1 : EndIf
|
||||
If Row <> _Hover
|
||||
_Hover = Row : _DrawList()
|
||||
EndIf
|
||||
|
||||
Case #PB_EventType_MouseLeave
|
||||
If _Hover <> -1 : _Hover = -1 : _DrawList() : EndIf
|
||||
|
||||
Case #PB_EventType_LeftButtonUp
|
||||
If Row >= 0 And Row < ListSize(_Apps())
|
||||
_Selected = Row : _DrawList() : _UpdateButtons()
|
||||
EndIf
|
||||
|
||||
Case #PB_EventType_LeftDoubleClick
|
||||
If Row >= 0 And Row < ListSize(_Apps())
|
||||
_Selected = Row
|
||||
Handler_Launch()
|
||||
EndIf
|
||||
EndSelect
|
||||
EndProcedure
|
||||
|
||||
Procedure Handler_Install()
|
||||
_OpenInstallDialog()
|
||||
EndProcedure
|
||||
|
||||
Procedure Handler_Launch()
|
||||
If _Selected < 0 Or Not SelectElement(_Apps(), _Selected) : ProcedureReturn : EndIf
|
||||
AppRuntime::Launch(_Apps()\ID, _Apps()\Manifest, _Apps()\Permissions)
|
||||
EndProcedure
|
||||
|
||||
Procedure Handler_Uninstall()
|
||||
If _Selected < 0 Or Not SelectElement(_Apps(), _Selected) : ProcedureReturn : EndIf
|
||||
Notify::Confirm("Uninstall " + _Apps()\Name,
|
||||
"Remove this app? Private storage will also be deleted.",
|
||||
@_DoUninstall())
|
||||
EndProcedure
|
||||
|
||||
Procedure _DoUninstall(Result)
|
||||
If Not Result Or _Selected < 0 : ProcedureReturn : EndIf
|
||||
If Not SelectElement(_Apps(), _Selected) : ProcedureReturn : EndIf
|
||||
_PendingUninstall = _Apps()\ID
|
||||
_Status("Uninstalling " + _Apps()\ID + "...")
|
||||
HTTPRequest(#PB_HTTP_Post, "/api/apps/uninstall",
|
||||
"app_id=" + URLEncoder(_Apps()\ID, #PB_UTF8) + "&keep_data=0",
|
||||
@_UninstallCallback())
|
||||
EndProcedure
|
||||
|
||||
Procedure Handler_InputOK()
|
||||
Protected URL.s = Trim(GetGadgetText(_URLField))
|
||||
If URL = "" : ProcedureReturn : EndIf
|
||||
_CloseInstallDialog()
|
||||
_Status("Installing...")
|
||||
DisableGadget(_InstallBtn, #True)
|
||||
HTTPRequest(#PB_HTTP_Post, "/api/apps/install",
|
||||
"url=" + URLEncoder(URL, #PB_UTF8), @_InstallCallback())
|
||||
EndProcedure
|
||||
|
||||
Procedure Handler_InputCancel()
|
||||
_CloseInstallDialog()
|
||||
EndProcedure
|
||||
|
||||
Procedure Handler_Resize()
|
||||
Protected W = WindowWidth(Window)
|
||||
Protected H = WindowHeight(Window)
|
||||
ResizeGadget(_Canvas, 0, #Toolbar_H, W, H - #Toolbar_H - #Statusbar_H)
|
||||
ResizeGadget(_StatusLabel, 4, H - #Statusbar_H + 4, W - 8, #Statusbar_H - 8)
|
||||
_DrawList()
|
||||
EndProcedure
|
||||
|
||||
Procedure Handler_Close()
|
||||
_CloseInstallDialog()
|
||||
UnbindGadgetEvent(_InstallBtn, @Handler_Install())
|
||||
UnbindGadgetEvent(_LaunchBtn, @Handler_Launch())
|
||||
UnbindGadgetEvent(_UninstallBtn, @Handler_Uninstall())
|
||||
UnbindGadgetEvent(_Canvas, @Handler_Canvas())
|
||||
UnbindEvent(#PB_Event_SizeWindow, @Handler_Resize(), Window)
|
||||
UnbindEvent(#PB_Event_CloseWindow, @Handler_Close(), Window)
|
||||
Desktop::Unregister(Window)
|
||||
Window = 0
|
||||
EndProcedure
|
||||
|
||||
EndModule
|
||||
|
||||
; IDE Options = SpiderBasic 3.10 (Windows - x86)
|
||||
; CursorPosition = 4
|
||||
; FirstLine = 30
|
||||
; Folding = DAA5
|
||||
; iOSAppOrientation = 0
|
||||
; AndroidAppCode = 0
|
||||
; AndroidAppOrientation = 0
|
||||
; EnableXP
|
||||
; DPIAware
|
||||
; CompileSourceDirectory
|
||||
301
Client/Default Apps/FileExplorer.sbi
Normal file
@ -0,0 +1,301 @@
|
||||
DeclareModule FileExplorer
|
||||
Declare Open()
|
||||
EndDeclareModule
|
||||
|
||||
Module FileExplorer
|
||||
EnableExplicit
|
||||
|
||||
; Layout constants
|
||||
#Toolbar_Height = 35
|
||||
#Statusbar_Height = 24
|
||||
#Window_W = 480
|
||||
#Window_H = 400
|
||||
#Max_Entries = 512
|
||||
|
||||
; Gadgets
|
||||
Global Window
|
||||
Global UpButton
|
||||
Global PathLabel
|
||||
Global NewFolderButton
|
||||
Global NewFileButton
|
||||
Global ListView
|
||||
Global StatusLabel
|
||||
|
||||
; Navigation state
|
||||
Global CurrentPath.s = "/"
|
||||
Global Dim PathStack.s(64)
|
||||
Global StackDepth = 0
|
||||
|
||||
; Entry cache (populated on each listing)
|
||||
Global Dim EntryIDs.s(#Max_Entries)
|
||||
Global Dim EntryNames.s(#Max_Entries)
|
||||
Global Dim EntryIsDir(#Max_Entries)
|
||||
Global EntryCount = 0
|
||||
|
||||
; Input window state
|
||||
Global InputWindow = 0
|
||||
Global InputField
|
||||
Global InputMode ; 0 = new folder, 1 = new file
|
||||
Global ButtonNew
|
||||
Global CancelBtn
|
||||
|
||||
; Private declarations
|
||||
Declare _Load(Path.s)
|
||||
Declare _ListCallback(Success.i, DataString.s)
|
||||
Declare _MkdirCallback(Success.i, DataString.s)
|
||||
Declare _CreateFileCallback(Success.i, DataString.s)
|
||||
Declare _OpenInputWindow(Mode.i)
|
||||
Declare _CloseInputWindow()
|
||||
Declare Handler_Resize()
|
||||
Declare Handler_Up()
|
||||
Declare Handler_NewFolder()
|
||||
Declare Handler_NewFile()
|
||||
Declare Handler_ListView()
|
||||
Declare Handler_Close()
|
||||
Declare Handler_InputConfirm()
|
||||
Declare Handler_InputCancel()
|
||||
|
||||
; Public procedures
|
||||
|
||||
Procedure Open()
|
||||
If IsWindow(Window)
|
||||
SetActiveWindow(Window)
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
|
||||
Window = OpenWindow(#PB_Any, 150, 80, #Window_W, #Window_H, "File Explorer",
|
||||
#PB_Window_TitleBar | #PB_Window_SizeGadget | #PB_Window_SystemMenu)
|
||||
|
||||
; Toolbar
|
||||
UpButton = ButtonGadget(#PB_Any, 2, 4, 30, #Toolbar_Height - 8, "↑")
|
||||
PathLabel = TextGadget (#PB_Any, 36, 4, #Window_W - 200, #Toolbar_Height - 8, "/")
|
||||
NewFolderButton= ButtonGadget(#PB_Any, #Window_W - 162, 4, 80, #Toolbar_Height - 8, "+ Folder")
|
||||
NewFileButton = ButtonGadget(#PB_Any, #Window_W - 78, 4, 74, #Toolbar_Height - 8, "+ File")
|
||||
|
||||
; File list
|
||||
ListView = ListViewGadget(#PB_Any, 0, #Toolbar_Height,
|
||||
#Window_W, #Window_H - #Toolbar_Height - #Statusbar_Height)
|
||||
|
||||
; Status bar
|
||||
StatusLabel = TextGadget(#PB_Any, 4, #Window_H - #Statusbar_Height + 4,
|
||||
#Window_W - 8, #Statusbar_Height - 8, "")
|
||||
|
||||
BindGadgetEvent(UpButton, @Handler_Up())
|
||||
BindGadgetEvent(NewFolderButton, @Handler_NewFolder())
|
||||
BindGadgetEvent(NewFileButton, @Handler_NewFile())
|
||||
BindGadgetEvent(ListView, @Handler_ListView())
|
||||
BindEvent(#PB_Event_SizeWindow, @Handler_Resize(), Window)
|
||||
BindEvent(#PB_Event_CloseWindow, @Handler_Close(), Window)
|
||||
|
||||
Desktop::Register("File Explorer", Window, "📁")
|
||||
|
||||
CurrentPath = "/"
|
||||
StackDepth = 0
|
||||
_Load("/")
|
||||
EndProcedure
|
||||
|
||||
; Private procedures
|
||||
|
||||
Procedure _Load(Path.s)
|
||||
CurrentPath = Path
|
||||
SetGadgetText(PathLabel, Path)
|
||||
SetGadgetText(StatusLabel, "Loading...")
|
||||
ClearGadgetItems(ListView)
|
||||
EntryCount = 0
|
||||
FS::List(Path, @_ListCallback())
|
||||
EndProcedure
|
||||
|
||||
Procedure _ListCallback(Success.i, DataString.s)
|
||||
If Not Success Or Not IsWindow(Window)
|
||||
Notify::Toast("Failed to load directory.", Notify::#Error)
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
|
||||
If Not ParseJSON(0, DataString)
|
||||
Notify::Toast("Could not read directory.", Notify::#Error)
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
|
||||
Protected Root.i = JSONValue(0)
|
||||
Protected Count.i = JSONArraySize(Root)
|
||||
Protected i.i, Item.i
|
||||
|
||||
ClearGadgetItems(ListView)
|
||||
EntryCount = 0
|
||||
|
||||
For i = 0 To Count - 1
|
||||
If EntryCount >= #Max_Entries : Break : EndIf
|
||||
Item = GetJSONElement(Root, i)
|
||||
|
||||
EntryIDs(EntryCount) = Str(GetJSONInteger(GetJSONMember(Item, "id")))
|
||||
EntryNames(EntryCount) = GetJSONString(GetJSONMember(Item, "name"))
|
||||
EntryIsDir(EntryCount) = GetJSONInteger(GetJSONMember(Item, "is_dir"))
|
||||
|
||||
Protected Prefix.s = "[F] "
|
||||
If EntryIsDir(EntryCount) : Prefix = "[D] " : EndIf
|
||||
AddGadgetItem(ListView, -1, Prefix + EntryNames(EntryCount))
|
||||
EntryCount + 1
|
||||
Next
|
||||
|
||||
FreeJSON(0)
|
||||
|
||||
Protected Status.s = Str(EntryCount) + " item"
|
||||
If EntryCount <> 1 : Status + "s" : EndIf
|
||||
SetGadgetText(StatusLabel, Status)
|
||||
EndProcedure
|
||||
|
||||
Procedure _MkdirCallback(Success.i, DataString.s)
|
||||
If Not IsWindow(Window) : ProcedureReturn : EndIf
|
||||
_Load(CurrentPath) ; refresh regardless — server may have created it
|
||||
EndProcedure
|
||||
|
||||
Procedure _CreateFileCallback(Success.i, DataString.s)
|
||||
If Not IsWindow(Window) : ProcedureReturn : EndIf
|
||||
If Success And ParseJSON(0, DataString)
|
||||
Protected Root.i = JSONValue(0)
|
||||
If GetJSONBoolean(GetJSONMember(Root, "success"))
|
||||
Protected ID.s = Str(GetJSONInteger(GetJSONMember(Root, "id")))
|
||||
Protected Path.s = CurrentPath
|
||||
If Right(Path, 1) <> "/" : Path + "/" : EndIf
|
||||
Path + EntryNames(0) ; name was stored in EntryNames(0) temporarily
|
||||
FreeJSON(0)
|
||||
_Load(CurrentPath)
|
||||
TextEditor::Open(ID, Path)
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
FreeJSON(0)
|
||||
EndIf
|
||||
_Load(CurrentPath)
|
||||
EndProcedure
|
||||
|
||||
Procedure _OpenInputWindow(Mode.i)
|
||||
If IsWindow(InputWindow) : ProcedureReturn : EndIf
|
||||
InputMode = Mode
|
||||
|
||||
Protected Title.s = "New Folder"
|
||||
If Mode = 1 : Title = "New File" : EndIf
|
||||
|
||||
Protected X.i = WindowX(Window) + (#Window_W / 2) - 150
|
||||
Protected Y.i = WindowY(Window) + (#Window_H / 2) - 45
|
||||
|
||||
InputWindow = OpenWindow(#PB_Any, X, Y, 300, 90, Title,
|
||||
#PB_Window_TitleBar | #PB_Window_SystemMenu)
|
||||
TextGadget (#PB_Any, 10, 12, 280, 20, "Name:")
|
||||
InputField = StringGadget(#PB_Any, 10, 32, 280, 24, "")
|
||||
ButtonNew = ButtonGadget(#PB_Any, 10, 62, 130, 24, "OK") ; EventGadget index 2
|
||||
CancelBtn = ButtonGadget(#PB_Any, 150, 62, 140, 24, "Cancel")
|
||||
|
||||
SetActiveGadget(InputField)
|
||||
BindGadgetEvent(ButtonNew, @Handler_InputConfirm())
|
||||
BindGadgetEvent(CancelBtn, @Handler_InputCancel())
|
||||
BindEvent(#PB_Event_CloseWindow, @Handler_InputCancel(), InputWindow)
|
||||
EndProcedure
|
||||
|
||||
Procedure _CloseInputWindow()
|
||||
If IsWindow(InputWindow)
|
||||
CloseWindow(InputWindow)
|
||||
EndIf
|
||||
EndProcedure
|
||||
|
||||
; Event handlers
|
||||
|
||||
Procedure Handler_Resize()
|
||||
Protected W.i = WindowWidth(Window)
|
||||
Protected H.i = WindowHeight(Window)
|
||||
ResizeGadget(PathLabel, 36, 4, W - 200, #Toolbar_Height - 8)
|
||||
ResizeGadget(NewFolderButton, W - 162, 4, 80, #Toolbar_Height - 8)
|
||||
ResizeGadget(NewFileButton, W - 78, 4, 74, #Toolbar_Height - 8)
|
||||
ResizeGadget(ListView, 0, #Toolbar_Height, W, H - #Toolbar_Height - #Statusbar_Height)
|
||||
ResizeGadget(StatusLabel, 4, H - #Statusbar_Height + 4, W - 8, #Statusbar_Height - 8)
|
||||
EndProcedure
|
||||
|
||||
Procedure Handler_Up()
|
||||
If StackDepth > 0
|
||||
StackDepth - 1
|
||||
_Load(PathStack(StackDepth))
|
||||
EndIf
|
||||
EndProcedure
|
||||
|
||||
Procedure Handler_NewFolder()
|
||||
_OpenInputWindow(0)
|
||||
EndProcedure
|
||||
|
||||
Procedure Handler_NewFile()
|
||||
_OpenInputWindow(1)
|
||||
EndProcedure
|
||||
|
||||
Procedure Handler_ListView()
|
||||
If EventType() <> #PB_EventType_LeftDoubleClick : ProcedureReturn : EndIf
|
||||
|
||||
Protected Index.i = GetGadgetState(ListView)
|
||||
If Index < 0 Or Index >= EntryCount : ProcedureReturn : EndIf
|
||||
|
||||
If EntryIsDir(Index)
|
||||
; Push current path, navigate in
|
||||
PathStack(StackDepth) = CurrentPath
|
||||
StackDepth + 1
|
||||
Protected NewPath.s = CurrentPath
|
||||
If Right(NewPath, 1) <> "/" : NewPath + "/" : EndIf
|
||||
NewPath + EntryNames(Index)
|
||||
_Load(NewPath)
|
||||
Else
|
||||
; Open in text editor
|
||||
Protected Path.s = CurrentPath
|
||||
If Right(Path, 1) <> "/" : Path + "/" : EndIf
|
||||
Path + EntryNames(Index)
|
||||
TextEditor::Open(EntryIDs(Index), Path)
|
||||
EndIf
|
||||
EndProcedure
|
||||
|
||||
Procedure Handler_Close()
|
||||
If IsWindow(InputWindow)
|
||||
UnbindEvent(#PB_Event_CloseWindow, @Handler_InputCancel(), InputWindow)
|
||||
UnbindGadgetEvent(ButtonNew, @Handler_InputConfirm())
|
||||
UnbindGadgetEvent(CancelBtn, @Handler_InputCancel())
|
||||
_CloseInputWindow()
|
||||
EndIf
|
||||
|
||||
UnbindGadgetEvent(UpButton, @Handler_Up())
|
||||
UnbindGadgetEvent(NewFolderButton, @Handler_NewFolder())
|
||||
UnbindGadgetEvent(NewFileButton, @Handler_NewFile())
|
||||
UnbindGadgetEvent(ListView, @Handler_ListView())
|
||||
UnbindEvent(#PB_Event_SizeWindow, @Handler_Resize(), Window)
|
||||
UnbindEvent(#PB_Event_CloseWindow, @Handler_Close(), Window)
|
||||
Desktop::Unregister(Window)
|
||||
InputWindow = 0
|
||||
Window = 0
|
||||
EndProcedure
|
||||
|
||||
Procedure Handler_InputConfirm()
|
||||
Protected Name.s = Trim(GetGadgetText(InputField))
|
||||
If Name = "" : ProcedureReturn : EndIf
|
||||
|
||||
Protected Path.s = CurrentPath
|
||||
If Right(Path, 1) <> "/" : Path + "/" : EndIf
|
||||
Path + Name
|
||||
|
||||
_CloseInputWindow()
|
||||
|
||||
If InputMode = 0
|
||||
FS::Mkdir(Path, @_MkdirCallback())
|
||||
Else
|
||||
; Stash name temporarily for the callback to build the full path
|
||||
EntryNames(0) = Name
|
||||
FS::Write("", Path, "", @_CreateFileCallback())
|
||||
EndIf
|
||||
EndProcedure
|
||||
|
||||
Procedure Handler_InputCancel()
|
||||
_CloseInputWindow()
|
||||
EndProcedure
|
||||
|
||||
EndModule
|
||||
; IDE Options = SpiderBasic 3.10 (Windows - x86)
|
||||
; CursorPosition = 96
|
||||
; Folding = CAg
|
||||
; iOSAppOrientation = 0
|
||||
; AndroidAppCode = 0
|
||||
; AndroidAppOrientation = 0
|
||||
; EnableXP
|
||||
; DPIAware
|
||||
; CompileSourceDirectory
|
||||
256
Client/Default Apps/Settings.sbi
Normal file
@ -0,0 +1,256 @@
|
||||
DeclareModule Settings
|
||||
Declare Open()
|
||||
EndDeclareModule
|
||||
|
||||
Module Settings
|
||||
EnableExplicit
|
||||
|
||||
#Win_W = 500
|
||||
#Win_H = 290
|
||||
#Panel_W = 140
|
||||
#Row_H = 44
|
||||
#Pad = 20
|
||||
|
||||
Global Color_Panel_Bg = RGB( 22, 22, 34)
|
||||
Global Color_Sel = RGB( 52, 52, 72)
|
||||
Global Color_Hover = RGB( 40, 40, 58)
|
||||
Global Color_Accent = RGB(100, 120, 255)
|
||||
Global Color_Content_Bg = RGB( 36, 36, 52)
|
||||
Global Color_Sep = RGB( 48, 48, 65)
|
||||
Global Color_Text = RGB(200, 200, 215)
|
||||
Global Color_Dim = RGB(110, 110, 135)
|
||||
|
||||
Global PanelFont = LoadFont(#PB_Any, "sans-serif", 13)
|
||||
|
||||
; To add a section: add its name below, create its gadgets in Open(), And add a Case to _ShowSection() / _HideSection().
|
||||
Enumeration
|
||||
#Section_Account
|
||||
; #Section_Appearance
|
||||
; #Section_About
|
||||
|
||||
#Section_Count ; keep in last place
|
||||
EndEnumeration
|
||||
|
||||
Global Dim _SectionNames.s(#Section_Count)
|
||||
|
||||
; State
|
||||
Global Window
|
||||
Global _PanelCanvas
|
||||
Global _CurrentSection
|
||||
Global _PanelHover = -1
|
||||
|
||||
; Account section gadgets
|
||||
Global _LblCurrent, _InCurrent
|
||||
Global _LblNew, _InNew
|
||||
Global _LblConfirm, _InConfirm
|
||||
Global _BtnSave
|
||||
|
||||
; Private declarations
|
||||
Declare _DrawPanel()
|
||||
Declare _HideSection(Section)
|
||||
Declare _ShowSection(Section)
|
||||
Declare Handler_Close()
|
||||
Declare Handler_PanelCanvas()
|
||||
Declare Handler_Save()
|
||||
Declare _SaveCallback(Success, DataString.s)
|
||||
|
||||
; Public procedures
|
||||
Procedure Open()
|
||||
If IsWindow(Window)
|
||||
SetActiveWindow(Window)
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
|
||||
_SectionNames(#Section_Account) = "Account"
|
||||
|
||||
Window = OpenWindow(#PB_Any, 200, 150, #Win_W, #Win_H, "Settings",
|
||||
#PB_Window_TitleBar | #PB_Window_SystemMenu)
|
||||
SetWindowColor(Window, Color_Content_Bg)
|
||||
|
||||
_PanelCanvas = CanvasGadget(#PB_Any, 0, 0, #Panel_W, #Win_H)
|
||||
|
||||
; Account section gadgets
|
||||
Protected CX = #Panel_W + 1 + #Pad
|
||||
Protected CW = #Win_W - #Panel_W - 1 - #Pad * 2
|
||||
Protected Y = 20
|
||||
|
||||
_LblCurrent = TextGadget (#PB_Any, CX, Y, CW, 18, "Current password")
|
||||
_InCurrent = StringGadget(#PB_Any, CX, Y + 22, CW, 26, "", #PB_String_Password)
|
||||
Y + 66
|
||||
|
||||
_LblNew = TextGadget (#PB_Any, CX, Y, CW, 18, "New password")
|
||||
_InNew = StringGadget(#PB_Any, CX, Y + 22, CW, 26, "", #PB_String_Password)
|
||||
Y + 66
|
||||
|
||||
_LblConfirm = TextGadget (#PB_Any, CX, Y, CW, 18, "Confirm new password")
|
||||
_InConfirm = StringGadget(#PB_Any, CX, Y + 22, CW, 26, "", #PB_String_Password)
|
||||
Y + 58
|
||||
|
||||
_BtnSave = ButtonGadget(#PB_Any, CX, Y, CW, 30, "Change password")
|
||||
|
||||
; Label colors
|
||||
SetGadgetColor(_LblCurrent, #PB_Gadget_FrontColor, Color_Text)
|
||||
SetGadgetColor(_LblNew, #PB_Gadget_FrontColor, Color_Text)
|
||||
SetGadgetColor(_LblConfirm, #PB_Gadget_FrontColor, Color_Text)
|
||||
SetGadgetColor(_LblCurrent, #PB_Gadget_BackColor, Color_Content_Bg)
|
||||
SetGadgetColor(_LblNew, #PB_Gadget_BackColor, Color_Content_Bg)
|
||||
SetGadgetColor(_LblConfirm, #PB_Gadget_BackColor, Color_Content_Bg)
|
||||
|
||||
BindGadgetEvent(_BtnSave, @Handler_Save())
|
||||
BindGadgetEvent(_PanelCanvas, @Handler_PanelCanvas())
|
||||
BindEvent(#PB_Event_CloseWindow, @Handler_Close(), Window)
|
||||
|
||||
Desktop::Register("Settings", Window, "⚙")
|
||||
_DrawPanel()
|
||||
EndProcedure
|
||||
|
||||
; Private procedures
|
||||
Procedure _DrawPanel()
|
||||
If Not IsGadget(_PanelCanvas) : ProcedureReturn : EndIf
|
||||
If Not StartDrawing(CanvasOutput(_PanelCanvas)) : ProcedureReturn : EndIf
|
||||
|
||||
Protected W = OutputWidth()
|
||||
Protected H = OutputHeight()
|
||||
Protected i, Y, TH
|
||||
|
||||
Box(0, 0, W, H, Color_Panel_Bg)
|
||||
Box(W - 1, 0, 1, H, Color_Sep) ; right-edge separator
|
||||
|
||||
If IsFont(PanelFont) : DrawingFont(FontID(PanelFont)) : EndIf
|
||||
TH = TextHeight("A")
|
||||
|
||||
For i = 0 To #Section_Count - 1
|
||||
Y = i * #Row_H
|
||||
If i = _CurrentSection
|
||||
Box(0, Y, W - 1, #Row_H, Color_Sel)
|
||||
Box(0, Y, 3, #Row_H, Color_Accent)
|
||||
ElseIf i = _PanelHover
|
||||
Box(0, Y, W - 1, #Row_H, Color_Hover)
|
||||
EndIf
|
||||
DrawingMode(#PB_2DDrawing_Transparent)
|
||||
DrawText(14, Y + (#Row_H - TH) / 2, _SectionNames(i), Color_Text)
|
||||
Next
|
||||
|
||||
StopDrawing()
|
||||
EndProcedure
|
||||
|
||||
Procedure _HideSection(Section)
|
||||
Select Section
|
||||
Case #Section_Account
|
||||
HideGadget(_LblCurrent, #True)
|
||||
HideGadget(_InCurrent, #True)
|
||||
HideGadget(_LblNew, #True)
|
||||
HideGadget(_InNew, #True)
|
||||
HideGadget(_LblConfirm, #True)
|
||||
HideGadget(_InConfirm, #True)
|
||||
HideGadget(_BtnSave, #True)
|
||||
EndSelect
|
||||
EndProcedure
|
||||
|
||||
Procedure _ShowSection(Section)
|
||||
_HideSection(_CurrentSection)
|
||||
_CurrentSection = Section
|
||||
Select Section
|
||||
Case #Section_Account
|
||||
HideGadget(_LblCurrent, #False)
|
||||
HideGadget(_InCurrent, #False)
|
||||
HideGadget(_LblNew, #False)
|
||||
HideGadget(_InNew, #False)
|
||||
HideGadget(_LblConfirm, #False)
|
||||
HideGadget(_InConfirm, #False)
|
||||
HideGadget(_BtnSave, #False)
|
||||
EndSelect
|
||||
_DrawPanel()
|
||||
EndProcedure
|
||||
|
||||
; Event handlers
|
||||
Procedure Handler_PanelCanvas()
|
||||
Protected EType = EventType()
|
||||
Protected MY = GetGadgetAttribute(_PanelCanvas, #PB_Canvas_MouseY)
|
||||
Protected Row = MY / #Row_H
|
||||
|
||||
Select EType
|
||||
Case #PB_EventType_MouseMove
|
||||
If Row < #Section_Count And Row <> _PanelHover
|
||||
_PanelHover = Row
|
||||
_DrawPanel()
|
||||
EndIf
|
||||
|
||||
Case #PB_EventType_MouseLeave
|
||||
_PanelHover = -1
|
||||
_DrawPanel()
|
||||
|
||||
Case #PB_EventType_LeftButtonUp
|
||||
If Row >= 0 And Row < #Section_Count And Row <> _CurrentSection
|
||||
_ShowSection(Row)
|
||||
EndIf
|
||||
EndSelect
|
||||
EndProcedure
|
||||
|
||||
Procedure Handler_Save()
|
||||
Protected Current.s = GetGadgetText(_InCurrent)
|
||||
Protected New_.s = GetGadgetText(_InNew)
|
||||
Protected Confirm.s = GetGadgetText(_InConfirm)
|
||||
|
||||
If Current = "" Or New_ = "" Or Confirm = ""
|
||||
Notify::Toast("Please fill in all fields.", Notify::#Warning)
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
If New_ <> Confirm
|
||||
Notify::Toast("New passwords do not match.", Notify::#Warning)
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
If Len(New_) < 8
|
||||
Notify::Toast("Password must be at least 8 characters.", Notify::#Warning)
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
|
||||
DisableGadget(_BtnSave, #True)
|
||||
HTTPRequest(#PB_HTTP_Post, "/api/auth/password",
|
||||
"current_password=" + URLEncoder(Current, #PB_UTF8) +
|
||||
"&new_password=" + URLEncoder(New_, #PB_UTF8),
|
||||
@_SaveCallback())
|
||||
EndProcedure
|
||||
|
||||
Procedure _SaveCallback(Success, DataString.s)
|
||||
DisableGadget(_BtnSave, #False)
|
||||
|
||||
If Not Success
|
||||
Notify::Toast("Connection error.", Notify::#Error)
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
|
||||
If ParseJSON(0, DataString)
|
||||
Protected Root = JSONValue(0)
|
||||
If GetJSONBoolean(GetJSONMember(Root, "success"))
|
||||
SetGadgetText(_InCurrent, "")
|
||||
SetGadgetText(_InNew, "")
|
||||
SetGadgetText(_InConfirm, "")
|
||||
Notify::Toast("Password changed successfully.", Notify::#Success)
|
||||
Else
|
||||
Notify::Toast(GetJSONString(GetJSONMember(Root, "error")), Notify::#Error)
|
||||
EndIf
|
||||
FreeJSON(0)
|
||||
Else
|
||||
Notify::Toast("Unexpected server response.", Notify::#Error)
|
||||
EndIf
|
||||
EndProcedure
|
||||
|
||||
Procedure Handler_Close()
|
||||
UnbindGadgetEvent(_PanelCanvas, @Handler_PanelCanvas())
|
||||
UnbindGadgetEvent(_BtnSave, @Handler_Save())
|
||||
UnbindEvent(#PB_Event_CloseWindow, @Handler_Close(), Window)
|
||||
Desktop::Unregister(Window)
|
||||
Window = 0
|
||||
EndProcedure
|
||||
|
||||
EndModule
|
||||
; IDE Options = SpiderBasic 3.10 (Windows - x86)
|
||||
; CursorPosition = 10
|
||||
; Folding = Dw
|
||||
; iOSAppOrientation = 0
|
||||
; AndroidAppCode = 0
|
||||
; AndroidAppOrientation = 0
|
||||
; EnableXP
|
||||
; DPIAware
|
||||
; CompileSourceDirectory
|
||||
217
Client/Default Apps/TextEditor.sbi
Normal file
@ -0,0 +1,217 @@
|
||||
DeclareModule TextEditor
|
||||
Declare Open(FileID.s, Path.s)
|
||||
EndDeclareModule
|
||||
|
||||
Module TextEditor
|
||||
EnableExplicit
|
||||
|
||||
#MaxEditors = 16
|
||||
#ToolbarHeight = 35
|
||||
|
||||
Global Dim _Windows.i(#MaxEditors)
|
||||
Global Dim _Editors.i(#MaxEditors)
|
||||
Global Dim _SaveBtns.i(#MaxEditors)
|
||||
Global Dim _FileIDs.s(#MaxEditors)
|
||||
Global Dim _Paths.s(#MaxEditors)
|
||||
Global Dim _Dirty.i(#MaxEditors)
|
||||
Global Dim _Saving.i(#MaxEditors)
|
||||
Global _Count.i = 0
|
||||
Global _Loading_Slot.i = -1
|
||||
Global _ClosingSlot.i = -1 ; slot awaiting confirm-close callback
|
||||
|
||||
Declare _FindByWindow(Window.i)
|
||||
Declare _FindByEditor(Editor.i)
|
||||
Declare _SetDirty(Slot.i, Dirty.i)
|
||||
Declare _Save(Slot.i)
|
||||
Declare _Remove(Slot.i)
|
||||
Declare _ConfirmCloseCallback(Result.i)
|
||||
Declare _ReadCallback(Success.i, DataString.s)
|
||||
Declare _SaveCallback(Success.i, DataString.s)
|
||||
Declare Handler_Resize()
|
||||
Declare Handler_Save()
|
||||
Declare Handler_Change()
|
||||
Declare Handler_Close()
|
||||
|
||||
Procedure Open(FileID.s, Path.s)
|
||||
If _Count >= #MaxEditors
|
||||
Notify::Toast("Too many editors open.", Notify::#Warning)
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
|
||||
Protected Slot.i = _Count
|
||||
Protected W.i = 600
|
||||
Protected H.i = 400
|
||||
Protected Win.i = OpenWindow(#PB_Any, 120 + Slot * 20, 60 + Slot * 20, W, H,
|
||||
FS::GetFilePart(Path),
|
||||
#PB_Window_TitleBar | #PB_Window_SizeGadget | #PB_Window_SystemMenu)
|
||||
|
||||
Protected SaveBtn.i = ButtonGadget(#PB_Any, 5, 3, 80, #ToolbarHeight - 6, "Save")
|
||||
Protected Editor.i = EditorGadget(#PB_Any, 0, #ToolbarHeight, W, H - #ToolbarHeight)
|
||||
|
||||
_Windows(Slot) = Win
|
||||
_Editors(Slot) = Editor
|
||||
_SaveBtns(Slot) = SaveBtn
|
||||
_FileIDs(Slot) = FileID
|
||||
_Paths(Slot) = Path
|
||||
_Dirty(Slot) = #False
|
||||
_Count + 1
|
||||
|
||||
BindGadgetEvent(SaveBtn, @Handler_Save())
|
||||
BindGadgetEvent(Editor, @Handler_Change())
|
||||
BindEvent(#PB_Event_SizeWindow, @Handler_Resize(), Win)
|
||||
BindEvent(#PB_Event_CloseWindow, @Handler_Close(), Win)
|
||||
|
||||
Desktop::Register(FS::GetFilePart(Path), Win, "📄")
|
||||
|
||||
_Loading_Slot = Slot
|
||||
FS::Read_(FileID, Path, @_ReadCallback())
|
||||
EndProcedure
|
||||
|
||||
; Private procedures
|
||||
Procedure.i _FindByWindow(Window.i)
|
||||
Protected i.i
|
||||
For i = 0 To _Count - 1
|
||||
If _Windows(i) = Window : ProcedureReturn i : EndIf
|
||||
Next
|
||||
ProcedureReturn -1
|
||||
EndProcedure
|
||||
|
||||
Procedure.i _FindByEditor(Editor.i)
|
||||
Protected i.i
|
||||
For i = 0 To _Count - 1
|
||||
If _Editors(i) = Editor : ProcedureReturn i : EndIf
|
||||
Next
|
||||
ProcedureReturn -1
|
||||
EndProcedure
|
||||
|
||||
Procedure _SetDirty(Slot.i, Dirty.i)
|
||||
_Dirty(Slot) = Dirty
|
||||
Protected Title.s = FS::GetFilePart(_Paths(Slot))
|
||||
If Dirty : Title = "* " + Title : EndIf
|
||||
SetWindowTitle(_Windows(Slot), Title)
|
||||
EndProcedure
|
||||
|
||||
Procedure _Save(Slot.i)
|
||||
If Not IsWindow(_Windows(Slot)) : ProcedureReturn : EndIf
|
||||
If _Saving(Slot) : ProcedureReturn : EndIf
|
||||
Protected Content.s = GetGadgetText(_Editors(Slot))
|
||||
_Saving(Slot) = #True
|
||||
DisableGadget(_SaveBtns(Slot), #True)
|
||||
FS::Write(_FileIDs(Slot), _Paths(Slot), Content, @_SaveCallback())
|
||||
EndProcedure
|
||||
|
||||
Procedure _Remove(Slot.i)
|
||||
UnbindGadgetEvent(_SaveBtns(Slot), @Handler_Save())
|
||||
UnbindGadgetEvent(_Editors(Slot), @Handler_Change())
|
||||
UnbindEvent(#PB_Event_SizeWindow, @Handler_Resize(), _Windows(Slot))
|
||||
UnbindEvent(#PB_Event_CloseWindow, @Handler_Close(), _Windows(Slot))
|
||||
Desktop::Unregister(_Windows(Slot))
|
||||
|
||||
Protected i.i
|
||||
For i = Slot To _Count - 2
|
||||
_Windows(i) = _Windows(i + 1)
|
||||
_Editors(i) = _Editors(i + 1)
|
||||
_SaveBtns(i) = _SaveBtns(i + 1)
|
||||
_FileIDs(i) = _FileIDs(i + 1)
|
||||
_Paths(i) = _Paths(i + 1)
|
||||
_Dirty(i) = _Dirty(i + 1)
|
||||
_Saving(i) = _Saving(i + 1)
|
||||
Next
|
||||
_Windows(_Count - 1) = 0
|
||||
_Editors(_Count - 1) = 0
|
||||
_SaveBtns(_Count - 1) = 0
|
||||
_FileIDs(_Count - 1) = ""
|
||||
_Paths(_Count - 1) = ""
|
||||
_Dirty(_Count - 1) = #False
|
||||
_Saving(_Count - 1) = #False
|
||||
_Count - 1
|
||||
|
||||
If _Loading_Slot = Slot : _Loading_Slot = -1 : EndIf
|
||||
If _ClosingSlot = Slot : _ClosingSlot = -1 : EndIf
|
||||
EndProcedure
|
||||
|
||||
; Called by Notify::Confirm — Result=1 means discard and close, 0 means cancel.
|
||||
Procedure _ConfirmCloseCallback(Result.i)
|
||||
If Result And _ClosingSlot >= 0
|
||||
_Remove(_ClosingSlot)
|
||||
EndIf
|
||||
_ClosingSlot = -1
|
||||
EndProcedure
|
||||
|
||||
; Callbacks
|
||||
Procedure _ReadCallback(Success.i, DataString.s)
|
||||
If _Loading_Slot < 0 : ProcedureReturn : EndIf
|
||||
Protected Slot.i = _Loading_Slot
|
||||
_Loading_Slot = -1
|
||||
If Not IsWindow(_Windows(Slot)) : ProcedureReturn : EndIf
|
||||
If Success
|
||||
SetGadgetText(_Editors(Slot), DataString)
|
||||
_SetDirty(Slot, #False)
|
||||
Else
|
||||
SetGadgetText(_Editors(Slot), "")
|
||||
_SetDirty(Slot, #True)
|
||||
EndIf
|
||||
EndProcedure
|
||||
|
||||
Procedure _SaveCallback(Success.i, DataString.s)
|
||||
Protected i.i
|
||||
For i = 0 To _Count - 1
|
||||
If _Saving(i)
|
||||
_Saving(i) = #False
|
||||
DisableGadget(_SaveBtns(i), #False)
|
||||
If Success
|
||||
_SetDirty(i, #False)
|
||||
Else
|
||||
Notify::Toast("Save failed — " + FS::GetFilePart(_Paths(i)), Notify::#Error)
|
||||
EndIf
|
||||
Break
|
||||
EndIf
|
||||
Next
|
||||
EndProcedure
|
||||
|
||||
; Event handlers
|
||||
Procedure Handler_Resize()
|
||||
Protected Win.i = EventWindow()
|
||||
Protected Slot.i = _FindByWindow(Win)
|
||||
If Slot < 0 : ProcedureReturn : EndIf
|
||||
ResizeGadget(_Editors(Slot), 0, #ToolbarHeight,
|
||||
WindowWidth(Win), WindowHeight(Win) - #ToolbarHeight)
|
||||
EndProcedure
|
||||
|
||||
Procedure Handler_Save()
|
||||
Protected Slot.i = _FindByWindow(EventWindow())
|
||||
If Slot >= 0 : _Save(Slot) : EndIf
|
||||
EndProcedure
|
||||
|
||||
Procedure Handler_Change()
|
||||
Protected Slot.i = _FindByEditor(EventGadget())
|
||||
If Slot >= 0 And Not _Dirty(Slot)
|
||||
_SetDirty(Slot, #True)
|
||||
EndIf
|
||||
EndProcedure
|
||||
|
||||
Procedure Handler_Close()
|
||||
Protected Win.i = EventWindow()
|
||||
Protected Slot.i = _FindByWindow(Win)
|
||||
If Slot < 0 : ProcedureReturn : EndIf
|
||||
|
||||
If _Dirty(Slot)
|
||||
_ClosingSlot = Slot
|
||||
Notify::Confirm("Unsaved changes",
|
||||
"Close " + Chr(34) + FS::GetFilePart(_Paths(Slot)) + Chr(34) + " without saving?",
|
||||
@_ConfirmCloseCallback())
|
||||
Else
|
||||
_Remove(Slot)
|
||||
EndIf
|
||||
EndProcedure
|
||||
|
||||
EndModule
|
||||
; IDE Options = SpiderBasic 3.10 (Windows - x86)
|
||||
; CursorPosition = 69
|
||||
; Folding = DA5
|
||||
; iOSAppOrientation = 0
|
||||
; AndroidAppCode = 0
|
||||
; AndroidAppOrientation = 0
|
||||
; EnableXP
|
||||
; DPIAware
|
||||
; CompileSourceDirectory
|
||||
73
Client/Default Apps/WebBrowser.sbi
Normal file
@ -0,0 +1,73 @@
|
||||
DeclareModule WebBrowser
|
||||
Declare Open()
|
||||
EndDeclareModule
|
||||
|
||||
Module WebBrowser
|
||||
EnableExplicit
|
||||
|
||||
#Toolbar_Height = 35
|
||||
#Window_W = 800
|
||||
#Window_H = 600
|
||||
|
||||
Global Window.i = 0
|
||||
Global UrlBar.i
|
||||
Global WebView.i
|
||||
|
||||
Declare Handler_Resize()
|
||||
Declare Handler_Navigate()
|
||||
Declare Handler_Close()
|
||||
|
||||
Procedure Open()
|
||||
If IsWindow(Window)
|
||||
SetActiveWindow(Window)
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
|
||||
Window = OpenWindow(#PB_Any, 100, 60, #Window_W, #Window_H, "Web Browser",
|
||||
#PB_Window_TitleBar | #PB_Window_SizeGadget | #PB_Window_SystemMenu)
|
||||
|
||||
UrlBar = StringGadget(#PB_Any, 4, 5, #Window_W - 8, #Toolbar_Height - 10, "https://lastlife.net")
|
||||
WebView = WebGadget(#PB_Any, 0, #Toolbar_Height, #Window_W, #Window_H - #Toolbar_Height, "https://lastlife.net")
|
||||
|
||||
BindGadgetEvent(UrlBar, @Handler_Navigate())
|
||||
BindEvent(#PB_Event_SizeWindow, @Handler_Resize(), Window)
|
||||
BindEvent(#PB_Event_CloseWindow, @Handler_Close(), Window)
|
||||
|
||||
Desktop::Register("Web Browser", Window, "🌐")
|
||||
EndProcedure
|
||||
|
||||
Procedure Handler_Navigate()
|
||||
; Protected URL.s = Trim(GetGadgetText(UrlBar))
|
||||
; If URL = "" : ProcedureReturn : EndIf
|
||||
; If Left(URL, 4) <> "http"
|
||||
; URL = "https://" + URL
|
||||
; SetGadgetText(UrlBar, URL)
|
||||
; EndIf
|
||||
; SetGadgetAttribute(WebView, #PB_Web_URL, URL)
|
||||
EndProcedure
|
||||
|
||||
Procedure Handler_Resize()
|
||||
Protected W.i = WindowWidth(Window)
|
||||
Protected H.i = WindowHeight(Window)
|
||||
ResizeGadget(UrlBar, 4, 5, W - 8, #Toolbar_Height - 10)
|
||||
ResizeGadget(WebView, 0, #Toolbar_Height, W, H - #Toolbar_Height)
|
||||
EndProcedure
|
||||
|
||||
Procedure Handler_Close()
|
||||
UnbindGadgetEvent(UrlBar, @Handler_Navigate())
|
||||
UnbindEvent(#PB_Event_SizeWindow, @Handler_Resize(), Window)
|
||||
UnbindEvent(#PB_Event_CloseWindow, @Handler_Close(), Window)
|
||||
Desktop::Unregister(Window)
|
||||
Window = 0
|
||||
EndProcedure
|
||||
|
||||
EndModule
|
||||
; IDE Options = SpiderBasic 3.10 (Windows - x86)
|
||||
; CursorPosition = 29
|
||||
; Folding = --
|
||||
; iOSAppOrientation = 0
|
||||
; AndroidAppCode = 0
|
||||
; AndroidAppOrientation = 0
|
||||
; EnableXP
|
||||
; DPIAware
|
||||
; CompileSourceDirectory
|
||||
409
Client/Includes/AppRuntime.sbi
Normal file
@ -0,0 +1,409 @@
|
||||
Module AppRuntime
|
||||
EnableExplicit
|
||||
|
||||
;- Instance structure
|
||||
Structure Instance
|
||||
InstanceID.i ; stable unique ID — used as the JS↔SB bridge key
|
||||
Window.i
|
||||
View.i
|
||||
AppID.s
|
||||
Perms.s
|
||||
EndStructure
|
||||
|
||||
Global NewList Instances.Instance()
|
||||
Global _NextID = 1 ; auto-incrementing ID counter
|
||||
|
||||
;- Pending async operations
|
||||
; One pending op of each type at a time (JS is single-threaded).
|
||||
|
||||
Global _PL_ID = -1 : Global _PL_KMID.s = "" ; list
|
||||
Global _PS_ID = -1 : Global _PS_KMID.s = "" ; stat (standalone)
|
||||
Global _PSR_ID = -1 : Global _PSR_KMID.s = "" ; stat-before-read/delete
|
||||
Global _PR_ID = -1 : Global _PR_KMID.s = "" ; read
|
||||
Global _PW_ID = -1 : Global _PW_KMID.s = "" ; write / mkdir / delete
|
||||
Global _PC_ID = -1 : Global _PC_KMID.s = "" ; confirm dialog
|
||||
|
||||
;- Private declarations
|
||||
Declare _FindByID(ID)
|
||||
Declare _FindByWindow(Win)
|
||||
Declare _HasPerm(ID, Token.s)
|
||||
Declare _SendResponse(ID, KMID.s, Success, DataString.s)
|
||||
Declare.s _StoragePath(ID, RelPath.s)
|
||||
Declare _Remove(ID)
|
||||
Declare _CloseByID(ID)
|
||||
Declare _Dispatch(ID, RawMsg.s)
|
||||
Declare _DoList(ID, KMID.s, Path.s)
|
||||
Declare _DoStat(ID, KMID.s, Path.s)
|
||||
Declare _DoStatForRead(ID, KMID.s, Path.s)
|
||||
Declare _DoRead(ID, KMID.s, FileID)
|
||||
Declare _DoWrite(ID, KMID.s, Path.s, Content.s)
|
||||
Declare _DoMkdir(ID, KMID.s, Path.s)
|
||||
Declare _DoDelete(ID, KMID.s, Path.s)
|
||||
Declare _ListCallback(Success, DataString.s)
|
||||
Declare _StatCallback(Success, DataString.s)
|
||||
Declare _StatForReadCallback(Success, DataString.s)
|
||||
Declare _ReadCallback(Success, DataString.s)
|
||||
Declare _WriteCallback(Success, DataString.s)
|
||||
Declare _ConfirmCallback(Result)
|
||||
Declare Handler_Resize()
|
||||
Declare Handler_Close()
|
||||
|
||||
;- Public procedures
|
||||
|
||||
; Call once from Desktop::Open.
|
||||
Procedure Init()
|
||||
!window._kumos_rt = { instances: {} };
|
||||
!window.addEventListener('message', function(e) {
|
||||
! var inst;
|
||||
! for (var id in window._kumos_rt.instances) {
|
||||
! inst = window._kumos_rt.instances[id];
|
||||
! if (inst && inst.frameEl && inst.frameEl.contentWindow === e.source) {
|
||||
! if (typeof e.data === 'string') {
|
||||
! appruntime$f__dispatch(inst.id, e.data);
|
||||
! }
|
||||
! return;
|
||||
! }
|
||||
! }
|
||||
!});
|
||||
EndProcedure
|
||||
|
||||
; Open a new sandboxed app window.
|
||||
Procedure Launch(AppID.s, ManifestJSON.s, Permissions.s)
|
||||
Protected Count, W, H, Win, View, ID
|
||||
Protected AppName.s, N.s, Src.s
|
||||
|
||||
AppName = AppID
|
||||
If ParseJSON(0, ManifestJSON)
|
||||
N = GetJSONString(GetJSONMember(JSONValue(0), "name"))
|
||||
If N <> "" : AppName = N : EndIf
|
||||
FreeJSON(0)
|
||||
EndIf
|
||||
|
||||
Count = ListSize(Instances())
|
||||
W = 640
|
||||
H = 480
|
||||
Win = OpenWindow(#PB_Any, 80 + (Count % 8) * 24, 80 + (Count % 8) * 24, W, H, AppName, #PB_Window_TitleBar | #PB_Window_SizeGadget | #PB_Window_SystemMenu)
|
||||
View = WebGadget(#PB_Any, 0, 0, W, H, "about:blank")
|
||||
Src = "/api/apps/" + AppID + "/index.html"
|
||||
ID = _NextID
|
||||
_NextID + 1
|
||||
|
||||
!(function(){
|
||||
! var frames = document.querySelectorAll('iframe[src="about:blank"]:not([data-kumos-instance])');
|
||||
! var f = frames[frames.length - 1];
|
||||
! if (!f) return;
|
||||
! f.setAttribute('data-kumos-instance', String(v_id));
|
||||
! // No allow-same-origin -> cross-origin isolation even from same host.
|
||||
! f.setAttribute('sandbox', 'allow-scripts allow-forms allow-modals allow-downloads allow-pointer-lock');
|
||||
! window._kumos_rt.instances[v_id] = { id: v_id, frameEl: f, appId: v_appid };
|
||||
! f.src = v_src;
|
||||
!})();
|
||||
|
||||
AddElement(Instances())
|
||||
Instances()\InstanceID = ID
|
||||
Instances()\Window = Win
|
||||
Instances()\View = View
|
||||
Instances()\AppID = AppID
|
||||
Instances()\Perms = Permissions
|
||||
|
||||
BindEvent(#PB_Event_SizeWindow, @Handler_Resize(), Win)
|
||||
BindEvent(#PB_Event_CloseWindow, @Handler_Close(), Win)
|
||||
|
||||
Desktop::Register(AppName, Win, "📦")
|
||||
EndProcedure
|
||||
|
||||
;- Private procedures
|
||||
; Leaves list cursor on the found element. Returns #True if found.
|
||||
Procedure _FindByID(ID)
|
||||
ForEach Instances()
|
||||
If Instances()\InstanceID = ID : ProcedureReturn #True : EndIf
|
||||
Next
|
||||
ProcedureReturn #False
|
||||
EndProcedure
|
||||
|
||||
Procedure _FindByWindow(Win)
|
||||
ForEach Instances()
|
||||
If Instances()\Window = Win : ProcedureReturn #True : EndIf
|
||||
Next
|
||||
ProcedureReturn #False
|
||||
EndProcedure
|
||||
|
||||
Procedure _HasPerm(ID, Token.s)
|
||||
If Not _FindByID(ID) : ProcedureReturn #False : EndIf
|
||||
ProcedureReturn Bool(FindString(Instances()\Perms, ~"\"" + Token + ~"\"") > 0)
|
||||
EndProcedure
|
||||
|
||||
Procedure _SendResponse(ID, KMID.s, Success, DataString.s)
|
||||
!var inst = window._kumos_rt.instances[v_id];
|
||||
!if (!inst || !inst.frameEl) return;
|
||||
!var resp = { kmid: v_kmid, success: !!v_success };
|
||||
!if (v_success) {
|
||||
! try { resp.data = JSON.parse(v_datastring); }
|
||||
! catch(e) { resp.data = v_datastring || null; }
|
||||
!} else {
|
||||
! resp.error = v_datastring || 'Error';
|
||||
!}
|
||||
!try { inst.frameEl.contentWindow.postMessage(JSON.stringify(resp), '*'); } catch(e) {}
|
||||
EndProcedure
|
||||
|
||||
Procedure.s _StoragePath(ID, RelPath.s)
|
||||
Protected Base.s
|
||||
If Not _FindByID(ID) : ProcedureReturn "" : EndIf
|
||||
Base = "/.apps/" + Instances()\AppID + "/"
|
||||
If RelPath = "" Or RelPath = "/" : ProcedureReturn Base : EndIf
|
||||
If Left(RelPath, 1) = "/" : RelPath = Mid(RelPath, 2) : EndIf
|
||||
ProcedureReturn Base + RelPath
|
||||
EndProcedure
|
||||
|
||||
Procedure _Remove(ID)
|
||||
If Not _FindByID(ID) : ProcedureReturn : EndIf
|
||||
!delete window._kumos_rt.instances[v_id];
|
||||
UnbindEvent(#PB_Event_SizeWindow, @Handler_Resize(), Instances()\Window)
|
||||
UnbindEvent(#PB_Event_CloseWindow, @Handler_Close(), Instances()\Window)
|
||||
Desktop::Unregister(Instances()\Window)
|
||||
DeleteElement(Instances())
|
||||
EndProcedure
|
||||
|
||||
Procedure _CloseByID(ID)
|
||||
_Remove(ID)
|
||||
EndProcedure
|
||||
|
||||
;- Message dispatcher
|
||||
Procedure _Dispatch(ID, RawMsg.s)
|
||||
Protected Root, Args, TType
|
||||
Protected KMID.s, Action.s, Path.s, Content.s, Title_.s, Msg.s, MsgType.s
|
||||
|
||||
If Not _FindByID(ID) : ProcedureReturn : EndIf
|
||||
If Not ParseJSON(0, RawMsg) : ProcedureReturn : EndIf
|
||||
|
||||
Root = JSONValue(0)
|
||||
KMID = GetJSONString(GetJSONMember(Root, "kmid"))
|
||||
Action = GetJSONString(GetJSONMember(Root, "action"))
|
||||
Args = GetJSONMember(Root, "args")
|
||||
|
||||
If KMID = "" : FreeJSON(0) : ProcedureReturn : EndIf
|
||||
|
||||
Path = GetJSONString(GetJSONMember(Args, "path"))
|
||||
Content = GetJSONString(GetJSONMember(Args, "content"))
|
||||
Title_ = GetJSONString(GetJSONMember(Args, "title"))
|
||||
Msg = GetJSONString(GetJSONMember(Args, "message"))
|
||||
MsgType = GetJSONString(GetJSONMember(Args, "type"))
|
||||
FreeJSON(0)
|
||||
|
||||
Select Action
|
||||
|
||||
Case "window.ready"
|
||||
_FindByID(ID)
|
||||
_SendResponse(ID, KMID, #True, ~"{\"app_id\":\"" + ReplaceString(Instances()\AppID, ~"\"", ~"\\\"") + ~"\"}")
|
||||
|
||||
Case "window.setTitle"
|
||||
_FindByID(ID)
|
||||
SetWindowTitle(Instances()\Window, Title_)
|
||||
_SendResponse(ID, KMID, #True, "")
|
||||
|
||||
Case "window.close"
|
||||
_SendResponse(ID, KMID, #True, "")
|
||||
!setTimeout(function(){ appruntime$f__closebyid(v_id); }, 50);
|
||||
|
||||
Case "notify.toast"
|
||||
If Not _HasPerm(ID, "notify") : _SendResponse(ID, KMID, #False, "Permission denied: notify") : ProcedureReturn : EndIf
|
||||
TType = Notify::#Info
|
||||
If MsgType = "success" : TType = Notify::#Success
|
||||
ElseIf MsgType = "warning" : TType = Notify::#Warning
|
||||
ElseIf MsgType = "error" : TType = Notify::#Error
|
||||
EndIf
|
||||
Notify::Toast(Msg, TType)
|
||||
_SendResponse(ID, KMID, #True, "")
|
||||
|
||||
Case "notify.confirm"
|
||||
If Not _HasPerm(ID, "notify") : _SendResponse(ID, KMID, #False, "Permission denied: notify") : ProcedureReturn : EndIf
|
||||
If _PC_ID >= 0 : _SendResponse(ID, KMID, #False, "A dialog is already open") : ProcedureReturn : EndIf
|
||||
_PC_ID = ID : _PC_KMID = KMID
|
||||
Notify::Confirm(Title_, Msg, @_ConfirmCallback())
|
||||
|
||||
Case "storage.list" : _DoList(ID, KMID, _StoragePath(ID, Path))
|
||||
Case "storage.stat" : _DoStat(ID, KMID, _StoragePath(ID, Path))
|
||||
Case "storage.read" : _DoStatForRead(ID, KMID, _StoragePath(ID, Path))
|
||||
Case "storage.write" : _DoWrite(ID, KMID, _StoragePath(ID, Path), Content)
|
||||
Case "storage.mkdir" : _DoMkdir(ID, KMID, _StoragePath(ID, Path))
|
||||
Case "storage.delete" : _DoDelete(ID, KMID, _StoragePath(ID, Path))
|
||||
|
||||
Case "fs.list"
|
||||
If Not _HasPerm(ID, "fs.read") : _SendResponse(ID, KMID, #False, "Permission denied: fs.read") : ProcedureReturn : EndIf
|
||||
_DoList(ID, KMID, Path)
|
||||
|
||||
Case "fs.stat"
|
||||
If Not _HasPerm(ID, "fs.read") : _SendResponse(ID, KMID, #False, "Permission denied: fs.read") : ProcedureReturn : EndIf
|
||||
_DoStat(ID, KMID, Path)
|
||||
|
||||
Case "fs.read"
|
||||
If Not _HasPerm(ID, "fs.read") : _SendResponse(ID, KMID, #False, "Permission denied: fs.read") : ProcedureReturn : EndIf
|
||||
_DoStatForRead(ID, KMID, Path)
|
||||
|
||||
Case "fs.write"
|
||||
If Not _HasPerm(ID, "fs.write") : _SendResponse(ID, KMID, #False, "Permission denied: fs.write") : ProcedureReturn : EndIf
|
||||
_DoWrite(ID, KMID, Path, Content)
|
||||
|
||||
Default
|
||||
_SendResponse(ID, KMID, #False, "Unknown action: " + Action)
|
||||
|
||||
EndSelect
|
||||
EndProcedure
|
||||
|
||||
;- Async FS helpers
|
||||
Procedure _DoList(ID, KMID.s, Path.s)
|
||||
If _PL_ID >= 0 : _SendResponse(ID, KMID, #False, "Busy") : ProcedureReturn : EndIf
|
||||
_PL_ID = ID : _PL_KMID = KMID
|
||||
HTTPRequest(#PB_HTTP_Get, "/api/fs/list?path=" + URLEncoder(Path, #PB_UTF8), "", @_ListCallback())
|
||||
EndProcedure
|
||||
|
||||
Procedure _DoStat(ID, KMID.s, Path.s)
|
||||
If _PS_ID >= 0 : _SendResponse(ID, KMID, #False, "Busy") : ProcedureReturn : EndIf
|
||||
_PS_ID = ID : _PS_KMID = KMID
|
||||
HTTPRequest(#PB_HTTP_Get, "/api/fs/stat?path=" + URLEncoder(Path, #PB_UTF8), "", @_StatCallback())
|
||||
EndProcedure
|
||||
|
||||
Procedure _DoStatForRead(ID, KMID.s, Path.s)
|
||||
If _PSR_ID >= 0 : _SendResponse(ID, KMID, #False, "Busy") : ProcedureReturn : EndIf
|
||||
_PSR_ID = ID : _PSR_KMID = KMID
|
||||
HTTPRequest(#PB_HTTP_Get, "/api/fs/stat?path=" + URLEncoder(Path, #PB_UTF8), "", @_StatForReadCallback())
|
||||
EndProcedure
|
||||
|
||||
Procedure _DoRead(ID, KMID.s, FileID)
|
||||
If _PR_ID >= 0 : _SendResponse(ID, KMID, #False, "Busy") : ProcedureReturn : EndIf
|
||||
_PR_ID = ID : _PR_KMID = KMID
|
||||
HTTPRequest(#PB_HTTP_Get, "/api/fs/read?id=" + FileID, "", @_ReadCallback())
|
||||
EndProcedure
|
||||
|
||||
Procedure _DoWrite(ID, KMID.s, Path.s, Content.s)
|
||||
If _PW_ID >= 0 : _SendResponse(ID, KMID, #False, "Busy") : ProcedureReturn : EndIf
|
||||
_PW_ID = ID : _PW_KMID = KMID
|
||||
HTTPRequest(#PB_HTTP_Post, "/api/fs/write", "path=" + URLEncoder(Path, #PB_UTF8) + "&content=" + URLEncoder(Content, #PB_UTF8), @_WriteCallback())
|
||||
EndProcedure
|
||||
|
||||
Procedure _DoMkdir(ID, KMID.s, Path.s)
|
||||
If _PW_ID >= 0 : _SendResponse(ID, KMID, #False, "Busy") : ProcedureReturn : EndIf
|
||||
_PW_ID = ID : _PW_KMID = KMID
|
||||
HTTPRequest(#PB_HTTP_Post, "/api/fs/mkdir", "path=" + URLEncoder(Path, #PB_UTF8), @_WriteCallback())
|
||||
EndProcedure
|
||||
|
||||
Procedure _DoDelete(ID, KMID.s, Path.s)
|
||||
If _PSR_ID >= 0 : _SendResponse(ID, KMID, #False, "Busy") : ProcedureReturn : EndIf
|
||||
_PSR_ID = ID : _PSR_KMID = "DEL:" + KMID
|
||||
HTTPRequest(#PB_HTTP_Get, "/api/fs/stat?path=" + URLEncoder(Path, #PB_UTF8), "", @_StatForReadCallback())
|
||||
EndProcedure
|
||||
|
||||
;- Callbacks
|
||||
Procedure _ListCallback(Success, DataString.s)
|
||||
Protected ID
|
||||
Protected KMID.s
|
||||
If _PL_ID < 0 : ProcedureReturn : EndIf
|
||||
ID = _PL_ID : KMID = _PL_KMID
|
||||
_PL_ID = -1 : _PL_KMID = ""
|
||||
_SendResponse(ID, KMID, Success, DataString)
|
||||
EndProcedure
|
||||
|
||||
Procedure _StatCallback(Success, DataString.s)
|
||||
Protected ID
|
||||
Protected KMID.s
|
||||
If _PS_ID < 0 : ProcedureReturn : EndIf
|
||||
ID = _PS_ID : KMID = _PS_KMID
|
||||
_PS_ID = -1 : _PS_KMID = ""
|
||||
_SendResponse(ID, KMID, Success, DataString)
|
||||
EndProcedure
|
||||
|
||||
Procedure _StatForReadCallback(Success, DataString.s)
|
||||
Protected ID, IsDelete, IsDir, FileID, Root
|
||||
Protected Tag.s, KMID.s
|
||||
|
||||
If _PSR_ID < 0 : ProcedureReturn : EndIf
|
||||
ID = _PSR_ID
|
||||
Tag = _PSR_KMID
|
||||
_PSR_ID = -1 : _PSR_KMID = ""
|
||||
|
||||
IsDelete = Bool(Left(Tag, 4) = "DEL:")
|
||||
If IsDelete : KMID = Mid(Tag, 5) : Else : KMID = Tag : EndIf
|
||||
|
||||
If Not Success : _SendResponse(ID, KMID, #False, "Not found") : ProcedureReturn : EndIf
|
||||
If Not ParseJSON(0, DataString) : _SendResponse(ID, KMID, #False, "Bad stat response") : ProcedureReturn : EndIf
|
||||
|
||||
Root = JSONValue(0)
|
||||
IsDir = GetJSONInteger(GetJSONMember(Root, "is_dir"))
|
||||
FileID = GetJSONInteger(GetJSONMember(Root, "id"))
|
||||
FreeJSON(0)
|
||||
|
||||
If FileID <= 0 : _SendResponse(ID, KMID, #False, "Not found") : ProcedureReturn : EndIf
|
||||
|
||||
If IsDelete
|
||||
If _PW_ID >= 0 : _SendResponse(ID, KMID, #False, "Busy") : ProcedureReturn : EndIf
|
||||
_PW_ID = ID : _PW_KMID = KMID
|
||||
HTTPRequest(#PB_HTTP_Post, "/api/fs/delete", "id=" + FileID, @_WriteCallback())
|
||||
Else
|
||||
If IsDir : _SendResponse(ID, KMID, #False, "Is a directory") : ProcedureReturn : EndIf
|
||||
_DoRead(ID, KMID, FileID)
|
||||
EndIf
|
||||
EndProcedure
|
||||
|
||||
Procedure _ReadCallback(Success, DataString.s)
|
||||
Protected ID
|
||||
Protected KMID.s
|
||||
If _PR_ID < 0 : ProcedureReturn : EndIf
|
||||
ID = _PR_ID : KMID = _PR_KMID
|
||||
_PR_ID = -1 : _PR_KMID = ""
|
||||
_SendResponse(ID, KMID, Success, DataString)
|
||||
EndProcedure
|
||||
|
||||
Procedure _WriteCallback(Success, DataString.s)
|
||||
Protected ID, OK
|
||||
Protected KMID.s
|
||||
|
||||
If _PW_ID < 0 : ProcedureReturn : EndIf
|
||||
ID = _PW_ID : KMID = _PW_KMID
|
||||
_PW_ID = -1 : _PW_KMID = ""
|
||||
|
||||
If Not Success : _SendResponse(ID, KMID, #False, "Request failed") : ProcedureReturn : EndIf
|
||||
|
||||
If ParseJSON(0, DataString)
|
||||
OK = GetJSONBoolean(GetJSONMember(JSONValue(0), "success"))
|
||||
FreeJSON(0)
|
||||
_SendResponse(ID, KMID, OK, "")
|
||||
Else
|
||||
_SendResponse(ID, KMID, #False, "Bad server response")
|
||||
EndIf
|
||||
EndProcedure
|
||||
|
||||
Procedure _ConfirmCallback(Result)
|
||||
Protected ID
|
||||
Protected KMID.s, BoolStr.s
|
||||
|
||||
If _PC_ID < 0 : ProcedureReturn : EndIf
|
||||
ID = _PC_ID : KMID = _PC_KMID
|
||||
_PC_ID = -1 : _PC_KMID = ""
|
||||
|
||||
BoolStr = "false"
|
||||
If Result : BoolStr = "true" : EndIf
|
||||
_SendResponse(ID, KMID, #True, BoolStr)
|
||||
EndProcedure
|
||||
|
||||
;- Window event handlers
|
||||
Procedure Handler_Resize()
|
||||
If Not _FindByWindow(EventWindow()) : ProcedureReturn : EndIf
|
||||
ResizeGadget(Instances()\View, 0, 0, WindowWidth(Instances()\Window), WindowHeight(Instances()\Window))
|
||||
EndProcedure
|
||||
|
||||
Procedure Handler_Close()
|
||||
If Not _FindByWindow(EventWindow()) : ProcedureReturn : EndIf
|
||||
_Remove(Instances()\InstanceID)
|
||||
EndProcedure
|
||||
|
||||
EndModule
|
||||
|
||||
; IDE Options = SpiderBasic 3.20 (Windows - x86)
|
||||
; CursorPosition = 2
|
||||
; Folding = BAAA9
|
||||
; iOSAppOrientation = 0
|
||||
; AndroidAppCode = 0
|
||||
; AndroidAppOrientation = 0
|
||||
; EnableXP
|
||||
; DPIAware
|
||||
; CompileSourceDirectory
|
||||
603
Client/Includes/Desktop.sbi
Normal file
@ -0,0 +1,603 @@
|
||||
Module Desktop
|
||||
EnableExplicit
|
||||
|
||||
;- Constants
|
||||
#Timer_Clock = 0
|
||||
#Taskbar_Width = 72
|
||||
#Taskbar_ItemHeight = 40
|
||||
#Icon_Size = 28
|
||||
#Menu_W = 240
|
||||
#Menu_Rail_W = 52
|
||||
#Menu_Header_H = 32
|
||||
#Menu_Row_H = 44
|
||||
#Menu_Icon_Size = 22
|
||||
|
||||
; Hit-test return values for the start menu
|
||||
Enumeration
|
||||
#Hit_None = -1
|
||||
#Hit_Settings = -2
|
||||
#Hit_Logout = -3
|
||||
EndEnumeration
|
||||
|
||||
;- Globals
|
||||
; Colors
|
||||
Global Color_Bar_Bg = RGB( 28, 28, 40)
|
||||
Global Color_Bar_Active = RGB( 52, 52, 72)
|
||||
Global Color_Accent = RGB(100, 120, 255)
|
||||
Global Color_Icon = RGBA(220, 220, 220, 255)
|
||||
Global Color_Menu_Bg = RGB( 36, 36, 52)
|
||||
Global Color_Menu_Rail = RGB( 22, 22, 34)
|
||||
Global Color_Menu_Header = RGB( 22, 22, 34)
|
||||
Global Color_Menu_Hover = RGB( 55, 55, 78)
|
||||
Global Color_Menu_Sep = RGB( 48, 48, 65)
|
||||
Global Color_Menu_Text = RGB(200, 200, 215)
|
||||
Global Color_Menu_Dim = RGB(110, 110, 135)
|
||||
Global Color_Logout_Hover = RGB( 65, 30, 35)
|
||||
Global Color_Logout_Icon = RGBA(200, 90, 90, 255)
|
||||
|
||||
Global IconFont = LoadFont(#PB_Any, "sans-serif", 18)
|
||||
Global MenuFont = LoadFont(#PB_Any, "sans-serif", 13)
|
||||
|
||||
; Desktop windows
|
||||
Global TaskBarWindow
|
||||
Global ClockLabel
|
||||
Global StartButton
|
||||
Global StartMenuWindow
|
||||
|
||||
; App registry
|
||||
Structure App
|
||||
Name.s
|
||||
IconImg.i
|
||||
Proc.i
|
||||
ID.s
|
||||
EndStructure
|
||||
#MaxInstalledApps = 32
|
||||
Global Dim AppRegistry.App(#MaxInstalledApps)
|
||||
Global _AppCount
|
||||
Global _MenuCanvas
|
||||
Global _MenuHover = #Hit_None
|
||||
|
||||
; System shortcut icons (created in Open)
|
||||
Global _IconSettings
|
||||
Global _IconLogout
|
||||
|
||||
; Window manager state
|
||||
Structure Window
|
||||
Window.i
|
||||
Button.i
|
||||
Name.s
|
||||
Icon.i
|
||||
EndStructure
|
||||
Global _ActiveWindow
|
||||
Global NewList WindowManager.Window()
|
||||
|
||||
;- Private declarations
|
||||
Declare _MakeIconImage(Label.s, Size = #Icon_Size, Color = 0)
|
||||
Declare _MenuHeight()
|
||||
Declare _HitTest(MX, MY)
|
||||
Declare _RebuildMenu()
|
||||
Declare _DrawMenu()
|
||||
Declare _CloseMenu()
|
||||
Declare _FindByWindow(Win)
|
||||
Declare _FindByButton(Btn)
|
||||
Declare _DrawButton()
|
||||
Declare _SetActiveButton()
|
||||
Declare _RebuildButtons()
|
||||
Declare _LoadInstalledAppsCallback(Success, DataString.s)
|
||||
Declare Handler_Logout()
|
||||
Declare LogoutCallback(Success, Response.s)
|
||||
Declare Handler_Resize()
|
||||
Declare Handler_Clock()
|
||||
Declare Handler_StartButton()
|
||||
Declare Handler_StartMenu_Focus()
|
||||
Declare Handler_MenuCanvas()
|
||||
Declare Handler_TaskbarButton()
|
||||
Declare Handler_AppClose()
|
||||
Declare Handler_AppActivate()
|
||||
|
||||
;- Public procedures
|
||||
Procedure Open(Username.s)
|
||||
Protected Width, Height
|
||||
Protected *AppProc
|
||||
|
||||
Width = DesktopWidth(0)
|
||||
Height = DesktopHeight(0)
|
||||
|
||||
; System shortcut icons — pass explicit colors at creation time
|
||||
_IconSettings = _MakeIconImage("⚙", #Menu_Icon_Size, Color_Logout_Icon)
|
||||
_IconLogout = _MakeIconImage("⏻", #Menu_Icon_Size, Color_Logout_Icon)
|
||||
|
||||
TaskBarWindow = OpenWindow(#PB_Any, 0, 0, #Taskbar_Width, Height, "", #PB_Window_BorderLess)
|
||||
BindEvent(#PB_Event_ActivateWindow, @Handler_AppActivate(), TaskBarWindow)
|
||||
StickyWindow(TaskBarWindow, #True)
|
||||
SetWindowColor(TaskBarWindow, Color_Bar_Bg)
|
||||
|
||||
StartButton = ButtonGadget(#PB_Any, 0, 0, #Taskbar_Width, #Taskbar_ItemHeight, "≡")
|
||||
BindGadgetEvent(StartButton, @Handler_StartButton())
|
||||
|
||||
ClockLabel = TextGadget(#PB_Any, 0, Height - #Taskbar_ItemHeight, #Taskbar_Width, #Taskbar_ItemHeight, "", #PB_Text_Center | #PB_Text_VerticalCenter)
|
||||
SetGadgetColor(ClockLabel, #PB_Gadget_FrontColor, Color_Menu_Text)
|
||||
Handler_Clock()
|
||||
AddWindowTimer(TaskBarWindow, #Timer_Clock, 1000)
|
||||
BindEvent(#PB_Event_Timer, @Handler_Clock(), TaskBarWindow)
|
||||
|
||||
StartMenuWindow = OpenWindow(#PB_Any, #Taskbar_Width + 4, 0, #Menu_W, 100, "", #PB_Window_BorderLess | #PB_Window_Invisible)
|
||||
StickyWindow(StartMenuWindow, #True)
|
||||
_MenuCanvas = CanvasGadget(#PB_Any, 0, 0, #Menu_W, 100)
|
||||
BindGadgetEvent(_MenuCanvas, @Handler_MenuCanvas())
|
||||
|
||||
BindEvent(#PB_Event_SizeDesktop, @Handler_Resize())
|
||||
BindEvent(#PB_Event_DeactivateWindow, @Handler_StartMenu_Focus(), StartMenuWindow)
|
||||
|
||||
AppRuntime::Init()
|
||||
!p_appproc = fileexplorer$f_open;
|
||||
InstallApp("File Explorer", *AppProc, "📁")
|
||||
!p_appproc = webbrowser$f_open;
|
||||
InstallApp("Web Browser", *AppProc, "🌐")
|
||||
!p_appproc = appmanager$f_open;
|
||||
InstallApp("App Manager", *AppProc, "📦")
|
||||
Handler_Resize()
|
||||
|
||||
HTTPRequest(#PB_HTTP_Get, "/api/apps/list", "", @_LoadInstalledAppsCallback())
|
||||
EndProcedure
|
||||
|
||||
Procedure InstallApp(AppName.s, *LaunchProc, Icon.s = "")
|
||||
Protected Slot
|
||||
Protected Label.s
|
||||
|
||||
If _AppCount >= #MaxInstalledApps : ProcedureReturn : EndIf
|
||||
|
||||
Slot = _AppCount
|
||||
Label = Icon
|
||||
If Label = "" : Label = Left(AppName, 2) : EndIf
|
||||
|
||||
AppRegistry(Slot)\Name = AppName
|
||||
AppRegistry(Slot)\Proc = *LaunchProc
|
||||
AppRegistry(Slot)\IconImg = _MakeIconImage(Label, #Menu_Icon_Size)
|
||||
|
||||
_AppCount + 1
|
||||
_RebuildMenu()
|
||||
EndProcedure
|
||||
|
||||
Procedure Register(AppName.s, Win, Icon.s = "")
|
||||
Protected Y, GadgetList, Btn
|
||||
Protected Label.s
|
||||
|
||||
AddElement(WindowManager())
|
||||
WindowManager()\Window = Win
|
||||
WindowManager()\Name = AppName
|
||||
|
||||
Label = Icon
|
||||
If Label = "" : Label = Left(AppName, 2) : EndIf
|
||||
WindowManager()\Icon = _MakeIconImage(Label)
|
||||
|
||||
Y = #Taskbar_ItemHeight + (ListIndex(WindowManager()) * #Taskbar_ItemHeight)
|
||||
GadgetList = UseGadgetList(WindowID(TaskBarWindow))
|
||||
Btn = CanvasGadget(#PB_Any, 0, Y, #Taskbar_Width, #Taskbar_ItemHeight)
|
||||
UseGadgetList(GadgetList)
|
||||
|
||||
WindowManager()\Button = Btn
|
||||
SetGadgetData(Btn, Win)
|
||||
SetWindowData(Win, Btn)
|
||||
|
||||
BindGadgetEvent(Btn, @Handler_TaskbarButton())
|
||||
BindEvent(#PB_Event_CloseWindow, @Handler_AppClose(), Win)
|
||||
BindEvent(#PB_Event_ActivateWindow, @Handler_AppActivate(), Win)
|
||||
|
||||
_ActiveWindow = Win
|
||||
_SetActiveButton()
|
||||
EndProcedure
|
||||
|
||||
Procedure Unregister(Win)
|
||||
If Not _FindByWindow(Win) : ProcedureReturn : EndIf
|
||||
UnbindEvent(#PB_Event_CloseWindow, @Handler_AppClose(), Win)
|
||||
UnbindEvent(#PB_Event_ActivateWindow, @Handler_AppActivate(), Win)
|
||||
UnbindGadgetEvent(WindowManager()\Button, @Handler_TaskbarButton())
|
||||
FreeGadget(WindowManager()\Button)
|
||||
CloseWindow(Win)
|
||||
DeleteElement(WindowManager())
|
||||
If _ActiveWindow = Win : _ActiveWindow = GetActiveWindow() : EndIf
|
||||
_RebuildButtons()
|
||||
EndProcedure
|
||||
|
||||
Procedure InstallThirdPartyApp(AppID.s, ManifestJSON.s, Permissions.s, Icon.s = "")
|
||||
Protected Slot, i
|
||||
Protected AppName.s, Label.s, N.s
|
||||
|
||||
Slot = -1
|
||||
For i = 0 To _AppCount - 1
|
||||
If AppRegistry(i)\ID = AppID : Slot = i : Break : EndIf
|
||||
Next
|
||||
|
||||
If Slot < 0
|
||||
If _AppCount >= #MaxInstalledApps : ProcedureReturn : EndIf
|
||||
Slot = _AppCount
|
||||
_AppCount + 1
|
||||
Else
|
||||
If IsImage(AppRegistry(Slot)\IconImg) : FreeImage(AppRegistry(Slot)\IconImg) : EndIf
|
||||
EndIf
|
||||
|
||||
AppName = AppID
|
||||
If ParseJSON(0, ManifestJSON)
|
||||
N = GetJSONString(GetJSONMember(JSONValue(0), "name"))
|
||||
If N <> "" : AppName = N : EndIf
|
||||
FreeJSON(0)
|
||||
EndIf
|
||||
|
||||
AppRegistry(Slot)\Name = AppName
|
||||
AppRegistry(Slot)\ID = AppID
|
||||
|
||||
!(function() {
|
||||
! var _id = v_appid, _m = v_manifestjson, _p = v_permissions;
|
||||
! desktop$a_AppRegistry.array[v_slot]._Proc = function() {
|
||||
! appruntime$f_launch(_id, _m, _p);
|
||||
! };
|
||||
!})();
|
||||
|
||||
Label = Icon
|
||||
If Label = "" : Label = "📦" : EndIf
|
||||
AppRegistry(Slot)\IconImg = _MakeIconImage(Label, #Menu_Icon_Size)
|
||||
|
||||
_RebuildMenu()
|
||||
EndProcedure
|
||||
|
||||
Procedure UninstallThirdPartyApp(AppID.s)
|
||||
Protected i, j
|
||||
For i = 0 To _AppCount - 1
|
||||
If AppRegistry(i)\ID = AppID
|
||||
If IsImage(AppRegistry(i)\IconImg) : FreeImage(AppRegistry(i)\IconImg) : EndIf
|
||||
; Compact the registry
|
||||
For j = i To _AppCount - 2
|
||||
AppRegistry(j)\Name = AppRegistry(j + 1)\Name
|
||||
AppRegistry(j)\ID = AppRegistry(j + 1)\ID
|
||||
AppRegistry(j)\IconImg = AppRegistry(j + 1)\IconImg
|
||||
AppRegistry(j)\Proc = AppRegistry(j + 1)\Proc
|
||||
!desktop$a_AppRegistry.array[v_j]._Proc = desktop$a_AppRegistry.array[v_j + 1]._Proc;
|
||||
Next
|
||||
AppRegistry(_AppCount - 1)\Name = ""
|
||||
AppRegistry(_AppCount - 1)\ID = ""
|
||||
AppRegistry(_AppCount - 1)\IconImg = 0
|
||||
AppRegistry(_AppCount - 1)\Proc = 0
|
||||
!desktop$a_AppRegistry.array[desktop$g__appcount]._Proc = 0;
|
||||
_AppCount - 1
|
||||
_RebuildMenu()
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
Next
|
||||
EndProcedure
|
||||
|
||||
;- Private procedures
|
||||
Procedure _MakeIconImage(Label.s, Size = #Icon_Size, Color = 0)
|
||||
Protected Img
|
||||
|
||||
Img = CreateImage(#PB_Any, Size, Size, 32, RGBA(0, 0, 0, 0))
|
||||
If Not IsImage(Img) : ProcedureReturn 0 : EndIf
|
||||
If StartVectorDrawing(ImageVectorOutput(Img))
|
||||
VectorFont(IconFont, Size * 0.65)
|
||||
If Color = 0
|
||||
VectorSourceColor(Color_Icon)
|
||||
Else
|
||||
VectorSourceColor(Color)
|
||||
EndIf
|
||||
|
||||
;MovePathCursor((Size - VectorTextWidth(Label)) / 2, (Size - VectorTextHeight(Label)) / 2)
|
||||
;In 3.20 DrawVectorText() draws vertically centered?
|
||||
MovePathCursor((Size - VectorTextWidth(Label)) / 2, Size - (VectorTextHeight(Label) / 2))
|
||||
DrawVectorText(Label)
|
||||
StopVectorDrawing()
|
||||
EndIf
|
||||
ProcedureReturn Img
|
||||
EndProcedure
|
||||
|
||||
Procedure _MenuHeight()
|
||||
Protected RightH = #Menu_Header_H + _AppCount * #Menu_Row_H + 8
|
||||
Protected MinH = 2 * #Menu_Row_H + 16 ; always room for both rail shortcuts
|
||||
If RightH < MinH : ProcedureReturn MinH : EndIf
|
||||
ProcedureReturn RightH
|
||||
EndProcedure
|
||||
|
||||
; Returns app index (>=0), #Hit_Settings, #Hit_Logout, or #Hit_None.
|
||||
Procedure _HitTest(MX, MY)
|
||||
Protected H, LogoutY, SettingsY, RY
|
||||
|
||||
H = _MenuHeight()
|
||||
If MX < #Menu_Rail_W
|
||||
; Left rail — system shortcuts are bottom-anchored
|
||||
LogoutY = H - #Menu_Row_H
|
||||
SettingsY = H - 2 * #Menu_Row_H
|
||||
If MY >= SettingsY And MY < LogoutY
|
||||
ProcedureReturn #Hit_Settings
|
||||
ElseIf MY >= LogoutY And MY < H
|
||||
ProcedureReturn #Hit_Logout
|
||||
EndIf
|
||||
Else
|
||||
; Right panel — app rows below header
|
||||
RY = MY - #Menu_Header_H
|
||||
If RY >= 0 And RY < _AppCount * #Menu_Row_H
|
||||
ProcedureReturn RY / #Menu_Row_H
|
||||
EndIf
|
||||
EndIf
|
||||
ProcedureReturn #Hit_None
|
||||
EndProcedure
|
||||
|
||||
Procedure _RebuildMenu()
|
||||
Protected H = _MenuHeight()
|
||||
If IsWindow(StartMenuWindow) : ResizeWindow(StartMenuWindow, #PB_Ignore, #PB_Ignore, #Menu_W, H) : EndIf
|
||||
If IsGadget(_MenuCanvas) : ResizeGadget(_MenuCanvas, 0, 0, #Menu_W, H) : EndIf
|
||||
_DrawMenu()
|
||||
EndProcedure
|
||||
|
||||
Procedure _DrawMenu()
|
||||
If Not IsGadget(_MenuCanvas) : ProcedureReturn : EndIf
|
||||
If Not StartDrawing(CanvasOutput(_MenuCanvas)) : ProcedureReturn : EndIf
|
||||
|
||||
Protected W = OutputWidth()
|
||||
Protected H = OutputHeight()
|
||||
Protected TH, IX, IY, i, Y
|
||||
|
||||
; ── Left rail ────────────────────────────────────────────────────────
|
||||
Box(0, 0, #Menu_Rail_W, H, Color_Menu_Rail)
|
||||
|
||||
Protected SettingsY = H - 2 * #Menu_Row_H
|
||||
Protected LogoutY = H - #Menu_Row_H
|
||||
|
||||
If _MenuHover = #Hit_Settings
|
||||
Box(0, SettingsY, #Menu_Rail_W, #Menu_Row_H, Color_Menu_Hover)
|
||||
EndIf
|
||||
If _MenuHover = #Hit_Logout
|
||||
Box(0, LogoutY, #Menu_Rail_W, #Menu_Row_H, Color_Logout_Hover)
|
||||
EndIf
|
||||
|
||||
If IsImage(_IconSettings)
|
||||
IX = (#Menu_Rail_W - #Menu_Icon_Size) / 2
|
||||
IY = SettingsY + (#Menu_Row_H - #Menu_Icon_Size) / 2
|
||||
DrawAlphaImage(ImageID(_IconSettings), IX, IY)
|
||||
EndIf
|
||||
If IsImage(_IconLogout)
|
||||
IX = (#Menu_Rail_W - #Menu_Icon_Size) / 2
|
||||
IY = LogoutY + (#Menu_Row_H - #Menu_Icon_Size) / 2
|
||||
DrawAlphaImage(ImageID(_IconLogout), IX, IY)
|
||||
EndIf
|
||||
|
||||
; Separator between rail and right panel
|
||||
Box(#Menu_Rail_W, 0, 1, H, Color_Menu_Sep)
|
||||
|
||||
; ── Right panel ──────────────────────────────────────────────────────
|
||||
Box(#Menu_Rail_W + 1, 0, W - #Menu_Rail_W - 1, H, Color_Menu_Bg)
|
||||
|
||||
; Header
|
||||
Box(#Menu_Rail_W + 1, 0, W - #Menu_Rail_W - 1, #Menu_Header_H, Color_Menu_Header)
|
||||
DrawingMode(#PB_2DDrawing_Transparent)
|
||||
If IsFont(MenuFont) : DrawingFont(FontID(MenuFont)) : EndIf
|
||||
TH = TextHeight("A")
|
||||
DrawText(#Menu_Rail_W + 14, (#Menu_Header_H - TH) / 2, "Apps", Color_Menu_Dim)
|
||||
|
||||
; App rows
|
||||
Y = #Menu_Header_H
|
||||
For i = 0 To _AppCount - 1
|
||||
If _MenuHover = i
|
||||
DrawingMode(#PB_2DDrawing_Default)
|
||||
Box(#Menu_Rail_W + 1, Y, W - #Menu_Rail_W - 1, #Menu_Row_H, Color_Menu_Hover)
|
||||
EndIf
|
||||
If IsImage(AppRegistry(i)\IconImg)
|
||||
IX = #Menu_Rail_W + 12
|
||||
IY = Y + (#Menu_Row_H - #Menu_Icon_Size) / 2
|
||||
DrawAlphaImage(ImageID(AppRegistry(i)\IconImg), IX, IY)
|
||||
EndIf
|
||||
DrawingMode(#PB_2DDrawing_Transparent)
|
||||
TH = TextHeight("A")
|
||||
DrawText(#Menu_Rail_W + 12 + #Menu_Icon_Size + 8,
|
||||
Y + (#Menu_Row_H - TH) / 2,
|
||||
AppRegistry(i)\Name, Color_Menu_Text)
|
||||
Y + #Menu_Row_H
|
||||
Next
|
||||
|
||||
StopDrawing()
|
||||
EndProcedure
|
||||
|
||||
Procedure _CloseMenu()
|
||||
HideWindow(StartMenuWindow, #True)
|
||||
_MenuHover = #Hit_None
|
||||
_DrawMenu()
|
||||
EndProcedure
|
||||
|
||||
Procedure _FindByWindow(Win)
|
||||
ForEach WindowManager()
|
||||
If WindowManager()\Window = Win : ProcedureReturn #True : EndIf
|
||||
Next
|
||||
EndProcedure
|
||||
|
||||
Procedure _FindByButton(Btn)
|
||||
ForEach WindowManager()
|
||||
If WindowManager()\Button = Btn : ProcedureReturn #True : EndIf
|
||||
Next
|
||||
EndProcedure
|
||||
|
||||
Procedure _DrawButton()
|
||||
Protected Active, W, H
|
||||
|
||||
Active = Bool(WindowManager()\Window = _ActiveWindow And _ActiveWindow <> 0)
|
||||
If Not IsGadget(WindowManager()\Button) : ProcedureReturn : EndIf
|
||||
If StartDrawing(CanvasOutput(WindowManager()\Button))
|
||||
W = OutputWidth()
|
||||
H = OutputHeight()
|
||||
If Active
|
||||
Box(0, 0, W, H, Color_Bar_Active)
|
||||
Box(0, H / 4, 3, H / 2, Color_Accent)
|
||||
Else
|
||||
Box(0, 0, W, H, Color_Bar_Bg)
|
||||
EndIf
|
||||
If IsImage(WindowManager()\Icon)
|
||||
DrawAlphaImage(ImageID(WindowManager()\Icon), (W - #Icon_Size) / 2, (H - #Icon_Size) / 2)
|
||||
EndIf
|
||||
StopDrawing()
|
||||
EndIf
|
||||
EndProcedure
|
||||
|
||||
Procedure _SetActiveButton()
|
||||
ForEach WindowManager()
|
||||
_DrawButton()
|
||||
Next
|
||||
EndProcedure
|
||||
|
||||
Procedure _RebuildButtons()
|
||||
ForEach WindowManager()
|
||||
ResizeGadget(WindowManager()\Button, 0, #Taskbar_ItemHeight + (ListIndex(WindowManager()) * #Taskbar_ItemHeight), #Taskbar_Width, #Taskbar_ItemHeight)
|
||||
_DrawButton()
|
||||
Next
|
||||
EndProcedure
|
||||
|
||||
Procedure _LoadInstalledAppsCallback(Success, DataString.s)
|
||||
Protected Root, Total, Item, ManiNode, PermNode, PermCount, i, j
|
||||
Protected AppID.s, Icon.s, Perms.s, ManiStr.s
|
||||
|
||||
If Not Success Or Not ParseJSON(0, DataString) : ProcedureReturn : EndIf
|
||||
Root = JSONValue(0)
|
||||
Total = JSONArraySize(Root)
|
||||
|
||||
For i = 0 To Total - 1
|
||||
Item = GetJSONElement(Root, i)
|
||||
ManiNode = GetJSONMember(Item, "manifest")
|
||||
AppID = GetJSONString(GetJSONMember(Item, "app_id"))
|
||||
Icon = GetJSONString(GetJSONMember(ManiNode, "icon"))
|
||||
|
||||
PermNode = GetJSONMember(Item, "permissions")
|
||||
PermCount = JSONArraySize(PermNode)
|
||||
Perms = "["
|
||||
For j = 0 To PermCount - 1
|
||||
If j > 0 : Perms + "," : EndIf
|
||||
Perms + ~"\"" + GetJSONString(GetJSONElement(PermNode, j)) + ~"\""
|
||||
Next
|
||||
Perms + "]"
|
||||
|
||||
; Re-serialise the manifest object to a JSON string for InstallThirdPartyApp
|
||||
ManiStr = "{" +
|
||||
~"\"id\":\"" + GetJSONString(GetJSONMember(ManiNode, "id")) + ~"\"," +
|
||||
~"\"name\":\"" + GetJSONString(GetJSONMember(ManiNode, "name")) + ~"\"," +
|
||||
~"\"version\":\"" + GetJSONString(GetJSONMember(ManiNode, "version")) + ~"\"," +
|
||||
~"\"icon\":\"" + ReplaceString(Icon, ~"\"", ~"\\\"") + ~"\"," +
|
||||
~"\"entry\":\"" + GetJSONString(GetJSONMember(ManiNode, "entry")) + ~"\"}"
|
||||
|
||||
InstallThirdPartyApp(AppID, ManiStr, Perms, Icon)
|
||||
Next
|
||||
FreeJSON(0)
|
||||
EndProcedure
|
||||
|
||||
;- Event handlers
|
||||
Procedure Handler_Resize()
|
||||
Protected Width = DesktopWidth(0)
|
||||
Protected Height = DesktopHeight(0)
|
||||
ResizeWindow(TaskBarWindow, 0, 0, #Taskbar_Width, Height)
|
||||
ResizeGadget(ClockLabel, 0, Height - #Taskbar_ItemHeight, #Taskbar_Width, #Taskbar_ItemHeight)
|
||||
EndProcedure
|
||||
|
||||
Procedure Handler_Clock()
|
||||
SetGadgetText(ClockLabel, FormatDate("%hh:%ii:%ss", Date()))
|
||||
EndProcedure
|
||||
|
||||
Procedure Handler_StartButton()
|
||||
HideWindow(StartMenuWindow, #False)
|
||||
SetActiveWindow(StartMenuWindow)
|
||||
EndProcedure
|
||||
|
||||
Procedure Handler_StartMenu_Focus()
|
||||
_CloseMenu()
|
||||
EndProcedure
|
||||
|
||||
Procedure Handler_Logout()
|
||||
HTTPRequest(#PB_HTTP_Post, "/api/auth/logout", "", @LogoutCallback())
|
||||
EndProcedure
|
||||
|
||||
Procedure LogoutCallback(Success, Response.s)
|
||||
!location.reload()
|
||||
EndProcedure
|
||||
|
||||
Procedure Handler_MenuCanvas()
|
||||
Protected EType, MX, MY, Hit
|
||||
|
||||
EType = EventType()
|
||||
MX = GetGadgetAttribute(_MenuCanvas, #PB_Canvas_MouseX)
|
||||
MY = GetGadgetAttribute(_MenuCanvas, #PB_Canvas_MouseY)
|
||||
Hit = _HitTest(MX, MY)
|
||||
|
||||
Select EType
|
||||
Case #PB_EventType_MouseMove
|
||||
If Hit <> _MenuHover
|
||||
_MenuHover = Hit
|
||||
_DrawMenu()
|
||||
EndIf
|
||||
|
||||
Case #PB_EventType_MouseLeave
|
||||
If _MenuHover <> #Hit_None
|
||||
_MenuHover = #Hit_None
|
||||
_DrawMenu()
|
||||
EndIf
|
||||
|
||||
Case #PB_EventType_LeftButtonUp
|
||||
Select Hit
|
||||
Case #Hit_Settings
|
||||
_CloseMenu()
|
||||
!settings$f_open();
|
||||
|
||||
Case #Hit_Logout
|
||||
_CloseMenu()
|
||||
Handler_Logout()
|
||||
|
||||
Default
|
||||
If Hit >= 0 And Hit < _AppCount And AppRegistry(Hit)\Proc <> 0
|
||||
_CloseMenu()
|
||||
!desktop$a_AppRegistry.array[v_hit]._Proc();
|
||||
EndIf
|
||||
EndSelect
|
||||
EndSelect
|
||||
EndProcedure
|
||||
|
||||
Procedure Handler_TaskbarButton()
|
||||
Protected Btn, Win
|
||||
If EventType() <> #PB_EventType_LeftButtonUp : ProcedureReturn : EndIf
|
||||
Btn = EventGadget()
|
||||
Win = GetGadgetData(Btn)
|
||||
If Not IsWindow(Win) : ProcedureReturn : EndIf
|
||||
If _ActiveWindow = Win
|
||||
HideWindow(Win, #True)
|
||||
_ActiveWindow = 0
|
||||
Else
|
||||
HideWindow(Win, #False)
|
||||
SetActiveWindow(Win)
|
||||
_ActiveWindow = Win
|
||||
EndIf
|
||||
_SetActiveButton()
|
||||
EndProcedure
|
||||
|
||||
Procedure Handler_AppClose()
|
||||
Protected Win = EventWindow()
|
||||
If Not _FindByWindow(Win) : ProcedureReturn : EndIf
|
||||
UnbindEvent(#PB_Event_CloseWindow, @Handler_AppClose(), Win)
|
||||
UnbindEvent(#PB_Event_ActivateWindow, @Handler_AppActivate(), Win)
|
||||
UnbindGadgetEvent(WindowManager()\Button, @Handler_TaskbarButton())
|
||||
FreeGadget(WindowManager()\Button)
|
||||
DeleteElement(WindowManager())
|
||||
If _ActiveWindow = Win : _ActiveWindow = GetActiveWindow() : EndIf
|
||||
_RebuildButtons()
|
||||
CloseWindow(Win)
|
||||
EndProcedure
|
||||
|
||||
Procedure Handler_AppActivate()
|
||||
Protected Win = EventWindow()
|
||||
If Win = TaskBarWindow : ProcedureReturn : EndIf
|
||||
_ActiveWindow = Win
|
||||
_SetActiveButton()
|
||||
EndProcedure
|
||||
|
||||
EndModule
|
||||
|
||||
; IDE Options = SpiderBasic 3.20 (Windows - x86)
|
||||
; CursorPosition = 95
|
||||
; FirstLine = 82
|
||||
; Folding = BAAAg
|
||||
; iOSAppOrientation = 0
|
||||
; AndroidAppCode = 0
|
||||
; AndroidAppOrientation = 0
|
||||
; EnableXP
|
||||
; DPIAware
|
||||
; CompileSourceDirectory
|
||||
251
Client/Includes/FS.sbi
Normal file
@ -0,0 +1,251 @@
|
||||
Module FS
|
||||
EnableExplicit
|
||||
|
||||
;- Globals
|
||||
; Pending operation state
|
||||
; Safe because JS is single-threaded — one Read_ and one Write in flight at most.
|
||||
Global _R_ID.s, _R_Path.s, _R_Content.s, *_R_Cb
|
||||
Global _W_ID.s, _W_Path.s, _W_Content.s, *_W_Cb
|
||||
|
||||
;- Private declarations
|
||||
Declare _FindLastSlash(Path.s)
|
||||
Declare _ReadExistsCallback(Success, DataString.s)
|
||||
Declare _ReadCachedCallback(Success, DataString.s)
|
||||
Declare _ReadServerCallback(Success, DataString.s)
|
||||
Declare _ReadCacheStoreCallback(Success, DataString.s)
|
||||
Declare _WriteCacheCallback(Success, DataString.s)
|
||||
Declare _WriteServerCallback(Success, DataString.s)
|
||||
|
||||
;- Public procedures
|
||||
|
||||
; List directory contents.
|
||||
; DataString = JSON array of {id, name, is_dir, mime_type, size, modified_at}
|
||||
Procedure List(Path.s, *Callback)
|
||||
HTTPRequest(#PB_HTTP_Get, "/api/fs/list?path=" + URLEncoder(Path, #PB_UTF8), "", *Callback)
|
||||
EndProcedure
|
||||
|
||||
; Stat a single node.
|
||||
; DataString = JSON object with id, name, is_dir, size, etc. or error.
|
||||
Procedure Stat(Path.s, *Callback)
|
||||
HTTPRequest(#PB_HTTP_Get, "/api/fs/stat?path=" + URLEncoder(Path, #PB_UTF8), "", *Callback)
|
||||
EndProcedure
|
||||
|
||||
; Read file content. Cache-first: if the file is in IndexedDB, returns it
|
||||
; immediately without a server round-trip. Otherwise fetches from server
|
||||
; and populates the cache for next time.
|
||||
; FileID = string form of the numeric node id (from Stat or List).
|
||||
; Path = virtual path, stored in cache meta for Sync to use later.
|
||||
Procedure Read_(FileID.s, Path.s, *Callback)
|
||||
_R_ID = FileID
|
||||
_R_Path = Path
|
||||
*_R_Cb = *Callback
|
||||
FileCache::Exists(FileID, @_ReadExistsCallback())
|
||||
EndProcedure
|
||||
|
||||
; Write content. Hits the cache immediately (dirty), fires the callback,
|
||||
; then syncs to the server best-effort in the background.
|
||||
; If the server write fails the file stays dirty — Sync() will retry it.
|
||||
Procedure Write(FileID.s, Path.s, Content.s, *Callback)
|
||||
_W_ID = FileID
|
||||
_W_Path = Path
|
||||
_W_Content = Content
|
||||
*_W_Cb = *Callback
|
||||
FileCache::Write(FileID, Content, @_WriteCacheCallback())
|
||||
EndProcedure
|
||||
|
||||
; Create a directory.
|
||||
; DataString = JSON {success:true, id:N} or error.
|
||||
Procedure Mkdir(Path.s, *Callback)
|
||||
HTTPRequest(#PB_HTTP_Post, "/api/fs/mkdir", "path=" + URLEncoder(Path, #PB_UTF8), *Callback)
|
||||
EndProcedure
|
||||
|
||||
; Delete a node by ID. Evicts from cache too.
|
||||
; DataString = JSON {success:true} or error.
|
||||
Procedure Delete_(FileID.s, *Callback)
|
||||
FileCache::Evict(FileID, #Null) ; best-effort, don't wait
|
||||
HTTPRequest(#PB_HTTP_Post, "/api/fs/delete", "id=" + FileID, *Callback)
|
||||
EndProcedure
|
||||
|
||||
; Move/rename a node by ID.
|
||||
; DataString = JSON {success:true} or error.
|
||||
Procedure Move(FileID.s, NewParentID.s, NewName.s, *Callback)
|
||||
HTTPRequest(#PB_HTTP_Post, "/api/fs/move", "id=" + FileID + "&to_parent_id=" + NewParentID + "&name=" + URLEncoder(NewName, #PB_UTF8), *Callback)
|
||||
EndProcedure
|
||||
|
||||
; Push all dirty cached files to the server sequentially.
|
||||
Procedure Sync(*Callback)
|
||||
!var _cb = p_callback;
|
||||
!var _db = window._kumos_idb;
|
||||
!if (!_db) { if (_cb) _cb(0, 'IDB not open'); return; }
|
||||
!
|
||||
!// Collect dirty entries from file_meta
|
||||
!var tx = _db.transaction(['file_meta'], 'readonly');
|
||||
!var store = tx.objectStore('file_meta');
|
||||
!var req = store.openCursor();
|
||||
!var dirty = [];
|
||||
!
|
||||
!req.onsuccess = function(ev) {
|
||||
! var cursor = ev.target.result;
|
||||
! if (cursor) {
|
||||
! try {
|
||||
! var meta = JSON.parse(cursor.value);
|
||||
! if (meta.dirty) dirty.push({ id: String(cursor.key), path: meta.path });
|
||||
! } catch(e) {}
|
||||
! cursor.continue();
|
||||
! }
|
||||
!};
|
||||
!
|
||||
!tx.oncomplete = function() {
|
||||
! if (dirty.length === 0) {
|
||||
! if (_cb) _cb(1, JSON.stringify({ synced: 0, failed: 0 }));
|
||||
! return;
|
||||
! }
|
||||
!
|
||||
! var synced = 0, failed = 0, total = dirty.length;
|
||||
!
|
||||
! function markClean(id, onDone) {
|
||||
! var wtx = _db.transaction(['file_meta'], 'readwrite');
|
||||
! var ws = wtx.objectStore('file_meta');
|
||||
! var gr = ws.get(id);
|
||||
! gr.onsuccess = function(ev) {
|
||||
! var m = {};
|
||||
! try { m = JSON.parse(ev.target.result || '{}'); } catch(e) {}
|
||||
! m.dirty = false;
|
||||
! ws.put(JSON.stringify(m), id);
|
||||
! };
|
||||
! wtx.oncomplete = onDone;
|
||||
! wtx.onerror = onDone;
|
||||
! }
|
||||
!
|
||||
! function syncNext(i) {
|
||||
! if (i >= total) {
|
||||
! if (_cb) _cb(failed === 0 ? 1 : 0,
|
||||
! JSON.stringify({ synced: synced, failed: failed }));
|
||||
! return;
|
||||
! }
|
||||
! var entry = dirty[i];
|
||||
!
|
||||
! // Read content from IDB
|
||||
! var rtx = _db.transaction(['file_content'], 'readonly');
|
||||
! var rreq = rtx.objectStore('file_content').get(entry.id);
|
||||
!
|
||||
! rreq.onsuccess = function(ev) {
|
||||
! var content = ev.target.result !== undefined ? String(ev.target.result) : '';
|
||||
!
|
||||
! // POST to server
|
||||
! fetch('/api/fs/write', {
|
||||
! method: 'POST',
|
||||
! headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
||||
! body: 'path=' + encodeURIComponent(entry.path) +
|
||||
! '&content=' + encodeURIComponent(content)
|
||||
! })
|
||||
! .then(function(r) { return r.json(); })
|
||||
! .then(function(json) {
|
||||
! if (json.success) {
|
||||
! markClean(entry.id, function() { synced++; syncNext(i + 1); });
|
||||
! } else {
|
||||
! failed++; syncNext(i + 1);
|
||||
! }
|
||||
! })
|
||||
! .catch(function() { failed++; syncNext(i + 1); });
|
||||
! };
|
||||
!
|
||||
! rreq.onerror = function() { failed++; syncNext(i + 1); };
|
||||
! }
|
||||
!
|
||||
! syncNext(0);
|
||||
!};
|
||||
!
|
||||
!tx.onerror = function(e) {
|
||||
! if (_cb) _cb(0, e.target.error ? e.target.error.message : 'sync scan failed');
|
||||
!};
|
||||
EndProcedure
|
||||
|
||||
Procedure.s GetFilePart(Path.s)
|
||||
Protected Last = _FindLastSlash(Path)
|
||||
If Last = 0 : ProcedureReturn Path : EndIf
|
||||
ProcedureReturn Mid(Path, Last + 1)
|
||||
EndProcedure
|
||||
|
||||
Procedure.s GetPathPart(Path.s)
|
||||
Protected Last = _FindLastSlash(Path)
|
||||
If Last = 0 : ProcedureReturn "/" : EndIf ; no slash — return root
|
||||
ProcedureReturn Left(Path, Last) ; includes the trailing slash
|
||||
EndProcedure
|
||||
|
||||
;- Private procedures
|
||||
|
||||
Procedure _FindLastSlash(Path.s)
|
||||
Protected Pos, Last
|
||||
Pos = FindString(Path, "/")
|
||||
While Pos > 0
|
||||
Last = Pos
|
||||
Pos = FindString(Path, "/", Pos + 1)
|
||||
Wend
|
||||
ProcedureReturn Last
|
||||
EndProcedure
|
||||
|
||||
Procedure _ReadExistsCallback(Success, DataString.s)
|
||||
Debug "Exists → Success=" + Success + " Data=" + DataString
|
||||
If Success And DataString = "1"
|
||||
; Cache hit — return directly
|
||||
FileCache::Read_(_R_ID, @_ReadCachedCallback())
|
||||
Else
|
||||
; Cache miss — fetch from server
|
||||
HTTPRequest(#PB_HTTP_Get, "/api/fs/read?id=" + _R_ID, "", @_ReadServerCallback())
|
||||
EndIf
|
||||
EndProcedure
|
||||
|
||||
Procedure _ReadCachedCallback(Success, DataString.s)
|
||||
If *_R_Cb
|
||||
!fs$g__r_cb(v_success, v_datastring);
|
||||
EndIf
|
||||
EndProcedure
|
||||
|
||||
Procedure _ReadServerCallback(Success, DataString.s)
|
||||
If Success
|
||||
_R_Content = DataString
|
||||
FileCache::Cache(_R_ID, _R_Path, DataString, @_ReadCacheStoreCallback())
|
||||
Else
|
||||
!fs$g__r_cb(0, v_datastring);
|
||||
EndIf
|
||||
EndProcedure
|
||||
|
||||
Procedure _ReadCacheStoreCallback(Success, DataString.s)
|
||||
Protected Content.s = _R_Content
|
||||
If *_R_Cb
|
||||
!fs$g__r_cb(1, v_content);
|
||||
EndIf
|
||||
EndProcedure
|
||||
|
||||
Procedure _WriteCacheCallback(Success, DataString.s)
|
||||
If *_W_Cb
|
||||
!fs$g__w_cb(v_success, v_datastring);
|
||||
EndIf
|
||||
If Success
|
||||
HTTPRequest(#PB_HTTP_Post, "/api/fs/write", "path=" + URLEncoder(_W_Path, #PB_UTF8) + "&content=" + URLEncoder(_W_Content, #PB_UTF8), @_WriteServerCallback())
|
||||
EndIf
|
||||
EndProcedure
|
||||
|
||||
Procedure _WriteServerCallback(Success, DataString.s)
|
||||
If Success
|
||||
If ParseJSON(0, DataString)
|
||||
If GetJSONBoolean(GetJSONMember(JSONValue(0), "success"))
|
||||
FileCache::MarkClean(_W_ID, #Null)
|
||||
EndIf
|
||||
FreeJSON(0)
|
||||
EndIf
|
||||
EndIf
|
||||
EndProcedure
|
||||
|
||||
EndModule
|
||||
|
||||
; IDE Options = SpiderBasic 3.20 (Windows - x86)
|
||||
; CursorPosition = 21
|
||||
; Folding = BAA-
|
||||
; iOSAppOrientation = 0
|
||||
; AndroidAppCode = 0
|
||||
; AndroidAppOrientation = 0
|
||||
; EnableXP
|
||||
; DPIAware
|
||||
; CompileSourceDirectory
|
||||
166
Client/Includes/FileCache.sbi
Normal file
@ -0,0 +1,166 @@
|
||||
Module FileCache
|
||||
EnableExplicit
|
||||
|
||||
;- Constants
|
||||
; Store names (also used in IDB::Init in General.sbi)
|
||||
#Store_Content = "file_content"
|
||||
#Store_Meta = "file_meta"
|
||||
|
||||
; Metadata JSON shape:
|
||||
; { "path": "/home/alice/doc.txt", "dirty": false, "cached_at": 1234567890, "size": 42 }
|
||||
|
||||
;- Public procedures
|
||||
|
||||
; Store a file fetched from the server into the cache.
|
||||
; Writes content and meta atomically in one transaction.
|
||||
Procedure Cache(FileID.s, Path.s, Content.s, *Callback)
|
||||
!var _cb = p_callback;
|
||||
!var _id = v_fileid;
|
||||
!var _path = v_path;
|
||||
!var _content = v_content;
|
||||
!var _db = window._kumos_idb;
|
||||
!if (!_db) { if (_cb) _cb(0, 'IDB not open'); return; }
|
||||
!
|
||||
!var tx = _db.transaction(['file_content','file_meta'], 'readwrite');
|
||||
!var contentStore = tx.objectStore('file_content');
|
||||
!var metaStore = tx.objectStore('file_meta');
|
||||
!
|
||||
!var meta = JSON.stringify({
|
||||
! path: _path,
|
||||
! dirty: false,
|
||||
! cached_at: Date.now(),
|
||||
! size: _content.length
|
||||
!});
|
||||
!
|
||||
!contentStore.put(_content, _id).onerror = function(e) { tx.abort(); };
|
||||
!metaStore.put(meta, _id).onerror = function(e) { tx.abort(); };
|
||||
!
|
||||
!tx.oncomplete = function() { if (_cb) _cb(1, ''); };
|
||||
!tx.onerror = function(e) { if (_cb) _cb(0, e.target.error ? e.target.error.message : 'cache failed'); };
|
||||
!tx.onabort = function(e) { if (_cb) _cb(0, 'cache aborted'); };
|
||||
EndProcedure
|
||||
|
||||
; Read cached content. Data = raw file content string.
|
||||
; Data = "" if file is not in cache (Success is still #True).
|
||||
Procedure Read_(FileID.s, *Callback)
|
||||
IDB::Get(#Store_Content, FileID, *Callback)
|
||||
EndProcedure
|
||||
|
||||
; Write updated content to the cache and mark the file dirty.
|
||||
; Patches meta without replacing path or other fields.
|
||||
Procedure Write(FileID.s, Content.s, *Callback)
|
||||
!var _cb = p_callback;
|
||||
!var _id = v_fileid;
|
||||
!var _content = v_content;
|
||||
!var _db = window._kumos_idb;
|
||||
!if (!_db) { if (_cb) _cb(0, 'IDB not open'); return; }
|
||||
!
|
||||
!var tx = _db.transaction(['file_content','file_meta'], 'readwrite');
|
||||
!var contentStore = tx.objectStore('file_content');
|
||||
!var metaStore = tx.objectStore('file_meta');
|
||||
!
|
||||
!contentStore.put(_content, _id);
|
||||
!
|
||||
!var getReq = metaStore.get(_id);
|
||||
!getReq.onsuccess = function(ev) {
|
||||
! var meta = {};
|
||||
! try { meta = JSON.parse(ev.target.result || '{}'); } catch(e) {}
|
||||
! meta.dirty = true;
|
||||
! meta.size = _content.length;
|
||||
! meta.cached_at = Date.now();
|
||||
! metaStore.put(JSON.stringify(meta), _id);
|
||||
!};
|
||||
!
|
||||
!tx.oncomplete = function() { if (_cb) _cb(1, ''); };
|
||||
!tx.onerror = function(e) { if (_cb) _cb(0, e.target.error ? e.target.error.message : 'write failed'); };
|
||||
EndProcedure
|
||||
|
||||
; Get the metadata JSON string for a cached file.
|
||||
Procedure GetMeta(FileID.s, *Callback)
|
||||
IDB::Get(#Store_Meta, FileID, *Callback)
|
||||
EndProcedure
|
||||
|
||||
; Mark a cached file as clean after a successful sync to the server.
|
||||
Procedure MarkClean(FileID.s, *Callback)
|
||||
!var _cb = p_callback;
|
||||
!var _id = v_fileid;
|
||||
!var _db = window._kumos_idb;
|
||||
!if (!_db) { if (_cb) _cb(0, 'IDB not open'); return; }
|
||||
!
|
||||
!var tx = _db.transaction(['file_meta'], 'readwrite');
|
||||
!var store = tx.objectStore('file_meta');
|
||||
!var req = store.get(_id);
|
||||
!req.onsuccess = function(ev) {
|
||||
! var meta = {};
|
||||
! try { meta = JSON.parse(ev.target.result || '{}'); } catch(e) {}
|
||||
! meta.dirty = false;
|
||||
! store.put(JSON.stringify(meta), _id);
|
||||
!};
|
||||
!
|
||||
!tx.oncomplete = function() { if (_cb) _cb(1, ''); };
|
||||
!tx.onerror = function(e) { if (_cb) _cb(0, e.target.error ? e.target.error.message : 'markclean failed'); };
|
||||
EndProcedure
|
||||
|
||||
; Remove a file from the cache entirely (both content and meta).
|
||||
Procedure Evict(FileID.s, *Callback)
|
||||
!var _cb = p_callback;
|
||||
!var _id = v_fileid;
|
||||
!var _db = window._kumos_idb;
|
||||
!if (!_db) { if (_cb) _cb(0, 'IDB not open'); return; }
|
||||
!
|
||||
!var tx = _db.transaction(['file_content','file_meta'], 'readwrite');
|
||||
!tx.objectStore('file_content').delete(_id);
|
||||
!tx.objectStore('file_meta').delete(_id);
|
||||
!
|
||||
!tx.oncomplete = function() { if (_cb) _cb(1, ''); };
|
||||
!tx.onerror = function(e) { if (_cb) _cb(0, e.target.error ? e.target.error.message : 'evict failed'); };
|
||||
EndProcedure
|
||||
|
||||
; Return all cached file IDs as a JSON array.
|
||||
Procedure ListCached(*Callback)
|
||||
IDB::GetAllKeys(#Store_Meta, *Callback)
|
||||
EndProcedure
|
||||
|
||||
; Return only the dirty file IDs as a JSON array.
|
||||
; These are files that have been written locally but not yet synced.
|
||||
Procedure ListDirty(*Callback)
|
||||
!var _cb = p_callback;
|
||||
!var _db = window._kumos_idb;
|
||||
!if (!_db) { if (_cb) _cb(0, 'IDB not open'); return; }
|
||||
!
|
||||
!var tx = _db.transaction(['file_meta'], 'readonly');
|
||||
!var store = tx.objectStore('file_meta');
|
||||
!var req = store.openCursor();
|
||||
!var dirty = [];
|
||||
!
|
||||
!req.onsuccess = function(ev) {
|
||||
! var cursor = ev.target.result;
|
||||
! if (cursor) {
|
||||
! try {
|
||||
! var meta = JSON.parse(cursor.value);
|
||||
! if (meta.dirty) dirty.push(String(cursor.key));
|
||||
! } catch(e) {}
|
||||
! cursor.continue();
|
||||
! }
|
||||
!};
|
||||
!
|
||||
!tx.oncomplete = function() { if (_cb) _cb(1, JSON.stringify(dirty)); };
|
||||
!tx.onerror = function(e) { if (_cb) _cb(0, e.target.error ? e.target.error.message : 'listdirty failed'); };
|
||||
EndProcedure
|
||||
|
||||
; Returns "1" if the file is in the cache, "0" if not.
|
||||
Procedure Exists(FileID.s, *Callback)
|
||||
IDB::Exists(#Store_Meta, FileID, *Callback)
|
||||
EndProcedure
|
||||
|
||||
EndModule
|
||||
|
||||
; IDE Options = SpiderBasic 3.20 (Windows - x86)
|
||||
; CursorPosition = 156
|
||||
; Folding = Bw
|
||||
; iOSAppOrientation = 0
|
||||
; AndroidAppCode = 0
|
||||
; AndroidAppOrientation = 0
|
||||
; EnableXP
|
||||
; DPIAware
|
||||
; CompileSourceDirectory
|
||||
48
Client/Includes/General.sbi
Normal file
@ -0,0 +1,48 @@
|
||||
Module General
|
||||
EnableExplicit
|
||||
|
||||
Procedure CheckCallback(Success, Response.s)
|
||||
Protected Authenticated, Root
|
||||
Protected Username.s
|
||||
|
||||
If Success
|
||||
If ParseJSON(0, Response)
|
||||
Root = JSONValue(0)
|
||||
Authenticated = GetJSONBoolean(GetJSONMember(Root, "authenticated"))
|
||||
If Authenticated
|
||||
Username = GetJSONString(GetJSONMember(Root, "username"))
|
||||
EndIf
|
||||
FreeJSON(0)
|
||||
EndIf
|
||||
EndIf
|
||||
|
||||
If Authenticated And Username <> ""
|
||||
Desktop::Open(Username)
|
||||
Else
|
||||
Login::Open()
|
||||
EndIf
|
||||
EndProcedure
|
||||
|
||||
Procedure IDBCallback(Success, DataString.s)
|
||||
If Success
|
||||
HTTPRequest(#PB_HTTP_Get, "/api/auth/check", "", @CheckCallback())
|
||||
Else
|
||||
Debug "IDB Init failed: " + DataString
|
||||
EndIf
|
||||
EndProcedure
|
||||
|
||||
Procedure Init()
|
||||
IDB::Init("kumos", 1, "file_content,file_meta", @IDBCallback())
|
||||
EndProcedure
|
||||
|
||||
EndModule
|
||||
|
||||
; IDE Options = SpiderBasic 3.20 (Windows - x86)
|
||||
; CursorPosition = 38
|
||||
; Folding = -
|
||||
; iOSAppOrientation = 0
|
||||
; AndroidAppCode = 0
|
||||
; AndroidAppOrientation = 0
|
||||
; EnableXP
|
||||
; DPIAware
|
||||
; CompileSourceDirectory
|
||||
85
Client/Includes/Login.sbi
Normal file
@ -0,0 +1,85 @@
|
||||
Module Login
|
||||
EnableExplicit
|
||||
|
||||
;- Private constants
|
||||
#Window_Width = 400
|
||||
#Window_Height = 165
|
||||
|
||||
;- Private variables
|
||||
Global Window
|
||||
Global UsernameLabel, UsernameInput, PasswordLabel, PasswordInput, ConnectButton
|
||||
|
||||
;- Private declarations
|
||||
Declare Handler_BrowserResize()
|
||||
Declare Handler_ConnectButton()
|
||||
Declare Handler_Login(Success, Result.s, UserData)
|
||||
|
||||
;- Public procedures
|
||||
Procedure Open()
|
||||
Window = OpenWindow(#PB_Any, 0, 0, #Window_Width, #Window_Height, "", #PB_Window_ScreenCentered | #PB_Window_BorderLess)
|
||||
|
||||
UsernameLabel = TextGadget(#PB_Any, 30, 33, 100, 20, "Username: ")
|
||||
UsernameInput = StringGadget(#PB_Any, 120, 30, 250, 20, "")
|
||||
PasswordLabel = TextGadget(#PB_Any, 30, 73, 100, 20, "Password: ")
|
||||
PasswordInput = StringGadget(#PB_Any, 120, 70, 250, 20, "", #PB_String_Password)
|
||||
ConnectButton = ButtonGadget(#PB_Any, 30, 110, #Window_Width - 60, 25, "Connect")
|
||||
SetActiveGadget(UsernameInput)
|
||||
|
||||
BindGadgetEvent(ConnectButton, @Handler_ConnectButton())
|
||||
BindEvent(#PB_Event_SizeDesktop, @Handler_BrowserResize())
|
||||
EndProcedure
|
||||
|
||||
;- Private procedures
|
||||
Procedure Handler_BrowserResize()
|
||||
Protected _Width = DesktopWidth(0)
|
||||
Protected _Height = DesktopHeight(0)
|
||||
ResizeWindow(Window, (_Width - #Window_Width) * 0.5, (_Height - #Window_Height) * 0.5, #PB_Ignore, #PB_Ignore)
|
||||
EndProcedure
|
||||
|
||||
Procedure Handler_ConnectButton()
|
||||
Protected Username.s = GetGadgetText(UsernameInput)
|
||||
Protected Password.s = GetGadgetText(PasswordInput)
|
||||
|
||||
If Username = "" Or Password = ""
|
||||
Notify::Toast("Invalid username or password.", Notify::#Error)
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
|
||||
HTTPRequest(#PB_HTTP_Post, "/api/auth/login", "username=" + URLEncoder(Username, #PB_UTF8) + "&password=" + URLEncoder(Password, #PB_UTF8), @Handler_Login())
|
||||
EndProcedure
|
||||
|
||||
Procedure Handler_Login(Success, Result.s, UserData)
|
||||
Protected Root, OK
|
||||
Protected Username.s
|
||||
|
||||
If Success
|
||||
If ParseJSON(0, Result)
|
||||
Root = JSONValue(0)
|
||||
OK = GetJSONBoolean(GetJSONMember(Root, "success"))
|
||||
If OK
|
||||
Username = GetJSONString(GetJSONMember(Root, "username"))
|
||||
UnbindGadgetEvent(ConnectButton, @Handler_ConnectButton())
|
||||
UnbindEvent(#PB_Event_SizeDesktop, @Handler_BrowserResize())
|
||||
CloseWindow(Window)
|
||||
Desktop::Open(Username)
|
||||
Else
|
||||
Notify::Toast("Invalid username or password.", Notify::#Error)
|
||||
EndIf
|
||||
FreeJSON(0)
|
||||
EndIf
|
||||
Else
|
||||
Notify::Toast("Connection failed. Try again.", Notify::#Error)
|
||||
EndIf
|
||||
EndProcedure
|
||||
|
||||
EndModule
|
||||
|
||||
; IDE Options = SpiderBasic 3.20 (Windows - x86)
|
||||
; CursorPosition = 51
|
||||
; Folding = h
|
||||
; iOSAppOrientation = 0
|
||||
; AndroidAppCode = 0
|
||||
; AndroidAppOrientation = 0
|
||||
; EnableXP
|
||||
; DPIAware
|
||||
; CompileSourceDirectory
|
||||
69
Client/Includes/Modules.sbi
Normal file
@ -0,0 +1,69 @@
|
||||
DeclareModule General
|
||||
Declare Init()
|
||||
EndDeclareModule
|
||||
|
||||
DeclareModule FileCache
|
||||
Declare Cache(FileID.s, Path.s, Content.s, *Callback)
|
||||
Declare Read_(FileID.s, *Callback)
|
||||
Declare Write(FileID.s, Content.s, *Callback)
|
||||
Declare GetMeta(FileID.s, *Callback)
|
||||
Declare MarkClean(FileID.s, *Callback)
|
||||
Declare Evict(FileID.s, *Callback)
|
||||
Declare ListCached(*Callback)
|
||||
Declare ListDirty(*Callback)
|
||||
Declare Exists(FileID.s, *Callback)
|
||||
EndDeclareModule
|
||||
|
||||
DeclareModule FS
|
||||
Declare List(Path.s, *Callback)
|
||||
Declare Stat(Path.s, *Callback)
|
||||
Declare Read_(FileID.s, Path.s, *Callback)
|
||||
Declare Write(FileID.s, Path.s, Content.s, *Callback)
|
||||
Declare Mkdir(Path.s, *Callback)
|
||||
Declare Delete_(FileID.s, *Callback)
|
||||
Declare Move(FileID.s, NewParentID.s, NewName.s, *Callback)
|
||||
Declare Sync(*Callback)
|
||||
|
||||
Declare.s GetFilePart(Path.s)
|
||||
Declare.s GetPathPart(Path.s)
|
||||
EndDeclareModule
|
||||
|
||||
DeclareModule Login
|
||||
Declare Open()
|
||||
EndDeclareModule
|
||||
|
||||
DeclareModule Desktop
|
||||
Declare Open(Username.s)
|
||||
Declare InstallApp(AppName.s, *LaunchProc, Icon.s = "")
|
||||
Declare Register(AppName.s, Win, Icon.s = "")
|
||||
Declare Unregister(Win)
|
||||
Declare InstallThirdPartyApp(AppID.s, ManifestJSON.s, Permissions.s, Icon.s = "")
|
||||
Declare UninstallThirdPartyApp(AppID.s)
|
||||
EndDeclareModule
|
||||
|
||||
DeclareModule Notify
|
||||
Enumeration
|
||||
#Info
|
||||
#Success
|
||||
#Warning
|
||||
#Error
|
||||
EndEnumeration
|
||||
|
||||
Declare Toast(Message.s, Type = #Info, Duration = 4000)
|
||||
Declare Confirm(Title.s, Message.s, *Callback)
|
||||
EndDeclareModule
|
||||
|
||||
DeclareModule AppRuntime
|
||||
Declare Init()
|
||||
Declare Launch(AppID.s, ManifestJSON.s, Permissions.s)
|
||||
EndDeclareModule
|
||||
|
||||
; IDE Options = SpiderBasic 3.20 (Windows - x86)
|
||||
; CursorPosition = 59
|
||||
; Folding = --
|
||||
; iOSAppOrientation = 0
|
||||
; AndroidAppCode = 0
|
||||
; AndroidAppOrientation = 0
|
||||
; EnableXP
|
||||
; DPIAware
|
||||
; CompileSourceDirectory
|
||||
241
Client/Includes/Notify.sbi
Normal file
@ -0,0 +1,241 @@
|
||||
Module Notify
|
||||
EnableExplicit
|
||||
|
||||
;- Toast constants
|
||||
#Toast_W = 300
|
||||
#Toast_H = 60
|
||||
#Toast_Margin = 10
|
||||
#Accent_W = 4
|
||||
#Toast_Timer = 0
|
||||
#MaxToasts = 5
|
||||
|
||||
;- Globals
|
||||
Global _Font = LoadFont(#PB_Any, "sans-serif", 12)
|
||||
|
||||
; Toast state
|
||||
Global Dim _Wins.i(#MaxToasts)
|
||||
Global Dim _Canvases.i(#MaxToasts)
|
||||
Global Dim _Types.i(#MaxToasts)
|
||||
Global Dim _Messages.s(#MaxToasts)
|
||||
Global _Count
|
||||
|
||||
; Confirm state
|
||||
Global _ConfirmWin
|
||||
Global _ConfirmOkBtn
|
||||
Global _ConfirmCancelBtn
|
||||
Global *_ConfirmCb
|
||||
|
||||
;- Private declarations
|
||||
Declare _TypeColor(Type)
|
||||
Declare _DrawToast(Slot)
|
||||
Declare _Dismiss(Slot)
|
||||
Declare _Reposition()
|
||||
Declare _FindByWindow(Win)
|
||||
Declare _FindByCanvas(Canvas)
|
||||
Declare _CloseConfirm()
|
||||
Declare _FireConfirm(Result)
|
||||
Declare Handler_ToastTimer()
|
||||
Declare Handler_ToastClick()
|
||||
Declare Handler_ConfirmOK()
|
||||
Declare Handler_ConfirmCancel()
|
||||
Declare Handler_ConfirmClose()
|
||||
|
||||
;- Public procedures
|
||||
|
||||
; Show a toast in the bottom-right corner. Dismisses after Duration ms or on click.
|
||||
Procedure Toast(Message.s, Type = #Info, Duration = 4000)
|
||||
Protected Slot, DW, DH, X, Y, Win, Canvas
|
||||
|
||||
If _Count >= #MaxToasts : ProcedureReturn : EndIf
|
||||
|
||||
Slot = _Count
|
||||
DW = DesktopWidth(0)
|
||||
DH = DesktopHeight(0)
|
||||
X = DW - #Toast_W - #Toast_Margin
|
||||
Y = DH - (Slot + 1) * (#Toast_H + #Toast_Margin)
|
||||
Win = OpenWindow(#PB_Any, X, Y, #Toast_W, #Toast_H, "", #PB_Window_BorderLess)
|
||||
StickyWindow(Win, #True)
|
||||
Canvas = CanvasGadget(#PB_Any, 0, 0, #Toast_W, #Toast_H)
|
||||
|
||||
_Wins(Slot) = Win
|
||||
_Canvases(Slot) = Canvas
|
||||
_Types(Slot) = Type
|
||||
_Messages(Slot) = Message
|
||||
_Count + 1
|
||||
|
||||
_DrawToast(Slot)
|
||||
|
||||
BindGadgetEvent(Canvas, @Handler_ToastClick())
|
||||
AddWindowTimer(Win, #Toast_Timer, Duration)
|
||||
BindEvent(#PB_Event_Timer, @Handler_ToastTimer(), Win)
|
||||
EndProcedure
|
||||
|
||||
; Show a modal confirm dialog. *Callback(Result) is called with 1 for OK, 0 for Cancel.
|
||||
; Only one confirm can be open at a time — subsequent calls are ignored.
|
||||
Procedure Confirm(Title.s, Message.s, *Callback)
|
||||
Protected W, H, DW, DH
|
||||
|
||||
If IsWindow(_ConfirmWin) : ProcedureReturn : EndIf
|
||||
|
||||
W = 340
|
||||
H = 130
|
||||
DW = DesktopWidth(0)
|
||||
DH = DesktopHeight(0)
|
||||
|
||||
_ConfirmWin = OpenWindow(#PB_Any, (DW - W) / 2, (DH - H) / 2, W, H, Title, #PB_Window_TitleBar | #PB_Window_SystemMenu)
|
||||
StickyWindow(_ConfirmWin, #True)
|
||||
*_ConfirmCb = *Callback
|
||||
|
||||
TextGadget(#PB_Any, 20, 20, W - 40, 50, Message)
|
||||
_ConfirmOkBtn = ButtonGadget(#PB_Any, W - 190, H - 45, 80, 30, "OK")
|
||||
_ConfirmCancelBtn = ButtonGadget(#PB_Any, W - 100, H - 45, 80, 30, "Cancel")
|
||||
|
||||
BindGadgetEvent(_ConfirmOkBtn, @Handler_ConfirmOK())
|
||||
BindGadgetEvent(_ConfirmCancelBtn, @Handler_ConfirmCancel())
|
||||
BindEvent(#PB_Event_CloseWindow, @Handler_ConfirmClose(), _ConfirmWin)
|
||||
EndProcedure
|
||||
|
||||
;- Private procedures
|
||||
|
||||
Procedure _TypeColor(Type)
|
||||
Select Type
|
||||
Case #Success : ProcedureReturn RGB( 60, 180, 100)
|
||||
Case #Warning : ProcedureReturn RGB(220, 160, 40)
|
||||
Case #Error : ProcedureReturn RGB(210, 65, 65)
|
||||
Default : ProcedureReturn RGB( 50, 130, 220) ; #Info
|
||||
EndSelect
|
||||
EndProcedure
|
||||
|
||||
Procedure _DrawToast(Slot)
|
||||
Protected W, H, MaxW
|
||||
Protected Msg.s
|
||||
|
||||
If Not IsGadget(_Canvases(Slot)) : ProcedureReturn : EndIf
|
||||
If Not StartDrawing(CanvasOutput(_Canvases(Slot))) : ProcedureReturn : EndIf
|
||||
|
||||
W = OutputWidth()
|
||||
H = OutputHeight()
|
||||
|
||||
; Background
|
||||
Box(0, 0, W, H, RGB(38, 38, 54))
|
||||
|
||||
; Accent bar
|
||||
Box(0, 0, #Accent_W, H, _TypeColor(_Types(Slot)))
|
||||
|
||||
; Message — truncate with ellipsis if too wide
|
||||
DrawingMode(#PB_2DDrawing_Transparent)
|
||||
If IsFont(_Font) : DrawingFont(FontID(_Font)) : EndIf
|
||||
|
||||
Msg = _Messages(Slot)
|
||||
MaxW = W - #Accent_W - 24
|
||||
While Len(Msg) > 3 And TextWidth(Msg) > MaxW
|
||||
Msg = Left(Msg, Len(Msg) - 4) + "..."
|
||||
Wend
|
||||
|
||||
DrawText(#Accent_W + 14, (H - TextHeight("A")) / 2, Msg, RGB(220, 220, 220))
|
||||
StopDrawing()
|
||||
EndProcedure
|
||||
|
||||
Procedure _Dismiss(Slot)
|
||||
Protected i
|
||||
|
||||
If Not IsWindow(_Wins(Slot)) : ProcedureReturn : EndIf
|
||||
|
||||
UnbindEvent(#PB_Event_Timer, @Handler_ToastTimer(), _Wins(Slot))
|
||||
UnbindGadgetEvent(_Canvases(Slot), @Handler_ToastClick())
|
||||
CloseWindow(_Wins(Slot))
|
||||
|
||||
For i = Slot To _Count - 2
|
||||
_Wins(i) = _Wins(i + 1)
|
||||
_Canvases(i) = _Canvases(i + 1)
|
||||
_Types(i) = _Types(i + 1)
|
||||
_Messages(i) = _Messages(i + 1)
|
||||
Next
|
||||
_Wins(_Count - 1) = 0
|
||||
_Canvases(_Count - 1) = 0
|
||||
_Types(_Count - 1) = 0
|
||||
_Messages(_Count - 1) = ""
|
||||
_Count - 1
|
||||
|
||||
_Reposition()
|
||||
EndProcedure
|
||||
|
||||
Procedure _Reposition()
|
||||
Protected DW, DH, i
|
||||
|
||||
DW = DesktopWidth(0)
|
||||
DH = DesktopHeight(0)
|
||||
For i = 0 To _Count - 1
|
||||
ResizeWindow(_Wins(i), DW - #Toast_W - #Toast_Margin, DH - (i + 1) * (#Toast_H + #Toast_Margin), #PB_Ignore, #PB_Ignore)
|
||||
Next
|
||||
EndProcedure
|
||||
|
||||
Procedure _FindByWindow(Win)
|
||||
Protected i
|
||||
For i = 0 To _Count - 1
|
||||
If _Wins(i) = Win : ProcedureReturn i : EndIf
|
||||
Next
|
||||
ProcedureReturn -1
|
||||
EndProcedure
|
||||
|
||||
Procedure _FindByCanvas(Canvas)
|
||||
Protected i
|
||||
For i = 0 To _Count - 1
|
||||
If _Canvases(i) = Canvas : ProcedureReturn i : EndIf
|
||||
Next
|
||||
ProcedureReturn -1
|
||||
EndProcedure
|
||||
|
||||
Procedure _CloseConfirm()
|
||||
UnbindGadgetEvent(_ConfirmOkBtn, @Handler_ConfirmOK())
|
||||
UnbindGadgetEvent(_ConfirmCancelBtn, @Handler_ConfirmCancel())
|
||||
UnbindEvent(#PB_Event_CloseWindow, @Handler_ConfirmClose(), _ConfirmWin)
|
||||
CloseWindow(_ConfirmWin)
|
||||
_ConfirmWin = 0
|
||||
EndProcedure
|
||||
|
||||
Procedure _FireConfirm(Result)
|
||||
_CloseConfirm()
|
||||
If *_ConfirmCb
|
||||
!notify$g__confirmcb(v_result);
|
||||
*_ConfirmCb = 0
|
||||
EndIf
|
||||
EndProcedure
|
||||
|
||||
;- Event handlers
|
||||
|
||||
Procedure Handler_ToastTimer()
|
||||
Protected Slot = _FindByWindow(EventWindow())
|
||||
If Slot >= 0 : _Dismiss(Slot) : EndIf
|
||||
EndProcedure
|
||||
|
||||
Procedure Handler_ToastClick()
|
||||
Protected Slot
|
||||
If EventType() <> #PB_EventType_LeftButtonUp : ProcedureReturn : EndIf
|
||||
Slot = _FindByCanvas(EventGadget())
|
||||
If Slot >= 0 : _Dismiss(Slot) : EndIf
|
||||
EndProcedure
|
||||
|
||||
Procedure Handler_ConfirmOK()
|
||||
_FireConfirm(1)
|
||||
EndProcedure
|
||||
|
||||
Procedure Handler_ConfirmCancel()
|
||||
_FireConfirm(0)
|
||||
EndProcedure
|
||||
|
||||
Procedure Handler_ConfirmClose()
|
||||
_FireConfirm(0)
|
||||
EndProcedure
|
||||
|
||||
EndModule
|
||||
|
||||
; IDE Options = SpiderBasic 3.20 (Windows - x86)
|
||||
; CursorPosition = 13
|
||||
; Folding = BAw
|
||||
; iOSAppOrientation = 0
|
||||
; AndroidAppCode = 0
|
||||
; AndroidAppOrientation = 0
|
||||
; EnableXP
|
||||
; DPIAware
|
||||
; CompileSourceDirectory
|
||||
85
Client/KUMOS.sbp
Normal file
@ -0,0 +1,85 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<project xmlns="http://www.purebasic.com/namespace" version="1.0" creator="SpiderBasic 3.20 (Windows - x86)">
|
||||
<section name="config">
|
||||
<options closefiles="1" openmode="0" name="KUMO.S."/>
|
||||
<buildwindow autoclose="1"/>
|
||||
</section>
|
||||
<section name="data">
|
||||
<explorer view="C:\ProgramData\SpiderBasic\Examples\" pattern="0"/>
|
||||
<log show="1"/>
|
||||
<lastopen date="2026-05-02 15:30" user="lastlife" host="MONSTRO"/>
|
||||
</section>
|
||||
<section name="files">
|
||||
<file name="Main.sb">
|
||||
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="1" panelstate="+"/>
|
||||
<fingerprint md5="f576326de07e513ea6b6dd258de683db"/>
|
||||
</file>
|
||||
<file name="Includes\Modules.sbi">
|
||||
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="2" panelstate="++"/>
|
||||
<fingerprint md5="6f79aa6329eb128a2d2e21f5062b9b9b"/>
|
||||
</file>
|
||||
<file name="Includes\General.sbi">
|
||||
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="3" panelstate="++"/>
|
||||
<fingerprint md5="4cab2d068c6f4e72cf4361759741a68c"/>
|
||||
</file>
|
||||
<file name="Includes\Desktop.sbi">
|
||||
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="4" panelstate="++"/>
|
||||
<fingerprint md5="92bb58b90c2dd5a2872735abd0500ebb"/>
|
||||
</file>
|
||||
<file name="Includes\Login.sbi">
|
||||
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="5" panelstate="++"/>
|
||||
<fingerprint md5="b3942f9366ffaeac322ae97ad4f2969a"/>
|
||||
</file>
|
||||
<file name="Libraries\IDB.sbi">
|
||||
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="6" panelstate="++"/>
|
||||
<fingerprint md5="8085cb3ee9b94f70e3f0da0dd5d65679"/>
|
||||
</file>
|
||||
<file name="Default Apps\TextEditor.sbi">
|
||||
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="7" panelstate="++"/>
|
||||
<fingerprint md5="e0071b1247a3875af38cd7b382a669ce"/>
|
||||
</file>
|
||||
<file name="Default Apps\FileExplorer.sbi">
|
||||
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="8" panelstate="++"/>
|
||||
<fingerprint md5="321c1adf362c4e923aa8e465c914c390"/>
|
||||
</file>
|
||||
<file name="Includes\FS.sbi">
|
||||
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="9" panelstate="++"/>
|
||||
<fingerprint md5="a8c2e345dd28cd04cb1e945419703bba"/>
|
||||
</file>
|
||||
<file name="Includes\Notify.sbi">
|
||||
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="10" panelstate="++"/>
|
||||
<fingerprint md5="e272ce4395832d217a09c71a876a5215"/>
|
||||
</file>
|
||||
<file name="Default Apps\Settings.sbi">
|
||||
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="11" panelstate="++"/>
|
||||
<fingerprint md5="ccff0474adda20d60eb50dccbcbb7847"/>
|
||||
</file>
|
||||
<file name="Default Apps\WebBrowser.sbi">
|
||||
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="12" panelstate="++"/>
|
||||
<fingerprint md5="11654dcbaa001b6b16829aa89b1b6b86"/>
|
||||
</file>
|
||||
<file name="Default Apps\AppManager.sbi">
|
||||
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="13" panelstate="++"/>
|
||||
<fingerprint md5="f2489b3a56beb00a2eb92678572d435b"/>
|
||||
</file>
|
||||
<file name="Includes\AppRuntime.sbi">
|
||||
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="14" panelstate="++"/>
|
||||
<fingerprint md5="f2e5bc16d9b734775ee703a28ad08a2b"/>
|
||||
</file>
|
||||
<file name="Includes\FileCache.sbi">
|
||||
<config load="0" scan="1" panel="1" warn="1" lastopen="0" sortindex="999" panelstate="++"/>
|
||||
<fingerprint md5="623097fdb15cb37d746eef1293c04f8e"/>
|
||||
</file>
|
||||
</section>
|
||||
<section name="targets">
|
||||
<target name="Default Target" enabled="1" default="1">
|
||||
<inputfile value="Main.sb"/>
|
||||
<outputfile value=""/>
|
||||
<executable value="..\Server\www\index.html"/>
|
||||
<options xpskin="1" dpiaware="1" debug="1" optimizer="0" webserveraddress="" windowtheme="flat" gadgettheme="flat"/>
|
||||
<export webappname="KUMO.S." webappicon="" htmlfilename="../Server/www/index.html" javascriptfilename="js.js" javascriptpath="" copyjavascriptlibrary="1" exportcommandline="" exportarguments="" enableresourcedirectory="0" resourcedirectory="" webappenabledebugger="1" iosappname="" iosappicon="" iosappversion="" iosapppackageid="" iosappstartupimage="" iosapporientation="0" iosappfullscreen="0" iosappoutput="" iosappautoupload="0" iosappenableresourcedirectory="0" iosappresourcedirectory="" iosappenabledebugger="0" iosappkeepappdirectory="0" androidappname="" androidappicon="" androidappversion="" androidappcode="1" androidapppackageid="" androidappiapkey="" androidappstartupimage="" androidappstartupcolor="" androidapporientation="0" androidappfullscreen="0" androidappoutput="" androidappautoupload="0" androidappenableresourcedirectory="0" androidappresourcedirectory="" androidappenabledebugger="0" androidappkeepappdirectory="0" androidappinsecurefilemode="0"/>
|
||||
<temporaryexe value="source"/>
|
||||
</target>
|
||||
</section>
|
||||
</project>
|
||||
165
Client/Libraries/IDB.sbi
Normal file
@ -0,0 +1,165 @@
|
||||
DeclareModule IDB
|
||||
Declare Init(DBName.s, Version.i, Stores.s, *Callback)
|
||||
Declare Put(Store.s, Key.s, Value.s, *Callback)
|
||||
Declare Get(Store.s, Key.s, *Callback)
|
||||
Declare Exists(Store.s, Key.s, *Callback)
|
||||
Declare Delete(Store.s, Key.s, *Callback)
|
||||
Declare GetAllKeys(Store.s, *Callback)
|
||||
Declare GetAll(Store.s, *Callback)
|
||||
Declare Clear(Store.s, *Callback)
|
||||
Declare Count(Store.s, *Callback)
|
||||
EndDeclareModule
|
||||
|
||||
Module IDB
|
||||
EnableExplicit
|
||||
|
||||
!window._kumos_idb = null;
|
||||
|
||||
Procedure Init(DBName.s, Version.i, Stores.s, *Callback)
|
||||
!var _cb = p_callback;
|
||||
!var _dbname = v_dbname;
|
||||
!var _ver = v_version;
|
||||
!var _stores = v_stores;
|
||||
!
|
||||
!var req = indexedDB.open(_dbname, _ver);
|
||||
!
|
||||
!req.onupgradeneeded = function(ev) {
|
||||
! var db = ev.target.result;
|
||||
! _stores.split(',').forEach(function(name) {
|
||||
! name = name.trim();
|
||||
! if (name && !db.objectStoreNames.contains(name)) {
|
||||
! db.createObjectStore(name);
|
||||
! }
|
||||
! });
|
||||
!};
|
||||
!req.onsuccess = function(ev) {
|
||||
! window._kumos_idb = ev.target.result;
|
||||
! if (_cb) _cb(1, '');
|
||||
!};
|
||||
!req.onerror = function(ev) {
|
||||
! var msg = ev.target.error ? ev.target.error.message : 'open failed';
|
||||
! if (_cb) _cb(0, msg);
|
||||
!};
|
||||
!req.onblocked = function() {
|
||||
! if (_cb) _cb(0, 'IDB blocked - close other tabs using this app');
|
||||
!};
|
||||
EndProcedure
|
||||
|
||||
Procedure Put(Store.s, Key.s, Value.s, *Callback)
|
||||
!var _cb = p_callback;
|
||||
!var _store = v_store;
|
||||
!var _key = v_key;
|
||||
!var _val = v_value;
|
||||
!if (!window._kumos_idb) { if (_cb) _cb(0, 'IDB not open'); return; }
|
||||
!var tx = window._kumos_idb.transaction([_store], 'readwrite');
|
||||
!var st = tx.objectStore(_store);
|
||||
!var req = st.put(_val, _key);
|
||||
!req.onsuccess = function() { if (_cb) _cb(1, ''); };
|
||||
!req.onerror = function(e) { if (_cb) _cb(0, e.target.error ? e.target.error.message : 'put failed'); };
|
||||
EndProcedure
|
||||
|
||||
Procedure Get(Store.s, Key.s, *Callback)
|
||||
!var _cb = p_callback;
|
||||
!var _store = v_store;
|
||||
!var _key = v_key;
|
||||
!if (!window._kumos_idb) { if (_cb) _cb(0, 'IDB not open'); return; }
|
||||
!var tx = window._kumos_idb.transaction([_store], 'readonly');
|
||||
!var st = tx.objectStore(_store);
|
||||
!var req = st.get(_key);
|
||||
!req.onsuccess = function(ev) {
|
||||
! var v = ev.target.result;
|
||||
! if (_cb) _cb(1, v !== undefined ? String(v) : '');
|
||||
!};
|
||||
!req.onerror = function(e) { if (_cb) _cb(0, e.target.error ? e.target.error.message : 'get failed'); };
|
||||
EndProcedure
|
||||
|
||||
Procedure Exists(Store.s, Key.s, *Callback)
|
||||
!var _cb = p_callback;
|
||||
!var _store = v_store;
|
||||
!var _key = v_key;
|
||||
!if (!window._kumos_idb) { if (_cb) _cb(0, 'IDB not open'); return; }
|
||||
!var tx = window._kumos_idb.transaction([_store], 'readonly');
|
||||
!var st = tx.objectStore(_store);
|
||||
!var req = st.getKey(_key);
|
||||
!req.onsuccess = function(ev) {
|
||||
! if (_cb) _cb(1, ev.target.result !== undefined ? '1' : '0');
|
||||
!};
|
||||
!req.onerror = function(e) { if (_cb) _cb(0, e.target.error ? e.target.error.message : 'exists failed'); };
|
||||
EndProcedure
|
||||
|
||||
Procedure Delete(Store.s, Key.s, *Callback)
|
||||
!var _cb = p_callback;
|
||||
!var _store = v_store;
|
||||
!var _key = v_key;
|
||||
!if (!window._kumos_idb) { if (_cb) _cb(0, 'IDB not open'); return; }
|
||||
!var tx = window._kumos_idb.transaction([_store], 'readwrite');
|
||||
!var st = tx.objectStore(_store);
|
||||
!var req = st.delete(_key);
|
||||
!req.onsuccess = function() { if (_cb) _cb(1, ''); };
|
||||
!req.onerror = function(e) { if (_cb) _cb(0, e.target.error ? e.target.error.message : 'delete failed'); };
|
||||
EndProcedure
|
||||
|
||||
Procedure GetAllKeys(Store.s, *Callback)
|
||||
!var _cb = p_callback;
|
||||
!var _store = v_store;
|
||||
!if (!window._kumos_idb) { if (_cb) _cb(0, 'IDB not open'); return; }
|
||||
!var tx = window._kumos_idb.transaction([_store], 'readonly');
|
||||
!var st = tx.objectStore(_store);
|
||||
!var req = st.getAllKeys();
|
||||
!req.onsuccess = function(ev) { if (_cb) _cb(1, JSON.stringify(ev.target.result || [])); };
|
||||
!req.onerror = function(e) { if (_cb) _cb(0, e.target.error ? e.target.error.message : 'getAllKeys failed'); };
|
||||
EndProcedure
|
||||
|
||||
Procedure GetAll(Store.s, *Callback)
|
||||
!var _cb = p_callback;
|
||||
!var _store = v_store;
|
||||
!if (!window._kumos_idb) { if (_cb) _cb(0, 'IDB not open'); return; }
|
||||
!var tx = window._kumos_idb.transaction([_store], 'readonly');
|
||||
!var st = tx.objectStore(_store);
|
||||
!var keysReq = st.getAllKeys();
|
||||
!keysReq.onsuccess = function(ev) {
|
||||
! var keys = ev.target.result;
|
||||
! var valsReq = st.getAll();
|
||||
! valsReq.onsuccess = function(ev2) {
|
||||
! var vals = ev2.target.result;
|
||||
! var out = {};
|
||||
! for (var i = 0; i < keys.length; i++) out[String(keys[i])] = String(vals[i]);
|
||||
! if (_cb) _cb(1, JSON.stringify(out));
|
||||
! };
|
||||
! valsReq.onerror = function(e) { if (_cb) _cb(0, e.target.error ? e.target.error.message : 'getAll/vals failed'); };
|
||||
!};
|
||||
!keysReq.onerror = function(e) { if (_cb) _cb(0, e.target.error ? e.target.error.message : 'getAll/keys failed'); };
|
||||
EndProcedure
|
||||
|
||||
Procedure Clear(Store.s, *Callback)
|
||||
!var _cb = p_callback;
|
||||
!var _store = v_store;
|
||||
!if (!window._kumos_idb) { if (_cb) _cb(0, 'IDB not open'); return; }
|
||||
!var tx = window._kumos_idb.transaction([_store], 'readwrite');
|
||||
!var st = tx.objectStore(_store);
|
||||
!var req = st.clear();
|
||||
!req.onsuccess = function() { if (_cb) _cb(1, ''); };
|
||||
!req.onerror = function(e) { if (_cb) _cb(0, e.target.error ? e.target.error.message : 'clear failed'); };
|
||||
EndProcedure
|
||||
|
||||
Procedure Count(Store.s, *Callback)
|
||||
!var _cb = p_callback;
|
||||
!var _store = v_store;
|
||||
!if (!window._kumos_idb) { if (_cb) _cb(0, 'IDB not open'); return; }
|
||||
!var tx = window._kumos_idb.transaction([_store], 'readonly');
|
||||
!var st = tx.objectStore(_store);
|
||||
!var req = st.count();
|
||||
!req.onsuccess = function(ev) { if (_cb) _cb(1, String(ev.target.result)); };
|
||||
!req.onerror = function(e) { if (_cb) _cb(0, e.target.error ? e.target.error.message : 'count failed'); };
|
||||
EndProcedure
|
||||
|
||||
EndModule
|
||||
; IDE Options = SpiderBasic 3.10 (Windows - x86)
|
||||
; CursorPosition = 15
|
||||
; Folding = Dg
|
||||
; iOSAppOrientation = 0
|
||||
; AndroidAppCode = 0
|
||||
; AndroidAppOrientation = 0
|
||||
; EnableXP
|
||||
; DPIAware
|
||||
; CompileSourceDirectory
|
||||
37
Client/Main.sb
Normal file
@ -0,0 +1,37 @@
|
||||
IncludePath "Libraries"
|
||||
IncludeFile "IDB.sbi"
|
||||
|
||||
|
||||
IncludePath "Includes"
|
||||
IncludeFile "Modules.sbi"
|
||||
IncludeFile "General.sbi"
|
||||
|
||||
; System
|
||||
IncludeFile "FileCache.sbi"
|
||||
IncludeFile "FS.sbi"
|
||||
|
||||
; UI
|
||||
IncludeFile "Notify.sbi"
|
||||
IncludeFile "Desktop.sbi"
|
||||
IncludeFile "Login.sbi"
|
||||
|
||||
; Appstore
|
||||
IncludeFile "AppRuntime.sbi"
|
||||
|
||||
IncludePath "Default Apps"
|
||||
IncludeFile "TextEditor.sbi"
|
||||
IncludeFile "FileExplorer.sbi"
|
||||
IncludeFile "Settings.sbi"
|
||||
IncludeFile "WebBrowser.sbi"
|
||||
IncludeFile "AppManager.sbi"
|
||||
|
||||
General::Init()
|
||||
|
||||
; IDE Options = SpiderBasic 3.10 (Windows - x86)
|
||||
; CursorPosition = 25
|
||||
; iOSAppOrientation = 0
|
||||
; AndroidAppCode = 0
|
||||
; AndroidAppOrientation = 0
|
||||
; EnableXP
|
||||
; DPIAware
|
||||
; CompileSourceDirectory
|
||||
124
Client/kumos.js
Normal file
@ -0,0 +1,124 @@
|
||||
/**
|
||||
* KUMO.S App SDK — include in your app with:
|
||||
* <script src="/kumos.js"></script>
|
||||
*
|
||||
* All methods return Promises. Call KUMOS.ready() first.
|
||||
*
|
||||
* Permissions required per namespace:
|
||||
* storage.* — always available (private app namespace)
|
||||
* fs.* — requires "fs.read" or "fs.write" grant
|
||||
* notify.* — requires "notify" grant
|
||||
* window.* — always available
|
||||
*/
|
||||
(function (global) {
|
||||
'use strict';
|
||||
|
||||
var _pending = {}; // kmid → { resolve, reject, timer }
|
||||
|
||||
// ── Internal helpers ──────────────────────────────────────────────────────
|
||||
|
||||
function _uuid() {
|
||||
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
|
||||
var r = Math.random() * 16 | 0;
|
||||
return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
|
||||
});
|
||||
}
|
||||
|
||||
function _send(action, args) {
|
||||
return new Promise(function (resolve, reject) {
|
||||
var kmid = _uuid();
|
||||
var timer = setTimeout(function () {
|
||||
if (_pending[kmid]) {
|
||||
delete _pending[kmid];
|
||||
reject(new Error('KUMOS timeout: ' + action));
|
||||
}
|
||||
}, 15000);
|
||||
_pending[kmid] = { resolve: resolve, reject: reject, timer: timer };
|
||||
window.parent.postMessage(
|
||||
JSON.stringify({ kmid: kmid, action: action, args: args || {} }),
|
||||
'*'
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
// Incoming responses from the shell
|
||||
window.addEventListener('message', function (e) {
|
||||
if (e.source !== window.parent) return;
|
||||
var msg;
|
||||
try { msg = JSON.parse(e.data); } catch (err) { return; }
|
||||
if (!msg || !msg.kmid) return;
|
||||
var p = _pending[msg.kmid];
|
||||
if (!p) return;
|
||||
clearTimeout(p.timer);
|
||||
delete _pending[msg.kmid];
|
||||
if (msg.success) {
|
||||
p.resolve(msg.data !== undefined ? msg.data : null);
|
||||
} else {
|
||||
p.reject(new Error(msg.error || 'Unknown error'));
|
||||
}
|
||||
});
|
||||
|
||||
// ── Public API ────────────────────────────────────────────────────────────
|
||||
|
||||
var KUMOS = {
|
||||
|
||||
/**
|
||||
* Handshake with the shell. Resolves with { app_id }.
|
||||
* Always call this first and await it before using any other APIs.
|
||||
*/
|
||||
ready: function () {
|
||||
return _send('window.ready', {});
|
||||
},
|
||||
|
||||
// ── Private app storage (no extra permission required) ───────────────
|
||||
|
||||
storage: {
|
||||
/** Read a file. Resolves with the content string. */
|
||||
read: function (path) { return _send('storage.read', { path: path }); },
|
||||
/** Write content to a file. Creates it if it does not exist. */
|
||||
write: function (path, content) { return _send('storage.write', { path: path, content: content }); },
|
||||
/** List a directory. Resolves with an array of entry objects. */
|
||||
list: function (path) { return _send('storage.list', { path: path || '/' }); },
|
||||
/** Stat a path. */
|
||||
stat: function (path) { return _send('storage.stat', { path: path }); },
|
||||
/** Create a directory. */
|
||||
mkdir: function (path) { return _send('storage.mkdir', { path: path }); },
|
||||
/** Delete a file. */
|
||||
delete: function (path) { return _send('storage.delete', { path: path }); }
|
||||
},
|
||||
|
||||
// ── User filesystem (requires fs.read / fs.write permission) ─────────
|
||||
|
||||
fs: {
|
||||
/** Read a file from the user's filesystem. */
|
||||
read: function (path) { return _send('fs.read', { path: path }); },
|
||||
/** Write content to a file in the user's filesystem. */
|
||||
write: function (path, content) { return _send('fs.write', { path: path, content: content }); },
|
||||
/** List a directory. */
|
||||
list: function (path) { return _send('fs.list', { path: path || '/' }); },
|
||||
/** Stat a path. */
|
||||
stat: function (path) { return _send('fs.stat', { path: path }); }
|
||||
},
|
||||
|
||||
// ── Notifications (requires notify permission) ────────────────────────
|
||||
|
||||
notify: {
|
||||
/** Show a toast. type: 'info' | 'success' | 'warning' | 'error' */
|
||||
toast: function (message, type) { return _send('notify.toast', { message: message, type: type || 'info' }); },
|
||||
/** Show a confirm dialog. Resolves with true (OK) or false (Cancel). */
|
||||
confirm: function (title, message) { return _send('notify.confirm', { title: title, message: message }); }
|
||||
},
|
||||
|
||||
// ── Window control ────────────────────────────────────────────────────
|
||||
|
||||
window: {
|
||||
/** Update the host window title. */
|
||||
setTitle: function (title) { return _send('window.setTitle', { title: title }); },
|
||||
/** Close this app instance. */
|
||||
close: function () { return _send('window.close', {}); }
|
||||
}
|
||||
};
|
||||
|
||||
global.KUMOS = KUMOS;
|
||||
|
||||
}(window));
|
||||
BIN
SDK/JS/helloworld.zip
Normal file
124
SDK/JS/kumos.js
Normal file
@ -0,0 +1,124 @@
|
||||
/**
|
||||
* KUMO.S App SDK — include in your app with:
|
||||
* <script src="/kumos.js"></script>
|
||||
*
|
||||
* All methods return Promises. Call KUMOS.ready() first.
|
||||
*
|
||||
* Permissions required per namespace:
|
||||
* storage.* — always available (private app namespace)
|
||||
* fs.* — requires "fs.read" or "fs.write" grant
|
||||
* notify.* — requires "notify" grant
|
||||
* window.* — always available
|
||||
*/
|
||||
(function (global) {
|
||||
'use strict';
|
||||
|
||||
var _pending = {}; // kmid → { resolve, reject, timer }
|
||||
|
||||
// ── Internal helpers ──────────────────────────────────────────────────────
|
||||
|
||||
function _uuid() {
|
||||
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
|
||||
var r = Math.random() * 16 | 0;
|
||||
return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
|
||||
});
|
||||
}
|
||||
|
||||
function _send(action, args) {
|
||||
return new Promise(function (resolve, reject) {
|
||||
var kmid = _uuid();
|
||||
var timer = setTimeout(function () {
|
||||
if (_pending[kmid]) {
|
||||
delete _pending[kmid];
|
||||
reject(new Error('KUMOS timeout: ' + action));
|
||||
}
|
||||
}, 15000);
|
||||
_pending[kmid] = { resolve: resolve, reject: reject, timer: timer };
|
||||
window.parent.postMessage(
|
||||
JSON.stringify({ kmid: kmid, action: action, args: args || {} }),
|
||||
'*'
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
// Incoming responses from the shell
|
||||
window.addEventListener('message', function (e) {
|
||||
if (e.source !== window.parent) return;
|
||||
var msg;
|
||||
try { msg = JSON.parse(e.data); } catch (err) { return; }
|
||||
if (!msg || !msg.kmid) return;
|
||||
var p = _pending[msg.kmid];
|
||||
if (!p) return;
|
||||
clearTimeout(p.timer);
|
||||
delete _pending[msg.kmid];
|
||||
if (msg.success) {
|
||||
p.resolve(msg.data !== undefined ? msg.data : null);
|
||||
} else {
|
||||
p.reject(new Error(msg.error || 'Unknown error'));
|
||||
}
|
||||
});
|
||||
|
||||
// ── Public API ────────────────────────────────────────────────────────────
|
||||
|
||||
var KUMOS = {
|
||||
|
||||
/**
|
||||
* Handshake with the shell. Resolves with { app_id }.
|
||||
* Always call this first and await it before using any other APIs.
|
||||
*/
|
||||
ready: function () {
|
||||
return _send('window.ready', {});
|
||||
},
|
||||
|
||||
// ── Private app storage (no extra permission required) ───────────────
|
||||
|
||||
storage: {
|
||||
/** Read a file. Resolves with the content string. */
|
||||
read: function (path) { return _send('storage.read', { path: path }); },
|
||||
/** Write content to a file. Creates it if it does not exist. */
|
||||
write: function (path, content) { return _send('storage.write', { path: path, content: content }); },
|
||||
/** List a directory. Resolves with an array of entry objects. */
|
||||
list: function (path) { return _send('storage.list', { path: path || '/' }); },
|
||||
/** Stat a path. */
|
||||
stat: function (path) { return _send('storage.stat', { path: path }); },
|
||||
/** Create a directory. */
|
||||
mkdir: function (path) { return _send('storage.mkdir', { path: path }); },
|
||||
/** Delete a file. */
|
||||
delete: function (path) { return _send('storage.delete', { path: path }); }
|
||||
},
|
||||
|
||||
// ── User filesystem (requires fs.read / fs.write permission) ─────────
|
||||
|
||||
fs: {
|
||||
/** Read a file from the user's filesystem. */
|
||||
read: function (path) { return _send('fs.read', { path: path }); },
|
||||
/** Write content to a file in the user's filesystem. */
|
||||
write: function (path, content) { return _send('fs.write', { path: path, content: content }); },
|
||||
/** List a directory. */
|
||||
list: function (path) { return _send('fs.list', { path: path || '/' }); },
|
||||
/** Stat a path. */
|
||||
stat: function (path) { return _send('fs.stat', { path: path }); }
|
||||
},
|
||||
|
||||
// ── Notifications (requires notify permission) ────────────────────────
|
||||
|
||||
notify: {
|
||||
/** Show a toast. type: 'info' | 'success' | 'warning' | 'error' */
|
||||
toast: function (message, type) { return _send('notify.toast', { message: message, type: type || 'info' }); },
|
||||
/** Show a confirm dialog. Resolves with true (OK) or false (Cancel). */
|
||||
confirm: function (title, message) { return _send('notify.confirm', { title: title, message: message }); }
|
||||
},
|
||||
|
||||
// ── Window control ────────────────────────────────────────────────────
|
||||
|
||||
window: {
|
||||
/** Update the host window title. */
|
||||
setTitle: function (title) { return _send('window.setTitle', { title: title }); },
|
||||
/** Close this app instance. */
|
||||
close: function () { return _send('window.close', {}); }
|
||||
}
|
||||
};
|
||||
|
||||
global.KUMOS = KUMOS;
|
||||
|
||||
}(window));
|
||||
229
SDK/SpiderBasic/KUMOS.sbi
Normal file
@ -0,0 +1,229 @@
|
||||
; ════════════════════════════════════════════════════════════════════════════
|
||||
; KUMOS.sbi — SpiderBasic SDK for KUMOS third-party apps
|
||||
;
|
||||
; Usage:
|
||||
; IncludeFile "KUMOS.sbi"
|
||||
; KUMOS::Init() ; call once at startup, before anything else
|
||||
;
|
||||
; All async procedures accept a *Callback procedure pointer.
|
||||
; Callbacks always have the signature: Procedure Cb(Success.i, Data.s)
|
||||
; Exception: KUMOS::Notify_Confirm uses: Procedure Cb(Result.i)
|
||||
;
|
||||
; The "storage.*" namespace is always available.
|
||||
; "fs.*" requires the "fs.read" / "fs.write" permission in manifest.json.
|
||||
; "notify.*" requires the "notify" permission in manifest.json.
|
||||
; ════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
DeclareModule KUMOS
|
||||
; Toast types — pass to Notify_Toast()
|
||||
Enumeration
|
||||
#Info
|
||||
#Success
|
||||
#Warning
|
||||
#Error
|
||||
EndEnumeration
|
||||
|
||||
; ── Lifecycle ──────────────────────────────────────────────────────────
|
||||
Declare Init()
|
||||
Declare Ready(*Callback) ; Cb(Success, Data) — Data: '{"app_id":"..."}'
|
||||
Declare Window_SetTitle(Title.s)
|
||||
Declare Window_Close()
|
||||
|
||||
; ── Private storage (always available) ────────────────────────────────
|
||||
Declare Storage_Read (Path.s, *Callback) ; Cb(Success, Content.s)
|
||||
Declare Storage_Write (Path.s, Content.s, *Callback); Cb(Success, "")
|
||||
Declare Storage_List (Path.s, *Callback) ; Cb(Success, JSON array)
|
||||
Declare Storage_Stat (Path.s, *Callback) ; Cb(Success, JSON object)
|
||||
Declare Storage_Mkdir (Path.s, *Callback) ; Cb(Success, "")
|
||||
Declare Storage_Delete(Path.s, *Callback) ; Cb(Success, "")
|
||||
|
||||
; ── User filesystem (requires fs.read / fs.write) ─────────────────────
|
||||
Declare FS_Read (Path.s, *Callback) ; Cb(Success, Content.s)
|
||||
Declare FS_Write (Path.s, Content.s, *Callback) ; Cb(Success, "")
|
||||
Declare FS_List (Path.s, *Callback) ; Cb(Success, JSON array)
|
||||
Declare FS_Stat (Path.s, *Callback) ; Cb(Success, JSON object)
|
||||
|
||||
; ── Notifications (requires notify) ───────────────────────────────────
|
||||
Declare Notify_Toast (Message.s, Type.i = #Info) ; fire-and-forget
|
||||
Declare Notify_Confirm (Title_.s, Message.s, *Callback) ; Cb(Result.i)
|
||||
EndDeclareModule
|
||||
|
||||
Module KUMOS
|
||||
EnableExplicit
|
||||
|
||||
; Inject the JS runtime once, guarded so multiple IncludeFile calls are safe.
|
||||
Procedure Init()
|
||||
!if (window._kumos_sb) { return; }
|
||||
!window._kumos_sb = {
|
||||
! pending: {},
|
||||
! uuid: function() {
|
||||
! return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
|
||||
! var r = Math.random() * 16 | 0;
|
||||
! return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
|
||||
! });
|
||||
! },
|
||||
! send: function(action, args, onSuccess, onError) {
|
||||
! var kmid = window._kumos_sb.uuid();
|
||||
! var timer = setTimeout(function() {
|
||||
! var p = window._kumos_sb.pending[kmid];
|
||||
! if (p) { delete window._kumos_sb.pending[kmid]; p.onError('Timeout: ' + action); }
|
||||
! }, 15000);
|
||||
! window._kumos_sb.pending[kmid] = { onSuccess: onSuccess, onError: onError, timer: timer };
|
||||
! window.parent.postMessage(
|
||||
! JSON.stringify({ kmid: kmid, action: action, args: args || {} }), '*'
|
||||
! );
|
||||
! }
|
||||
!};
|
||||
!window.addEventListener('message', function(e) {
|
||||
! if (e.source !== window.parent) { return; }
|
||||
! var msg;
|
||||
! try { msg = JSON.parse(e.data); } catch(ex) { return; }
|
||||
! if (!msg || !msg.kmid) { return; }
|
||||
! var p = window._kumos_sb.pending[msg.kmid];
|
||||
! if (!p) { return; }
|
||||
! clearTimeout(p.timer);
|
||||
! delete window._kumos_sb.pending[msg.kmid];
|
||||
! if (msg.success) {
|
||||
! var data = msg.data;
|
||||
! if (data === null || data === undefined) { data = ''; }
|
||||
! else if (typeof data === 'object') { data = JSON.stringify(data); }
|
||||
! else if (typeof data === 'boolean') { data = data ? 'true' : 'false'; }
|
||||
! else { data = String(data); }
|
||||
! p.onSuccess(data);
|
||||
! } else {
|
||||
! p.onError(msg.error || 'Error');
|
||||
! }
|
||||
!});
|
||||
EndProcedure
|
||||
|
||||
; ── Internal send helper ──────────────────────────────────────────────────
|
||||
; *Callback must be Procedure Cb(Success.i, Data.s)
|
||||
; *ConfirmCallback must be Procedure Cb(Result.i) [used only for confirm]
|
||||
|
||||
Procedure _Send(Action.s, ArgsJSON.s, *Callback)
|
||||
! var cb = p_callback;
|
||||
!window._kumos_sb.send(
|
||||
! v_action,
|
||||
! (v_argsjson ? JSON.parse(v_argsjson) : {}),
|
||||
! function(data) { cb(1, data); },
|
||||
! function(err) { cb(0, err); }
|
||||
!);
|
||||
EndProcedure
|
||||
|
||||
; ── Args builders ─────────────────────────────────────────────────────────
|
||||
|
||||
Procedure.s _PathArgs(Path.s)
|
||||
ProcedureReturn ~"{\"path\":\"" + ReplaceString(Path, ~"\"", ~"\\\"") + ~"\"}"
|
||||
EndProcedure
|
||||
|
||||
Procedure.s _PathContentArgs(Path.s, Content.s)
|
||||
ProcedureReturn ~"{\"path\":\"" + ReplaceString(Path, ~"\"", ~"\\\"") + ~"\"," +
|
||||
~"\"content\":\"" + ReplaceString(Content, ~"\"", ~"\\\"") + ~"\"}"
|
||||
EndProcedure
|
||||
|
||||
Procedure.s _TitleMsgArgs(Title_.s, Message.s)
|
||||
ProcedureReturn ~"{\"title\":\"" + ReplaceString(Title_, ~"\"", ~"\\\"") + ~"\"," +
|
||||
~"\"message\":\"" + ReplaceString(Message, ~"\"", ~"\\\"") + ~"\"}"
|
||||
EndProcedure
|
||||
|
||||
Procedure.s _TypeStr(Type.i)
|
||||
Select Type
|
||||
Case #Success : ProcedureReturn "success"
|
||||
Case #Warning : ProcedureReturn "warning"
|
||||
Case #Error : ProcedureReturn "error"
|
||||
Default : ProcedureReturn "info"
|
||||
EndSelect
|
||||
EndProcedure
|
||||
|
||||
; ── Lifecycle ─────────────────────────────────────────────────────────────
|
||||
|
||||
Procedure Ready(*Callback)
|
||||
_Send("window.ready", "{}", *Callback)
|
||||
EndProcedure
|
||||
|
||||
Procedure Window_SetTitle(Title.s)
|
||||
; Fire-and-forget — no callback needed
|
||||
! window._kumos_sb.send('window.setTitle',
|
||||
! { title: v_title }, function(){}, function(){});
|
||||
EndProcedure
|
||||
|
||||
Procedure Window_Close()
|
||||
! window._kumos_sb.send('window.close', {}, function(){}, function(){});
|
||||
EndProcedure
|
||||
|
||||
; ── Storage ───────────────────────────────────────────────────────────────
|
||||
|
||||
Procedure Storage_Read(Path.s, *Callback)
|
||||
_Send("storage.read", _PathArgs(Path), *Callback)
|
||||
EndProcedure
|
||||
|
||||
Procedure Storage_Write(Path.s, Content.s, *Callback)
|
||||
_Send("storage.write", _PathContentArgs(Path, Content), *Callback)
|
||||
EndProcedure
|
||||
|
||||
Procedure Storage_List(Path.s, *Callback)
|
||||
_Send("storage.list", _PathArgs(Path), *Callback)
|
||||
EndProcedure
|
||||
|
||||
Procedure Storage_Stat(Path.s, *Callback)
|
||||
_Send("storage.stat", _PathArgs(Path), *Callback)
|
||||
EndProcedure
|
||||
|
||||
Procedure Storage_Mkdir(Path.s, *Callback)
|
||||
_Send("storage.mkdir", _PathArgs(Path), *Callback)
|
||||
EndProcedure
|
||||
|
||||
Procedure Storage_Delete(Path.s, *Callback)
|
||||
_Send("storage.delete", _PathArgs(Path), *Callback)
|
||||
EndProcedure
|
||||
|
||||
; ── User filesystem ───────────────────────────────────────────────────────
|
||||
|
||||
Procedure FS_Read(Path.s, *Callback)
|
||||
_Send("fs.read", _PathArgs(Path), *Callback)
|
||||
EndProcedure
|
||||
|
||||
Procedure FS_Write(Path.s, Content.s, *Callback)
|
||||
_Send("fs.write", _PathContentArgs(Path, Content), *Callback)
|
||||
EndProcedure
|
||||
|
||||
Procedure FS_List(Path.s, *Callback)
|
||||
_Send("fs.list", _PathArgs(Path), *Callback)
|
||||
EndProcedure
|
||||
|
||||
Procedure FS_Stat(Path.s, *Callback)
|
||||
_Send("fs.stat", _PathArgs(Path), *Callback)
|
||||
EndProcedure
|
||||
|
||||
; ── Notifications ─────────────────────────────────────────────────────────
|
||||
|
||||
Procedure Notify_Toast(Message.s, Type.i = #Info)
|
||||
Protected Args.s = ~"{\"message\":\"" + ReplaceString(Message, ~"\"", ~"\\\"") + ~"\"," +
|
||||
~"\"type\":\"" + _TypeStr(Type) + ~"\"}"
|
||||
! window._kumos_sb.send('notify.toast',
|
||||
! JSON.parse(v_args), function(){}, function(){});
|
||||
EndProcedure
|
||||
|
||||
; *Callback must be Procedure Cb(Result.i) — 1 = OK, 0 = Cancel
|
||||
Procedure Notify_Confirm(Title_.s, Message.s, *Callback)
|
||||
Protected Args.s = _TitleMsgArgs(Title_, Message)
|
||||
! var cb = p_callback;
|
||||
!window._kumos_sb.send(
|
||||
! 'notify.confirm',
|
||||
! JSON.parse(v_args),
|
||||
! function(data) { cb(data === 'true' ? 1 : 0); },
|
||||
! function() { cb(0); }
|
||||
!);
|
||||
EndProcedure
|
||||
|
||||
EndModule
|
||||
|
||||
; IDE Options = SpiderBasic 3.20 (Windows - x86)
|
||||
; CursorPosition = 1
|
||||
; Folding = ----
|
||||
; iOSAppOrientation = 0
|
||||
; AndroidAppCode = 0
|
||||
; AndroidAppOrientation = 0
|
||||
; EnableXP
|
||||
; DPIAware
|
||||
; CompileSourceDirectory
|
||||
123
SDK/SpiderBasic/Template.sb
Normal file
@ -0,0 +1,123 @@
|
||||
; ════════════════════════════════════════════════════════════════════════════
|
||||
; KUMOS App Template
|
||||
;
|
||||
; 1. Copy this file and KUMOS.sbi into a new folder.
|
||||
; 2. Edit manifest.json (also in this folder) with your app's details.
|
||||
; 3. Compile with SpiderBasic — output: index.html
|
||||
; 4. Zip index.html + manifest.json → yourapp.zip
|
||||
; 5. Install via App Manager.
|
||||
;
|
||||
; Checklist before shipping:
|
||||
; ☐ Unique reverse-domain id in manifest.json e.g. com.yourname.yourapp
|
||||
; ☐ Only request permissions you actually use
|
||||
; ☐ Call KUMOS::Init() before KUMOS::Ready()
|
||||
; ☐ All KUMOS calls must happen AFTER Ready() resolves
|
||||
; ════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
IncludeFile "KUMOS.sbi"
|
||||
|
||||
; ── State (your app's data goes here) ────────────────────────────────────────
|
||||
|
||||
Global Count.i = 0
|
||||
|
||||
; ── UI ───────────────────────────────────────────────────────────────────────
|
||||
|
||||
OpenWindow(0, 0, 0, 400, 300, "Loading…",
|
||||
#PB_Window_BorderLess | #PB_Window_ScreenCentered)
|
||||
SetWindowColor(0, RGB(22, 22, 34))
|
||||
|
||||
Global Label_Count.i = TextGadget(#PB_Any,
|
||||
0, 100, 400, 40, "…",
|
||||
#PB_Text_Center | #PB_Text_Border)
|
||||
SetGadgetColor(Label_Count, #PB_Gadget_FrontColor, RGB(100, 120, 255))
|
||||
SetGadgetColor(Label_Count, #PB_Gadget_BackColor, RGB(22, 22, 34))
|
||||
SetGadgetFont(Label_Count, LoadFont(#PB_Any, "sans-serif", 28))
|
||||
|
||||
Global Btn_Click.i = ButtonGadget(#PB_Any, 150, 160, 100, 32, "Click me")
|
||||
Global Btn_Toast.i = ButtonGadget(#PB_Any, 50, 210, 130, 28, "Toast")
|
||||
Global Btn_Confirm.i= ButtonGadget(#PB_Any, 220, 210, 130, 28, "Confirm")
|
||||
|
||||
; ── Helpers ───────────────────────────────────────────────────────────────────
|
||||
|
||||
Procedure UpdateUI()
|
||||
SetGadgetText(Label_Count, Str(Count))
|
||||
EndProcedure
|
||||
|
||||
; ── Storage callbacks ─────────────────────────────────────────────────────────
|
||||
|
||||
Procedure OnSaved(Success.i, Data.s)
|
||||
If Not Success
|
||||
KUMOS::Notify_Toast("Save failed: " + Data, KUMOS::#Warning)
|
||||
EndIf
|
||||
EndProcedure
|
||||
|
||||
Procedure OnLoaded(Success.i, Data.s)
|
||||
If Success
|
||||
Protected N.i = Val(Data)
|
||||
If N > 0 : Count = N : UpdateUI() : EndIf
|
||||
EndIf
|
||||
; File missing on first launch is normal — just start from zero.
|
||||
EndProcedure
|
||||
|
||||
Procedure SaveCount()
|
||||
KUMOS::Storage_Write("/count.txt", Str(Count), @OnSaved())
|
||||
EndProcedure
|
||||
|
||||
; ── Button events ─────────────────────────────────────────────────────────────
|
||||
|
||||
Procedure OnConfirmResult(Result.i)
|
||||
If Result
|
||||
KUMOS::Notify_Toast("You clicked OK!", KUMOS::#Success)
|
||||
Else
|
||||
KUMOS::Notify_Toast("You clicked Cancel.", KUMOS::#Info)
|
||||
EndIf
|
||||
EndProcedure
|
||||
|
||||
BindGadgetEvent(Btn_Click, @Clicked())
|
||||
Procedure Clicked()
|
||||
Count + 1
|
||||
UpdateUI()
|
||||
SaveCount()
|
||||
EndProcedure
|
||||
|
||||
BindGadgetEvent(Btn_Toast, @ToastClicked())
|
||||
Procedure ToastClicked()
|
||||
KUMOS::Notify_Toast("Hello from SpiderBasic!", KUMOS::#Success)
|
||||
EndProcedure
|
||||
|
||||
BindGadgetEvent(Btn_Confirm, @ConfirmClicked())
|
||||
Procedure ConfirmClicked()
|
||||
KUMOS::Notify_Confirm("Are you sure?", "This is a confirm dialog.", @OnConfirmResult())
|
||||
EndProcedure
|
||||
|
||||
; ── Boot: always KUMOS::Init() then KUMOS::Ready() ────────────────────────────
|
||||
|
||||
Procedure OnReady(Success.i, Data.s)
|
||||
If Not Success
|
||||
; Running outside KUMO.S — useful for testing in a plain browser
|
||||
SetWindowTitle(0, "Template App (standalone)")
|
||||
UpdateUI()
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
|
||||
; Set the window title via the shell
|
||||
KUMOS::Window_SetTitle("Template App")
|
||||
|
||||
; Load persisted state
|
||||
KUMOS::Storage_Read("/count.txt", @OnLoaded())
|
||||
|
||||
UpdateUI()
|
||||
EndProcedure
|
||||
|
||||
KUMOS::Init()
|
||||
KUMOS::Ready(@OnReady())
|
||||
|
||||
; IDE Options = SpiderBasic 3.20 (Windows - x86)
|
||||
; CursorPosition = 1
|
||||
; Folding = --
|
||||
; iOSAppOrientation = 0
|
||||
; AndroidAppCode = 0
|
||||
; AndroidAppOrientation = 0
|
||||
; EnableXP
|
||||
; DPIAware
|
||||
; CompileSourceDirectory
|
||||
408
Server/Includes/AppStore.pbi
Normal file
@ -0,0 +1,408 @@
|
||||
Module AppStore
|
||||
EnableExplicit
|
||||
|
||||
; Constants
|
||||
#AppsDir = "apps/"
|
||||
#TempDir = "tmp/"
|
||||
#ValidPermCount = 4
|
||||
|
||||
; Variables
|
||||
Global Dim _ValidPerms.s(#ValidPermCount - 1)
|
||||
|
||||
_ValidPerms(0) = "storage"
|
||||
_ValidPerms(1) = "fs.read"
|
||||
_ValidPerms(2) = "fs.write"
|
||||
_ValidPerms(3) = "notify"
|
||||
|
||||
;- Private declarations
|
||||
Declare _IsValidAppID(AppID.s)
|
||||
Declare _IsValidPermission(Perm.s)
|
||||
Declare _IsValidFilePath(Path.s)
|
||||
Declare.s _BundleDir(UserID, AppID.s)
|
||||
Declare _EnsureDir(Path.s)
|
||||
Declare _DeleteDirRecursive(Path.s)
|
||||
Declare _WipeBundle(UserID, AppID.s)
|
||||
Declare _WipeStorage(UserID, AppID.s)
|
||||
Declare _ExtractZip(ZipFile.s, DestDir.s)
|
||||
Declare.s _ReadManifestFromZip(ZipFile.s)
|
||||
Declare.s _ValidateManifest(JSON.s, *OutAppID.String, *OutPerms.String)
|
||||
|
||||
;- Public procedures
|
||||
Procedure Init()
|
||||
If FileSize(#AppsDir) <> -2 : CreateDirectory(#AppsDir) : EndIf
|
||||
If FileSize(#TempDir) <> -2 : CreateDirectory(#TempDir) : EndIf
|
||||
EndProcedure
|
||||
|
||||
; GET /api/apps/list
|
||||
Procedure HandleList(*Request)
|
||||
Protected Username.s = Auth::GetSessionUser(*Request)
|
||||
If Username = ""
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Unauthorized\"}", "401 Unauthorized")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
General::RespondJSON(*Request, Database::AppList(Database::FindUser(Username)))
|
||||
EndProcedure
|
||||
|
||||
; POST /api/apps/install body: url=<zip url>
|
||||
Procedure HandleInstall(*Request)
|
||||
Protected UserID, HiddenDir, Home, AppsRoot
|
||||
Protected Username.s, URL.s, TempZip.s, ManifestJSON.s, ErrMsg.s, AppID.s, BundleDir.s, Perms.s
|
||||
Protected OutAppID.String, OutPerms.String
|
||||
|
||||
Username = Auth::GetSessionUser(*Request)
|
||||
If Username = ""
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Unauthorized\"}", "401 Unauthorized")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
UserID = Database::FindUser(Username)
|
||||
|
||||
URL = General::GetPostField(*Request, "url")
|
||||
If URL = ""
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Missing url\"}")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
If Left(URL, 7) <> "http://" And Left(URL, 8) <> "https://"
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"URL must begin with http:// or https://\"}")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
|
||||
TempZip = #TempDir + "pkg_" + UserID + "_" + ElapsedMilliseconds() + ".zip"
|
||||
|
||||
If Not ReceiveHTTPFile(URL, TempZip)
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Failed to download package from URL\"}")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
|
||||
; Read and validate manifest before touching anything
|
||||
ManifestJSON = _ReadManifestFromZip(TempZip)
|
||||
If ManifestJSON = ""
|
||||
DeleteFile(TempZip)
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"manifest.json not found or unreadable in package\"}")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
|
||||
ErrMsg = _ValidateManifest(ManifestJSON, @OutAppID, @OutPerms)
|
||||
If ErrMsg <> ""
|
||||
DeleteFile(TempZip)
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"" + ReplaceString(ErrMsg, ~"\"", ~"\\\"") + ~"\"}")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
|
||||
AppID = OutAppID\s
|
||||
Perms = OutPerms\s
|
||||
|
||||
If Database::AppExists(UserID, AppID)
|
||||
_WipeBundle(UserID, AppID)
|
||||
Database::AppUninstall(UserID, AppID)
|
||||
EndIf
|
||||
|
||||
BundleDir = _BundleDir(UserID, AppID)
|
||||
If Not _EnsureDir(BundleDir)
|
||||
DeleteFile(TempZip)
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Could not create app directory\"}")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
|
||||
If Not _ExtractZip(TempZip, BundleDir)
|
||||
DeleteFile(TempZip)
|
||||
_WipeBundle(UserID, AppID)
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Failed to extract package\"}")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
|
||||
DeleteFile(TempZip)
|
||||
|
||||
If Not Database::AppInstall(UserID, AppID, ManifestJSON, Perms)
|
||||
_WipeBundle(UserID, AppID)
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Failed to register app in database\"}")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
|
||||
HiddenDir = Database::FSResolve(UserID, "/.apps/" + AppID)
|
||||
If HiddenDir = 0
|
||||
AppsRoot = Database::FSResolve(UserID, "/.apps")
|
||||
If AppsRoot = 0
|
||||
Home = Database::FSGetOrCreateHome(UserID)
|
||||
AppsRoot = Database::FSMkdir(UserID, Home, ".apps")
|
||||
EndIf
|
||||
If AppsRoot > 0
|
||||
Database::FSMkdir(UserID, AppsRoot, AppID)
|
||||
EndIf
|
||||
EndIf
|
||||
|
||||
General::RespondJSON(*Request, ~"{\"success\":true,\"app_id\":\"" + ReplaceString(AppID, ~"\"", ~"\\\"") + ~"\"}")
|
||||
EndProcedure
|
||||
|
||||
; POST /api/apps/uninstall body: app_id=... [&keep_data=1]
|
||||
Procedure HandleUninstall(*Request)
|
||||
Protected UserID, KeepData
|
||||
Protected Username.s, AppID.s
|
||||
|
||||
Username = Auth::GetSessionUser(*Request)
|
||||
If Username = ""
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Unauthorized\"}", "401 Unauthorized")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
UserID = Database::FindUser(Username)
|
||||
|
||||
AppID = General::GetPostField(*Request, "app_id")
|
||||
KeepData = Val(General::GetPostField(*Request, "keep_data"))
|
||||
|
||||
If AppID = "" Or Not _IsValidAppID(AppID)
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Invalid or missing app_id\"}")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
If Not Database::AppExists(UserID, AppID)
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"App not installed\"}", "404 Not Found")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
|
||||
Database::AppUninstall(UserID, AppID)
|
||||
_WipeBundle(UserID, AppID)
|
||||
|
||||
If Not KeepData : _WipeStorage(UserID, AppID) : EndIf
|
||||
|
||||
General::RespondJSON(*Request, ~"{\"success\":true}")
|
||||
EndProcedure
|
||||
|
||||
; GET /api/apps/{app_id}/{filepath}
|
||||
Procedure HandleServeFile(*Request, AppID.s, FilePath.s)
|
||||
Protected UserID
|
||||
Protected Username.s, FullPath.s
|
||||
|
||||
Username = Auth::GetSessionUser(*Request)
|
||||
If Username = ""
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Unauthorized\"}", "401 Unauthorized")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
|
||||
If Not _IsValidAppID(AppID)
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Bad Request\"}", "400 Bad Request")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
|
||||
If Not _IsValidFilePath(FilePath)
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Forbidden\"}", "403 Forbidden")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
|
||||
UserID = Database::FindUser(Username)
|
||||
If Not Database::AppExists(UserID, AppID)
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Not found\"}", "404 Not Found")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
|
||||
FullPath = _BundleDir(UserID, AppID) + FilePath
|
||||
If FileSize(FullPath) < 0
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Not found\"}", "404 Not Found")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
|
||||
If Not FastCGI::RespondFile(*Request, FullPath)
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Read error\"}", "500 Internal Server Error")
|
||||
EndIf
|
||||
EndProcedure
|
||||
|
||||
;- Private procedures
|
||||
Procedure _IsValidAppID(AppID.s)
|
||||
Protected Length, i
|
||||
Protected c.s
|
||||
|
||||
Length = Len(AppID)
|
||||
If Length = 0 Or Length > 64 : ProcedureReturn #False : EndIf
|
||||
For i = 1 To Length
|
||||
c = Mid(AppID, i, 1)
|
||||
If Not ((c >= "a" And c <= "z") Or (c >= "A" And c <= "Z") Or (c >= "0" And c <= "9") Or c = "." Or c = "-" Or c = "_")
|
||||
ProcedureReturn #False
|
||||
EndIf
|
||||
Next
|
||||
ProcedureReturn #True
|
||||
EndProcedure
|
||||
|
||||
Procedure _IsValidPermission(Perm.s)
|
||||
Protected i
|
||||
For i = 0 To #ValidPermCount - 1
|
||||
If _ValidPerms(i) = Perm : ProcedureReturn #True : EndIf
|
||||
Next
|
||||
ProcedureReturn #False
|
||||
EndProcedure
|
||||
|
||||
Procedure _IsValidFilePath(Path.s)
|
||||
If Path = "" : ProcedureReturn #False : EndIf
|
||||
If Left(Path, 1) = "/" Or Left(Path, 1) = "\" : ProcedureReturn #False : EndIf
|
||||
If FindString(Path, "..") : ProcedureReturn #False : EndIf
|
||||
If FindString(Path, "//") Or FindString(Path, "\\") : ProcedureReturn #False : EndIf
|
||||
ProcedureReturn #True
|
||||
EndProcedure
|
||||
|
||||
Procedure.s _BundleDir(UserID, AppID.s)
|
||||
ProcedureReturn #AppsDir + UserID + "/" + AppID + "/"
|
||||
EndProcedure
|
||||
|
||||
Procedure _EnsureDir(Path.s)
|
||||
Protected Parts, i
|
||||
Protected Current.s, Seg.s, Probe.s
|
||||
|
||||
Path = ReplaceString(Path, "\", "/")
|
||||
If Right(Path, 1) <> "/" : Path + "/" : EndIf
|
||||
|
||||
Parts = CountString(Path, "/")
|
||||
For i = 1 To Parts
|
||||
Seg = StringField(Path, i, "/")
|
||||
If Seg = "" : Continue : EndIf
|
||||
Current + Seg + "/"
|
||||
Probe = Left(Current, Len(Current) - 1)
|
||||
If FileSize(Probe) <> -2
|
||||
If Not CreateDirectory(Probe) : ProcedureReturn #False : EndIf
|
||||
EndIf
|
||||
Next
|
||||
ProcedureReturn #True
|
||||
EndProcedure
|
||||
|
||||
; Built-in DeleteDirectory with #PB_FileSystem_Recursive handles the walk for us
|
||||
Procedure _DeleteDirRecursive(Path.s)
|
||||
If Right(Path, 1) = "/" : Path = Left(Path, Len(Path) - 1) : EndIf
|
||||
DeleteDirectory(Path, "", #PB_FileSystem_Recursive)
|
||||
EndProcedure
|
||||
|
||||
Procedure _WipeBundle(UserID, AppID.s)
|
||||
_DeleteDirRecursive(_BundleDir(UserID, AppID))
|
||||
EndProcedure
|
||||
|
||||
Procedure _WipeStorage(UserID, AppID.s)
|
||||
Protected NodeID
|
||||
Protected VPath.s = "/.apps/" + AppID
|
||||
NodeID = Database::FSResolve(UserID, VPath)
|
||||
If NodeID > 0 : Database::FSDelete(NodeID) : EndIf
|
||||
EndProcedure
|
||||
|
||||
Procedure _ExtractZip(ZipFile.s, DestDir.s)
|
||||
Protected OK, LastSlash, Pos
|
||||
Protected EntryName.s
|
||||
|
||||
If Not OpenPack(0, ZipFile, #PB_PackerPlugin_Zip) : ProcedureReturn #False : EndIf
|
||||
If Not ExaminePack(0) : ClosePack(0) : ProcedureReturn #False : EndIf
|
||||
|
||||
OK = #True
|
||||
While NextPackEntry(0)
|
||||
EntryName = PackEntryName(0)
|
||||
|
||||
If Not _IsValidFilePath(EntryName) : OK = #False : Break : EndIf
|
||||
|
||||
; Directory entry — just ensure it exists
|
||||
If Right(EntryName, 1) = "/"
|
||||
_EnsureDir(DestDir + EntryName)
|
||||
Continue
|
||||
EndIf
|
||||
|
||||
; Ensure parent directory exists
|
||||
LastSlash = 0
|
||||
Pos = FindString(EntryName, "/")
|
||||
While Pos > 0
|
||||
LastSlash = Pos
|
||||
Pos = FindString(EntryName, "/", Pos + 1)
|
||||
Wend
|
||||
If LastSlash > 0 : _EnsureDir(DestDir + Left(EntryName, LastSlash)) : EndIf
|
||||
|
||||
If Not UncompressPackFile(0, DestDir + EntryName, EntryName)
|
||||
OK = #False : Break
|
||||
EndIf
|
||||
Wend
|
||||
|
||||
ClosePack(0)
|
||||
ProcedureReturn OK
|
||||
EndProcedure
|
||||
|
||||
Procedure.s _ReadManifestFromZip(ZipFile.s)
|
||||
Protected Found, Size, FileID, *Buf
|
||||
Protected TempPath.s, Result.s
|
||||
|
||||
If Not OpenPack(0, ZipFile, #PB_PackerPlugin_Zip) : ProcedureReturn "" : EndIf
|
||||
|
||||
TempPath = #TempDir + "manifest_" + ElapsedMilliseconds() + ".json"
|
||||
|
||||
If ExaminePack(0)
|
||||
While NextPackEntry(0)
|
||||
If PackEntryName(0) = "manifest.json"
|
||||
Found = Bool(UncompressPackFile(0, TempPath, "manifest.json"))
|
||||
Break
|
||||
EndIf
|
||||
Wend
|
||||
EndIf
|
||||
ClosePack(0)
|
||||
|
||||
If Not Found : ProcedureReturn "" : EndIf
|
||||
|
||||
Size = FileSize(TempPath)
|
||||
If Size > 0 And Size < 65536 ; sanity cap: 64 KB
|
||||
FileID = ReadFile(#PB_Any, TempPath, #PB_File_SharedRead)
|
||||
If FileID
|
||||
*Buf = AllocateMemory(Size + 1)
|
||||
If *Buf
|
||||
ReadData(FileID, *Buf, Size)
|
||||
PokeB(*Buf + Size, 0)
|
||||
Result = PeekS(*Buf, -1, #PB_UTF8)
|
||||
FreeMemory(*Buf)
|
||||
EndIf
|
||||
CloseFile(FileID)
|
||||
EndIf
|
||||
EndIf
|
||||
|
||||
DeleteFile(TempPath)
|
||||
ProcedureReturn Result
|
||||
EndProcedure
|
||||
|
||||
Procedure.s _ValidateManifest(JSON.s, *OutAppID.String, *OutPerms.String)
|
||||
Protected Root, PermsNode, PermCount, i
|
||||
Protected AppID.s, Name_.s, Entry.s, PermsJSON.s, Perm.s
|
||||
|
||||
If Not ParseJSON(0, JSON) : ProcedureReturn "Invalid JSON in manifest" : EndIf
|
||||
|
||||
Root = JSONValue(0)
|
||||
AppID = GetJSONString(GetJSONMember(Root, "id"))
|
||||
Name_ = GetJSONString(GetJSONMember(Root, "name"))
|
||||
Entry = GetJSONString(GetJSONMember(Root, "entry"))
|
||||
|
||||
If AppID = "" Or Name_ = "" Or Entry = ""
|
||||
FreeJSON(0)
|
||||
ProcedureReturn "manifest.json missing required field(s): id, name, entry"
|
||||
EndIf
|
||||
|
||||
If Not _IsValidAppID(AppID)
|
||||
FreeJSON(0)
|
||||
ProcedureReturn "Invalid app id '" + AppID + "' (use reverse-domain format)"
|
||||
EndIf
|
||||
|
||||
If Not _IsValidFilePath(Entry)
|
||||
FreeJSON(0)
|
||||
ProcedureReturn "Invalid entry path"
|
||||
EndIf
|
||||
|
||||
PermsNode = GetJSONMember(Root, "permissions")
|
||||
PermCount = JSONArraySize(PermsNode)
|
||||
PermsJSON = ~"[\"storage\""
|
||||
|
||||
For i = 0 To PermCount - 1
|
||||
Perm = GetJSONString(GetJSONElement(PermsNode, i))
|
||||
If Perm = "" Or Perm = "storage" : Continue : EndIf
|
||||
If Not _IsValidPermission(Perm)
|
||||
FreeJSON(0)
|
||||
ProcedureReturn "Unknown permission '" + Perm + "'"
|
||||
EndIf
|
||||
PermsJSON + ~",\"" + Perm + ~"\""
|
||||
Next
|
||||
PermsJSON + "]"
|
||||
|
||||
*OutAppID\s = AppID
|
||||
*OutPerms\s = PermsJSON
|
||||
|
||||
FreeJSON(0)
|
||||
ProcedureReturn ""
|
||||
EndProcedure
|
||||
|
||||
EndModule
|
||||
; IDE Options = PureBasic 6.30 (Windows - x64)
|
||||
; CursorPosition = 402
|
||||
; Folding = BAg
|
||||
; EnableXP
|
||||
; DPIAware
|
||||
121
Server/Includes/Auth.pbi
Normal file
@ -0,0 +1,121 @@
|
||||
Module Auth
|
||||
EnableExplicit
|
||||
|
||||
;- Private helpers
|
||||
Procedure.s GetFormField(PostData.s, Field.s)
|
||||
; Parse a single field from application/x-www-form-urlencoded body
|
||||
Protected Count = CountString(PostData, "&") + 1, i
|
||||
Protected Pair.s, Key.s
|
||||
|
||||
For i = 1 To Count
|
||||
Pair = StringField(PostData, i, "&")
|
||||
Key = StringField(Pair, 1, "=")
|
||||
If Key = Field
|
||||
ProcedureReturn URLDecoder(StringField(Pair, 2, "="))
|
||||
EndIf
|
||||
Next
|
||||
ProcedureReturn ""
|
||||
EndProcedure
|
||||
|
||||
Procedure SetSessionCookie(*Request, Token.s)
|
||||
FastCGI::WriteResponseHeader(*Request, "Set-Cookie",
|
||||
#SESSION_COOKIE + "=" + Token +
|
||||
"; Path=/; HttpOnly; SameSite=Strict; Max-Age=" + #SESSION_MAX_AGE)
|
||||
EndProcedure
|
||||
|
||||
Procedure ClearSessionCookie(*Request)
|
||||
FastCGI::WriteResponseHeader(*Request, "Set-Cookie",
|
||||
#SESSION_COOKIE + "=; Path=/; HttpOnly; SameSite=Strict; Max-Age=0")
|
||||
EndProcedure
|
||||
|
||||
;- Public handlers
|
||||
Procedure HandleLogin(*Request)
|
||||
Protected PostData.s = FastCGI::GetPostData(*Request)
|
||||
Protected Username.s = GetFormField(PostData, "username")
|
||||
Protected Password.s = GetFormField(PostData, "password")
|
||||
|
||||
If Username = "" Or Password = ""
|
||||
General::RespondJSON(*Request, ~"{\"success\":false,\"error\":\"Missing credentials\"}")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
|
||||
Protected ValidUser.s = Database::ValidateCredentials(Username, Password)
|
||||
|
||||
If ValidUser <> ""
|
||||
Protected UserID.i = Database::FindUser(ValidUser)
|
||||
Protected Token.s = Database::CreateSession(UserID, ValidUser)
|
||||
SetSessionCookie(*Request, Token)
|
||||
FastCGI::WriteResponseHeader(*Request, "Content-Type", "application/json; charset=utf-8")
|
||||
FastCGI::WriteResponseHeader(*Request, "Cache-Control", "no-cache, no-store")
|
||||
FastCGI::WriteResponseString(*Request, ~"{\"success\":true,\"username\":\"" + ValidUser + ~"\"}")
|
||||
FastCGI::FinishResponse(*Request)
|
||||
Else
|
||||
; Uniform error - don't reveal which field was wrong
|
||||
General::RespondJSON(*Request, ~"{\"success\":false,\"error\":\"Invalid username or password\"}")
|
||||
EndIf
|
||||
EndProcedure
|
||||
|
||||
Procedure HandleLogout(*Request)
|
||||
Protected Token.s = FastCGI::GetCookie(*Request, #SESSION_COOKIE)
|
||||
If Token <> ""
|
||||
Database::DeleteSession(Token)
|
||||
EndIf
|
||||
ClearSessionCookie(*Request)
|
||||
General::RespondJSON(*Request, ~"{\"success\":true}")
|
||||
EndProcedure
|
||||
|
||||
Procedure HandleCheck(*Request)
|
||||
Protected Token.s = FastCGI::GetCookie(*Request, #SESSION_COOKIE)
|
||||
Protected Username.s = ""
|
||||
|
||||
If Token <> ""
|
||||
Username = Database::ValidateSession(Token)
|
||||
EndIf
|
||||
|
||||
If Username <> ""
|
||||
General::RespondJSON(*Request, ~"{\"authenticated\":true,\"username\":\"" + Username + ~"\"}")
|
||||
Else
|
||||
General::RespondJSON(*Request, ~"{\"authenticated\":false}")
|
||||
EndIf
|
||||
EndProcedure
|
||||
|
||||
Procedure.s GetSessionUser(*Request)
|
||||
Protected Token.s = FastCGI::GetCookie(*Request, #SESSION_COOKIE)
|
||||
If Token <> ""
|
||||
ProcedureReturn Database::ValidateSession(Token)
|
||||
EndIf
|
||||
ProcedureReturn ""
|
||||
EndProcedure
|
||||
|
||||
Procedure HandleChangePassword(*Request)
|
||||
Protected Username.s = GetSessionUser(*Request)
|
||||
If Username = ""
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Unauthorized\"}", "401 Unauthorized")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
|
||||
Protected CurrentPwd.s = General::GetPostField(*Request, "current_password")
|
||||
Protected NewPwd.s = General::GetPostField(*Request, "new_password")
|
||||
|
||||
If CurrentPwd = "" Or NewPwd = ""
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Missing fields\"}")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
|
||||
If Database::ValidateCredentials(Username, CurrentPwd) = ""
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Current password is incorrect\"}")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
|
||||
Protected UserID.i = Database::FindUser(Username)
|
||||
Database::ChangePassword(UserID, NewPwd)
|
||||
General::RespondJSON(*Request, ~"{\"success\":true}")
|
||||
EndProcedure
|
||||
|
||||
EndModule
|
||||
|
||||
; IDE Options = PureBasic 6.30 (Windows - x64)
|
||||
; CursorPosition = 29
|
||||
; Folding = B5
|
||||
; EnableXP
|
||||
; DPIAware
|
||||
420
Server/Includes/Database.pbi
Normal file
@ -0,0 +1,420 @@
|
||||
Module Database
|
||||
EnableExplicit
|
||||
|
||||
UseSQLiteDatabase()
|
||||
|
||||
; Private constants
|
||||
#DB = 0
|
||||
|
||||
; Private procedures
|
||||
Procedure.s SHA256(text.s)
|
||||
Protected *Buf, Len.i, Hash.s
|
||||
Len = StringByteLength(text, #PB_UTF8)
|
||||
If Len = 0 : ProcedureReturn "" : EndIf
|
||||
*Buf = AllocateMemory(Len)
|
||||
If *Buf
|
||||
PokeS(*Buf, text, -1, #PB_UTF8 | #PB_String_NoZero)
|
||||
Hash = LCase(Fingerprint(*Buf, Len, #PB_Cipher_SHA2, 256))
|
||||
FreeMemory(*Buf)
|
||||
EndIf
|
||||
ProcedureReturn Hash
|
||||
EndProcedure
|
||||
|
||||
Procedure.s GenerateHex(Bytes.i)
|
||||
Protected Token.s, i
|
||||
For i = 1 To Bytes
|
||||
Token + RSet(Hex(Random(255)), 2, "0")
|
||||
Next
|
||||
ProcedureReturn LCase(Token)
|
||||
EndProcedure
|
||||
|
||||
Procedure.s JSONEscape(s.s)
|
||||
s = ReplaceString(s, "\", "\\")
|
||||
s = ReplaceString(s, ~"\"", ~"\\\"")
|
||||
s = ReplaceString(s, ~"\n", ~"\\n")
|
||||
s = ReplaceString(s, ~"\r", ~"\\r")
|
||||
s = ReplaceString(s, ~"\t", ~"\\t")
|
||||
ProcedureReturn s
|
||||
EndProcedure
|
||||
|
||||
;- Public procedures
|
||||
Procedure Init(Path.s)
|
||||
Protected TempFile.i
|
||||
|
||||
If FileSize(Path) = -1
|
||||
TempFile = CreateFile(#PB_Any, Path)
|
||||
CloseFile(TempFile)
|
||||
EndIf
|
||||
|
||||
If Not OpenDatabase(#DB, Path, "", "", #PB_Database_SQLite)
|
||||
ProcedureReturn #False
|
||||
EndIf
|
||||
|
||||
DatabaseUpdate(#DB, "CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT UNIQUE NOT NULL COLLATE NOCASE, password_hash TEXT NOT NULL, salt TEXT NOT NULL, created_at INTEGER NOT NULL)")
|
||||
DatabaseUpdate(#DB, "CREATE TABLE IF NOT EXISTS sessions (token TEXT PRIMARY KEY, user_id INTEGER NOT NULL, username TEXT NOT NULL, created_at INTEGER NOT NULL, expires_at INTEGER NOT NULL)")
|
||||
DatabaseUpdate(#DB, "CREATE TABLE IF NOT EXISTS installed_apps (id INTEGER PRIMARY KEY, user_id INTEGER NOT NULL, app_id TEXT NOT NULL, manifest TEXT NOT NULL, permissions TEXT NOT NULL, installed_at INTEGER NOT NULL, UNIQUE(user_id, app_id))")
|
||||
|
||||
ProcedureReturn #True
|
||||
EndProcedure
|
||||
|
||||
Procedure Close()
|
||||
If IsDatabase(#DB)
|
||||
CloseDatabase(#DB)
|
||||
EndIf
|
||||
EndProcedure
|
||||
|
||||
; User management
|
||||
Procedure UserCount()
|
||||
Protected Count = 0
|
||||
If DatabaseQuery(#DB, "SELECT COUNT(*) FROM users")
|
||||
If NextDatabaseRow(#DB) : Count = GetDatabaseLong(#DB, 0) : EndIf
|
||||
FinishDatabaseQuery(#DB)
|
||||
EndIf
|
||||
ProcedureReturn Count
|
||||
EndProcedure
|
||||
|
||||
Procedure FindUser(Username.s)
|
||||
Protected ID = 0
|
||||
SetDatabaseString(#DB, 0, Username)
|
||||
If DatabaseQuery(#DB, "SELECT id FROM users WHERE username = ? COLLATE NOCASE")
|
||||
If NextDatabaseRow(#DB) : ID = GetDatabaseLong(#DB, 0) : EndIf
|
||||
FinishDatabaseQuery(#DB)
|
||||
EndIf
|
||||
ProcedureReturn ID
|
||||
EndProcedure
|
||||
|
||||
Procedure CreateUser(Username.s, Password.s)
|
||||
Protected Salt.s = GenerateHex(16)
|
||||
Protected Hash.s = SHA256(Password + Salt)
|
||||
SetDatabaseString(#DB, 0, Username)
|
||||
SetDatabaseString(#DB, 1, Hash)
|
||||
SetDatabaseString(#DB, 2, Salt)
|
||||
SetDatabaseLong(#DB, 3, Date())
|
||||
ProcedureReturn DatabaseUpdate(#DB, "INSERT INTO users (username, password_hash, salt, created_at) VALUES (?, ?, ?, ?)")
|
||||
EndProcedure
|
||||
|
||||
Procedure ChangePassword(UserID.i, NewPassword.s)
|
||||
Protected Salt.s = GenerateHex(16)
|
||||
Protected Hash.s = SHA256(NewPassword + Salt)
|
||||
SetDatabaseString(#DB, 0, Hash)
|
||||
SetDatabaseString(#DB, 1, Salt)
|
||||
SetDatabaseLong(#DB, 2, UserID)
|
||||
DatabaseUpdate(#DB, "UPDATE users SET password_hash = ?, salt = ? WHERE id = ?")
|
||||
EndProcedure
|
||||
|
||||
Procedure.s ValidateCredentials(Username.s, Password.s)
|
||||
Protected StoredUser.s, Hash.s, Salt.s
|
||||
SetDatabaseString(#DB, 0, Username)
|
||||
If DatabaseQuery(#DB, "SELECT username, password_hash, salt FROM users WHERE username = ? COLLATE NOCASE")
|
||||
If NextDatabaseRow(#DB)
|
||||
StoredUser = GetDatabaseString(#DB, 0)
|
||||
Hash = GetDatabaseString(#DB, 1)
|
||||
Salt = GetDatabaseString(#DB, 2)
|
||||
EndIf
|
||||
FinishDatabaseQuery(#DB)
|
||||
EndIf
|
||||
If StoredUser = "" : ProcedureReturn "" : EndIf
|
||||
If SHA256(Password + Salt) = Hash : ProcedureReturn StoredUser : EndIf
|
||||
ProcedureReturn ""
|
||||
EndProcedure
|
||||
|
||||
Procedure.s CreateSession(UserID.i, Username.s)
|
||||
Protected Token.s = GenerateHex(32)
|
||||
Protected Now.i = Date()
|
||||
SetDatabaseString(#DB, 0, Token)
|
||||
SetDatabaseLong(#DB, 1, UserID)
|
||||
SetDatabaseString(#DB, 2, Username)
|
||||
SetDatabaseLong(#DB, 3, Now)
|
||||
SetDatabaseLong(#DB, 4, Now + #SESSION_DURATION)
|
||||
DatabaseUpdate(#DB, "INSERT OR REPLACE INTO sessions (token, user_id, username, created_at, expires_at) VALUES (?, ?, ?, ?, ?)")
|
||||
ProcedureReturn Token
|
||||
EndProcedure
|
||||
|
||||
Procedure.s ValidateSession(Token.s)
|
||||
Protected Username.s = ""
|
||||
If Len(Token) <> 64 : ProcedureReturn "" : EndIf
|
||||
SetDatabaseString(#DB, 0, Token)
|
||||
SetDatabaseLong(#DB, 1, Date())
|
||||
If DatabaseQuery(#DB, "SELECT username FROM sessions WHERE token = ? AND expires_at > ?")
|
||||
If NextDatabaseRow(#DB) : Username = GetDatabaseString(#DB, 0) : EndIf
|
||||
FinishDatabaseQuery(#DB)
|
||||
EndIf
|
||||
ProcedureReturn Username
|
||||
EndProcedure
|
||||
|
||||
Procedure DeleteSession(Token.s)
|
||||
SetDatabaseString(#DB, 0, Token)
|
||||
DatabaseUpdate(#DB, "DELETE FROM sessions WHERE token = ?")
|
||||
EndProcedure
|
||||
|
||||
Procedure CleanExpiredSessions()
|
||||
SetDatabaseLong(#DB, 0, Date())
|
||||
DatabaseUpdate(#DB, "DELETE FROM sessions WHERE expires_at <= ?")
|
||||
EndProcedure
|
||||
|
||||
;- File system
|
||||
Procedure.i FSInit()
|
||||
Protected Now.i = Date()
|
||||
DatabaseUpdate(#DB, "CREATE TABLE IF NOT EXISTS fs_nodes (id INTEGER PRIMARY KEY AUTOINCREMENT, owner_id INTEGER NOT NULL, parent_id INTEGER, name TEXT NOT NULL COLLATE NOCASE, is_dir INTEGER NOT NULL DEFAULT 0, mime_type TEXT NOT NULL DEFAULT 'application/octet-stream', size INTEGER NOT NULL DEFAULT 0, created_at INTEGER NOT NULL, modified_at INTEGER NOT NULL)")
|
||||
DatabaseUpdate(#DB, "CREATE UNIQUE INDEX IF NOT EXISTS idx_fs_unique ON fs_nodes(parent_id, name)")
|
||||
DatabaseUpdate(#DB, "CREATE INDEX IF NOT EXISTS idx_fs_owner ON fs_nodes(owner_id)")
|
||||
|
||||
; Shared root - owner_id 0, one row, idempotent
|
||||
SetDatabaseLong(#DB, 0, Now)
|
||||
SetDatabaseLong(#DB, 1, Now)
|
||||
DatabaseUpdate(#DB, "INSERT OR IGNORE INTO fs_nodes (owner_id, parent_id, name, is_dir, created_at, modified_at) VALUES (0, NULL, 'shared', 1, ?, ?)")
|
||||
|
||||
ProcedureReturn #True
|
||||
EndProcedure
|
||||
|
||||
Procedure.i FSGetOrCreateHome(UserID.i)
|
||||
Protected ID.i = 0, Now.i
|
||||
SetDatabaseLong(#DB, 0, UserID)
|
||||
If DatabaseQuery(#DB, "SELECT id FROM fs_nodes WHERE owner_id = ? AND parent_id IS NULL")
|
||||
If NextDatabaseRow(#DB) : ID = GetDatabaseLong(#DB, 0) : EndIf
|
||||
FinishDatabaseQuery(#DB)
|
||||
EndIf
|
||||
If ID = 0
|
||||
Now = Date()
|
||||
SetDatabaseLong(#DB, 0, UserID)
|
||||
SetDatabaseLong(#DB, 1, Now)
|
||||
SetDatabaseLong(#DB, 2, Now)
|
||||
DatabaseUpdate(#DB, "INSERT INTO fs_nodes (owner_id, parent_id, name, is_dir, created_at, modified_at) VALUES (?, NULL, 'home', 1, ?, ?)")
|
||||
If DatabaseQuery(#DB, "SELECT last_insert_rowid()")
|
||||
If NextDatabaseRow(#DB) : ID = GetDatabaseLong(#DB, 0) : EndIf
|
||||
FinishDatabaseQuery(#DB)
|
||||
EndIf
|
||||
EndIf
|
||||
ProcedureReturn ID
|
||||
EndProcedure
|
||||
|
||||
Procedure.i FSResolve(UserID.i, Path.s)
|
||||
Protected CurrentID.i, SegCount.i, i.i, Seg.s, CandID.i
|
||||
|
||||
While Left(Path, 1) = "/" : Path = Mid(Path, 2) : Wend
|
||||
While Right(Path, 1) = "/" : Path = Left(Path, Len(Path) - 1) : Wend
|
||||
|
||||
If Path = "shared" Or Left(Path, 7) = "shared/"
|
||||
If DatabaseQuery(#DB, "SELECT id FROM fs_nodes WHERE owner_id = 0 AND parent_id IS NULL")
|
||||
If NextDatabaseRow(#DB) : CurrentID = GetDatabaseLong(#DB, 0) : EndIf
|
||||
FinishDatabaseQuery(#DB)
|
||||
EndIf
|
||||
If Path = "shared" : ProcedureReturn CurrentID : EndIf
|
||||
Path = Mid(Path, 8) ; strip "shared/"
|
||||
Else
|
||||
CurrentID = FSGetOrCreateHome(UserID)
|
||||
If Path = "" : ProcedureReturn CurrentID : EndIf
|
||||
EndIf
|
||||
|
||||
If CurrentID = 0 : ProcedureReturn 0 : EndIf
|
||||
|
||||
SegCount = CountString(Path, "/") + 1
|
||||
For i = 1 To SegCount
|
||||
Seg = StringField(Path, i, "/")
|
||||
If Seg = "" : Continue : EndIf
|
||||
CandID = 0
|
||||
SetDatabaseLong(#DB, 0, CurrentID)
|
||||
SetDatabaseString(#DB, 1, Seg)
|
||||
If DatabaseQuery(#DB, "SELECT id FROM fs_nodes WHERE parent_id = ? AND name = ?")
|
||||
If NextDatabaseRow(#DB) : CandID = GetDatabaseLong(#DB, 0) : EndIf
|
||||
FinishDatabaseQuery(#DB)
|
||||
EndIf
|
||||
If CandID = 0 : ProcedureReturn 0 : EndIf
|
||||
CurrentID = CandID
|
||||
Next
|
||||
|
||||
ProcedureReturn CurrentID
|
||||
EndProcedure
|
||||
|
||||
Procedure.s FSList(NodeID.i)
|
||||
Protected JSON.s = "[", First.i = #True
|
||||
SetDatabaseLong(#DB, 0, NodeID)
|
||||
If DatabaseQuery(#DB, "SELECT id, name, is_dir, mime_type, size, modified_at FROM fs_nodes WHERE parent_id = ? ORDER BY is_dir DESC, name")
|
||||
While NextDatabaseRow(#DB)
|
||||
If Not First : JSON + "," : EndIf
|
||||
JSON + ~"{\"id\":" + GetDatabaseLong(#DB, 0) +
|
||||
~",\"name\":\"" + JSONEscape(GetDatabaseString(#DB, 1)) + ~"\"" +
|
||||
~",\"is_dir\":" + GetDatabaseLong(#DB, 2) +
|
||||
~",\"mime_type\":\"" + JSONEscape(GetDatabaseString(#DB, 3)) + ~"\"" +
|
||||
~",\"size\":" + GetDatabaseLong(#DB, 4) +
|
||||
~",\"modified_at\":" + GetDatabaseLong(#DB, 5) + "}"
|
||||
First = #False
|
||||
Wend
|
||||
FinishDatabaseQuery(#DB)
|
||||
EndIf
|
||||
ProcedureReturn JSON + "]"
|
||||
EndProcedure
|
||||
|
||||
Procedure.s FSStat(NodeID.i)
|
||||
Protected JSON.s = ""
|
||||
SetDatabaseLong(#DB, 0, NodeID)
|
||||
If DatabaseQuery(#DB, "SELECT id, owner_id, parent_id, name, is_dir, mime_type, size, created_at, modified_at FROM fs_nodes WHERE id = ?")
|
||||
If NextDatabaseRow(#DB)
|
||||
JSON = ~"{\"id\":" + GetDatabaseLong(#DB, 0) +
|
||||
~",\"owner_id\":" + GetDatabaseLong(#DB, 1) +
|
||||
~",\"parent_id\":" + GetDatabaseLong(#DB, 2) +
|
||||
~",\"name\":\"" + JSONEscape(GetDatabaseString(#DB, 3)) + ~"\"" +
|
||||
~",\"is_dir\":" + GetDatabaseLong(#DB, 4) +
|
||||
~",\"mime_type\":\"" + JSONEscape(GetDatabaseString(#DB, 5)) + ~"\"" +
|
||||
~",\"size\":" + GetDatabaseLong(#DB, 6) +
|
||||
~",\"created_at\":" + GetDatabaseLong(#DB, 7) +
|
||||
~",\"modified_at\":" + GetDatabaseLong(#DB, 8) + "}"
|
||||
EndIf
|
||||
FinishDatabaseQuery(#DB)
|
||||
EndIf
|
||||
ProcedureReturn JSON
|
||||
EndProcedure
|
||||
|
||||
Procedure.i FSGetOwner(NodeID.i, *IsDir.Integer = 0)
|
||||
Protected OwnerID.i = -1
|
||||
SetDatabaseLong(#DB, 0, NodeID)
|
||||
If DatabaseQuery(#DB, "SELECT owner_id, is_dir FROM fs_nodes WHERE id = ?")
|
||||
If NextDatabaseRow(#DB)
|
||||
OwnerID = GetDatabaseLong(#DB, 0)
|
||||
If *IsDir : *IsDir\i = GetDatabaseLong(#DB, 1) : EndIf
|
||||
EndIf
|
||||
FinishDatabaseQuery(#DB)
|
||||
EndIf
|
||||
ProcedureReturn OwnerID
|
||||
EndProcedure
|
||||
|
||||
Procedure.i FSMkdir(UserID.i, ParentID.i, Name.s)
|
||||
Protected Now.i = Date(), ID.i = 0
|
||||
SetDatabaseLong(#DB, 0, UserID)
|
||||
SetDatabaseLong(#DB, 1, ParentID)
|
||||
SetDatabaseString(#DB, 2, Name)
|
||||
SetDatabaseLong(#DB, 3, Now)
|
||||
SetDatabaseLong(#DB, 4, Now)
|
||||
DatabaseUpdate(#DB, "INSERT OR IGNORE INTO fs_nodes (owner_id, parent_id, name, is_dir, created_at, modified_at) VALUES (?, ?, ?, 1, ?, ?)")
|
||||
SetDatabaseLong(#DB, 0, ParentID)
|
||||
SetDatabaseString(#DB, 1, Name)
|
||||
If DatabaseQuery(#DB, "SELECT id FROM fs_nodes WHERE parent_id = ? AND name = ?")
|
||||
If NextDatabaseRow(#DB) : ID = GetDatabaseLong(#DB, 0) : EndIf
|
||||
FinishDatabaseQuery(#DB)
|
||||
EndIf
|
||||
ProcedureReturn ID
|
||||
EndProcedure
|
||||
|
||||
Procedure.i FSCreateFile(UserID.i, ParentID.i, Name.s, MimeType.s)
|
||||
Protected Now.i = Date(), ID.i = 0
|
||||
SetDatabaseLong(#DB, 0, UserID)
|
||||
SetDatabaseLong(#DB, 1, ParentID)
|
||||
SetDatabaseString(#DB, 2, Name)
|
||||
SetDatabaseString(#DB, 3, MimeType)
|
||||
SetDatabaseLong(#DB, 4, Now)
|
||||
SetDatabaseLong(#DB, 5, Now)
|
||||
DatabaseUpdate(#DB, "INSERT OR IGNORE INTO fs_nodes (owner_id, parent_id, name, is_dir, mime_type, created_at, modified_at) VALUES (?, ?, ?, 0, ?, ?, ?)")
|
||||
SetDatabaseLong(#DB, 0, ParentID)
|
||||
SetDatabaseString(#DB, 1, Name)
|
||||
If DatabaseQuery(#DB, "SELECT id FROM fs_nodes WHERE parent_id = ? AND name = ?")
|
||||
If NextDatabaseRow(#DB) : ID = GetDatabaseLong(#DB, 0) : EndIf
|
||||
FinishDatabaseQuery(#DB)
|
||||
EndIf
|
||||
ProcedureReturn ID
|
||||
EndProcedure
|
||||
|
||||
Procedure FSUpdateFile(NodeID.i, Size.i)
|
||||
SetDatabaseLong(#DB, 0, Size)
|
||||
SetDatabaseLong(#DB, 1, Date())
|
||||
SetDatabaseLong(#DB, 2, NodeID)
|
||||
DatabaseUpdate(#DB, "UPDATE fs_nodes SET size = ?, modified_at = ? WHERE id = ?")
|
||||
EndProcedure
|
||||
|
||||
Procedure FSDelete(NodeID.i)
|
||||
Protected NewList ChildIDs.i()
|
||||
SetDatabaseLong(#DB, 0, NodeID)
|
||||
If DatabaseQuery(#DB, "SELECT id FROM fs_nodes WHERE parent_id = ?")
|
||||
While NextDatabaseRow(#DB)
|
||||
AddElement(ChildIDs()) : ChildIDs() = GetDatabaseLong(#DB, 0)
|
||||
Wend
|
||||
FinishDatabaseQuery(#DB)
|
||||
EndIf
|
||||
ForEach ChildIDs()
|
||||
FSDelete(ChildIDs())
|
||||
Next
|
||||
SetDatabaseLong(#DB, 0, NodeID)
|
||||
DatabaseUpdate(#DB, "DELETE FROM fs_nodes WHERE id = ?")
|
||||
EndProcedure
|
||||
|
||||
Procedure FSMove(NodeID.i, NewParentID.i, NewName.s)
|
||||
SetDatabaseLong(#DB, 0, NewParentID)
|
||||
SetDatabaseString(#DB, 1, NewName)
|
||||
SetDatabaseLong(#DB, 2, Date())
|
||||
SetDatabaseLong(#DB, 3, NodeID)
|
||||
DatabaseUpdate(#DB, "UPDATE fs_nodes SET parent_id = ?, name = ?, modified_at = ? WHERE id = ?")
|
||||
EndProcedure
|
||||
|
||||
;- Applications
|
||||
Procedure.i AppInstall(UserID.i, AppID.s, Manifest.s, Permissions.s)
|
||||
SetDatabaseLong(#DB, 0, UserID)
|
||||
SetDatabaseString(#DB, 1, AppID)
|
||||
SetDatabaseString(#DB, 2, Manifest)
|
||||
SetDatabaseString(#DB, 3, Permissions)
|
||||
SetDatabaseLong(#DB, 4, Date())
|
||||
ProcedureReturn DatabaseUpdate(#DB, "INSERT OR REPLACE INTO installed_apps (user_id, app_id, manifest, permissions, installed_at) VALUES (?, ?, ?, ?, ?)")
|
||||
EndProcedure
|
||||
|
||||
Procedure AppUninstall(UserID.i, AppID.s)
|
||||
SetDatabaseLong(#DB, 0, UserID)
|
||||
SetDatabaseString(#DB, 1, AppID)
|
||||
DatabaseUpdate(#DB, "DELETE FROM installed_apps WHERE user_id = ? AND app_id = ?")
|
||||
EndProcedure
|
||||
|
||||
Procedure.i AppExists(UserID.i, AppID.s)
|
||||
Protected Exists.i = #False
|
||||
SetDatabaseLong(#DB, 0, UserID)
|
||||
SetDatabaseString(#DB, 1, AppID)
|
||||
If DatabaseQuery(#DB, "SELECT id FROM installed_apps WHERE user_id = ? AND app_id = ?")
|
||||
Exists = Bool(NextDatabaseRow(#DB))
|
||||
FinishDatabaseQuery(#DB)
|
||||
EndIf
|
||||
ProcedureReturn Exists
|
||||
EndProcedure
|
||||
|
||||
Procedure.s AppGetPermissions(UserID.i, AppID.s)
|
||||
Protected Result.s = ""
|
||||
SetDatabaseLong(#DB, 0, UserID)
|
||||
SetDatabaseString(#DB, 1, AppID)
|
||||
If DatabaseQuery(#DB, "SELECT permissions FROM installed_apps WHERE user_id = ? AND app_id = ?")
|
||||
If NextDatabaseRow(#DB) : Result = GetDatabaseString(#DB, 0) : EndIf
|
||||
FinishDatabaseQuery(#DB)
|
||||
EndIf
|
||||
ProcedureReturn Result
|
||||
EndProcedure
|
||||
|
||||
Procedure.s AppList(UserID.i)
|
||||
Protected JSON.s = "[", First.i = #True
|
||||
Protected AppID.s, Manifest.s, Perms.s, InstalledAt.i
|
||||
|
||||
SetDatabaseLong(#DB, 0, UserID)
|
||||
If Not DatabaseQuery(#DB, "SELECT app_id, manifest, permissions, installed_at FROM installed_apps WHERE user_id = ? ORDER BY installed_at ASC")
|
||||
ProcedureReturn "[]"
|
||||
EndIf
|
||||
|
||||
While NextDatabaseRow(#DB)
|
||||
AppID = GetDatabaseString(#DB, 0)
|
||||
Manifest = GetDatabaseString(#DB, 1)
|
||||
Perms = GetDatabaseString(#DB, 2)
|
||||
InstalledAt = GetDatabaseLong(#DB, 3)
|
||||
|
||||
If Not First : JSON + "," : EndIf
|
||||
First = #False
|
||||
|
||||
; Manifest and permissions are inlined as-is (already valid JSON)
|
||||
JSON + ~"{\"app_id\":\"" + JSONEscape(AppID) + ~"\"" +
|
||||
~",\"manifest\":" + Manifest +
|
||||
~",\"permissions\":" + Perms +
|
||||
~",\"installed_at\":" + InstalledAt + "}"
|
||||
Wend
|
||||
|
||||
FinishDatabaseQuery(#DB)
|
||||
ProcedureReturn JSON + "]"
|
||||
EndProcedure
|
||||
|
||||
EndModule
|
||||
|
||||
; IDE Options = PureBasic 6.30 (Windows - x64)
|
||||
; CursorPosition = 37
|
||||
; Folding = BAAAA+
|
||||
; EnableXP
|
||||
; DPIAware
|
||||
299
Server/Includes/FileSystem.pbi
Normal file
@ -0,0 +1,299 @@
|
||||
Module FileSystem
|
||||
EnableExplicit
|
||||
|
||||
; Private constants
|
||||
#BlobsDir = "blobs/"
|
||||
|
||||
;- Helpers
|
||||
Procedure CanAccess(UserID, NodeID)
|
||||
Protected OwnerID = Database::FSGetOwner(NodeID)
|
||||
ProcedureReturn Bool(OwnerID = UserID Or OwnerID = 0)
|
||||
EndProcedure
|
||||
|
||||
Procedure ResolveFromQuery(*Request, UserID)
|
||||
Protected IDStr.s = General::GetQueryField(*Request, "id")
|
||||
If IDStr <> "" : ProcedureReturn Val(IDStr) : EndIf
|
||||
ProcedureReturn Database::FSResolve(UserID, General::GetQueryField(*Request, "path"))
|
||||
EndProcedure
|
||||
|
||||
Procedure ResolveFromPost(*Request, UserID)
|
||||
Protected IDStr.s = General::GetPostField(*Request, "id")
|
||||
If IDStr <> "" : ProcedureReturn Val(IDStr) : EndIf
|
||||
ProcedureReturn Database::FSResolve(UserID, General::GetPostField(*Request, "path"))
|
||||
EndProcedure
|
||||
|
||||
Procedure ResolveParent(UserID, Path.s)
|
||||
While Right(Path, 1) = "/" : Path = Left(Path, Len(Path) - 1) : Wend
|
||||
ProcedureReturn Database::FSResolve(UserID, Path)
|
||||
EndProcedure
|
||||
|
||||
;- Public procedures
|
||||
|
||||
; GET /api/fs/list?path=... or ?id=...
|
||||
Procedure HandleList(*Request)
|
||||
Protected UserID, NodeID
|
||||
Protected Username.s
|
||||
|
||||
Username = Auth::GetSessionUser(*Request)
|
||||
If Username = ""
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Unauthorized\"}", "401 Unauthorized")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
UserID = Database::FindUser(Username)
|
||||
NodeID = ResolveFromQuery(*Request, UserID)
|
||||
|
||||
If NodeID = 0
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Not found\"}", "404 Not Found")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
If Not CanAccess(UserID, NodeID)
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Forbidden\"}", "403 Forbidden")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
|
||||
General::RespondJSON(*Request, Database::FSList(NodeID))
|
||||
EndProcedure
|
||||
|
||||
; GET /api/fs/stat?path=... or ?id=...
|
||||
Procedure HandleStat(*Request)
|
||||
Protected UserID, NodeID
|
||||
Protected Username.s, Stat.s
|
||||
|
||||
Username = Auth::GetSessionUser(*Request)
|
||||
If Username = ""
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Unauthorized\"}", "401 Unauthorized")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
UserID = Database::FindUser(Username)
|
||||
NodeID = ResolveFromQuery(*Request, UserID)
|
||||
|
||||
If NodeID = 0
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Not found\"}", "404 Not Found")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
If Not CanAccess(UserID, NodeID)
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Forbidden\"}", "403 Forbidden")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
|
||||
Stat = Database::FSStat(NodeID)
|
||||
If Stat = ""
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Not found\"}", "404 Not Found")
|
||||
Else
|
||||
General::RespondJSON(*Request, Stat)
|
||||
EndIf
|
||||
EndProcedure
|
||||
|
||||
; GET /api/fs/read?path=... or ?id=...
|
||||
Procedure HandleRead(*Request)
|
||||
Protected UserID, NodeID
|
||||
Protected IsDir.Integer
|
||||
Protected Username.s
|
||||
|
||||
Username = Auth::GetSessionUser(*Request)
|
||||
If Username = ""
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Unauthorized\"}", "401 Unauthorized")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
UserID = Database::FindUser(Username)
|
||||
NodeID = ResolveFromQuery(*Request, UserID)
|
||||
|
||||
If NodeID = 0
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Not found\"}", "404 Not Found")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
If Not CanAccess(UserID, NodeID)
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Forbidden\"}", "403 Forbidden")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
|
||||
Database::FSGetOwner(NodeID, @IsDir)
|
||||
If IsDir\i
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Is a directory\"}", "400 Bad Request")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
|
||||
If Not FastCGI::RespondFile(*Request, #BlobsDir + NodeID)
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Blob missing\"}", "404 Not Found")
|
||||
EndIf
|
||||
EndProcedure
|
||||
|
||||
; POST /api/fs/write body: path=...&content=... [&mime_type=...]
|
||||
Procedure HandleWrite(*Request)
|
||||
Protected UserID, ParentID, NodeID, FileID, BufLen, Size, *Buf
|
||||
Protected Username.s, Path.s, Content.s, MimeType.s
|
||||
|
||||
Username = Auth::GetSessionUser(*Request)
|
||||
If Username = ""
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Unauthorized\"}", "401 Unauthorized")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
UserID = Database::FindUser(Username)
|
||||
Path = General::GetPostField(*Request, "path")
|
||||
Content = General::GetPostField(*Request, "content")
|
||||
MimeType = General::GetPostField(*Request, "mime_type")
|
||||
|
||||
If Path = ""
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Missing path\"}")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
If MimeType = "" : MimeType = "text/plain" : EndIf
|
||||
|
||||
ParentID = ResolveParent(UserID, GetPathPart(Path))
|
||||
If ParentID = 0
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Parent directory not found\"}", "404 Not Found")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
If Not CanAccess(UserID, ParentID)
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Forbidden\"}", "403 Forbidden")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
|
||||
NodeID = Database::FSResolve(UserID, Path)
|
||||
If NodeID = 0
|
||||
NodeID = Database::FSCreateFile(UserID, ParentID, GetFilePart(Path), MimeType)
|
||||
EndIf
|
||||
If NodeID = 0
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Could not create node\"}", "500 Internal Server Error")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
|
||||
FileID = CreateFile(#PB_Any, #BlobsDir + NodeID)
|
||||
If FileID
|
||||
BufLen = StringByteLength(Content, #PB_UTF8)
|
||||
If BufLen > 0
|
||||
*Buf = AllocateMemory(BufLen)
|
||||
If *Buf
|
||||
PokeS(*Buf, Content, -1, #PB_UTF8 | #PB_String_NoZero)
|
||||
WriteData(FileID, *Buf, BufLen)
|
||||
FreeMemory(*Buf)
|
||||
EndIf
|
||||
EndIf
|
||||
Size = Lof(FileID)
|
||||
CloseFile(FileID)
|
||||
Database::FSUpdateFile(NodeID, Size)
|
||||
General::RespondJSON(*Request, ~"{\"success\":true,\"id\":" + NodeID + "}")
|
||||
Else
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Could not write blob\"}", "500 Internal Server Error")
|
||||
EndIf
|
||||
EndProcedure
|
||||
|
||||
; POST /api/fs/mkdir body: path=...
|
||||
Procedure HandleMkdir(*Request)
|
||||
Protected UserID, ParentID, DirID
|
||||
Protected Username.s, Path.s
|
||||
|
||||
Username = Auth::GetSessionUser(*Request)
|
||||
If Username = ""
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Unauthorized\"}", "401 Unauthorized")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
UserID = Database::FindUser(Username)
|
||||
Path = General::GetPostField(*Request, "path")
|
||||
|
||||
If Path = ""
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Missing path\"}")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
|
||||
ParentID = ResolveParent(UserID, GetPathPart(Path))
|
||||
If ParentID = 0
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Parent not found\"}", "404 Not Found")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
If Not CanAccess(UserID, ParentID)
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Forbidden\"}", "403 Forbidden")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
|
||||
DirID = Database::FSMkdir(UserID, ParentID, GetFilePart(Path))
|
||||
If DirID = 0
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Already exists or could not create\"}", "409 Conflict")
|
||||
Else
|
||||
General::RespondJSON(*Request, ~"{\"success\":true,\"id\":" + DirID + "}")
|
||||
EndIf
|
||||
EndProcedure
|
||||
|
||||
; POST /api/fs/delete body: path=... or id=...
|
||||
Procedure HandleDelete(*Request)
|
||||
Protected UserID, NodeID, OwnerID
|
||||
Protected IsDir.Integer
|
||||
Protected Username.s
|
||||
|
||||
Username = Auth::GetSessionUser(*Request)
|
||||
If Username = ""
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Unauthorized\"}", "401 Unauthorized")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
UserID = Database::FindUser(Username)
|
||||
NodeID = ResolveFromPost(*Request, UserID)
|
||||
|
||||
If NodeID = 0
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Not found\"}", "404 Not Found")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
|
||||
OwnerID = Database::FSGetOwner(NodeID, @IsDir)
|
||||
If OwnerID <> UserID
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Forbidden\"}", "403 Forbidden")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
|
||||
If Not IsDir\i : DeleteFile(#BlobsDir + NodeID) : EndIf
|
||||
|
||||
Database::FSDelete(NodeID)
|
||||
General::RespondJSON(*Request, ~"{\"success\":true}")
|
||||
EndProcedure
|
||||
|
||||
; POST /api/fs/move body: path=...&to=... or id=...&to_parent_id=...&name=...
|
||||
Procedure HandleMove(*Request)
|
||||
Protected UserID, NodeID, NewParentID, OwnerID
|
||||
Protected IsDir.Integer
|
||||
Protected Username.s, IDStr.s, NewName.s, FromPath.s, ToPath.s
|
||||
|
||||
Username = Auth::GetSessionUser(*Request)
|
||||
If Username = ""
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Unauthorized\"}", "401 Unauthorized")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
UserID = Database::FindUser(Username)
|
||||
IDStr = General::GetPostField(*Request, "id")
|
||||
|
||||
If IDStr <> ""
|
||||
NodeID = Val(IDStr)
|
||||
NewParentID = Val(General::GetPostField(*Request, "to_parent_id"))
|
||||
NewName = General::GetPostField(*Request, "name")
|
||||
Else
|
||||
FromPath = General::GetPostField(*Request, "path")
|
||||
ToPath = General::GetPostField(*Request, "to")
|
||||
NodeID = Database::FSResolve(UserID, FromPath)
|
||||
NewParentID = ResolveParent(UserID, GetPathPart(ToPath))
|
||||
NewName = GetFilePart(ToPath)
|
||||
EndIf
|
||||
|
||||
If NodeID = 0 Or NewParentID = 0 Or NewName = ""
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Not found\"}", "404 Not Found")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
|
||||
OwnerID = Database::FSGetOwner(NodeID, @IsDir)
|
||||
If OwnerID <> UserID
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Forbidden\"}", "403 Forbidden")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
If Not CanAccess(UserID, NewParentID)
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Forbidden\"}", "403 Forbidden")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
|
||||
Database::FSMove(NodeID, NewParentID, NewName)
|
||||
General::RespondJSON(*Request, ~"{\"success\":true}")
|
||||
EndProcedure
|
||||
|
||||
EndModule
|
||||
|
||||
; IDE Options = PureBasic 6.30 (Windows - x64)
|
||||
; CursorPosition = 2
|
||||
; Folding = BA-
|
||||
; EnableXP
|
||||
; DPIAware
|
||||
68
Server/Includes/General.pbi
Normal file
@ -0,0 +1,68 @@
|
||||
Module General
|
||||
EnableExplicit
|
||||
|
||||
Procedure RespondJSON(*Request, JSON.s, Status.s = "200 OK")
|
||||
FastCGI::WriteResponseHeader(*Request, "Status", Status)
|
||||
FastCGI::WriteResponseHeader(*Request, "Content-Type", "application/json; charset=utf-8")
|
||||
FastCGI::WriteResponseHeader(*Request, "Cache-Control", "no-cache, no-store, must-revalidate")
|
||||
FastCGI::WriteResponseString(*Request, JSON)
|
||||
FastCGI::FinishResponse(*Request)
|
||||
EndProcedure
|
||||
|
||||
Procedure.s GetPostField(*Request, Field.s)
|
||||
Protected PostData.s = FastCGI::GetPostData(*Request)
|
||||
Protected Count.i = CountString(PostData, "&") + 1
|
||||
Protected i.i, Pair.s, Key.s
|
||||
For i = 1 To Count
|
||||
Pair = StringField(PostData, i, "&")
|
||||
Key = StringField(Pair, 1, "=")
|
||||
If Key = Field
|
||||
ProcedureReturn URLDecoder(StringField(Pair, 2, "="))
|
||||
EndIf
|
||||
Next
|
||||
ProcedureReturn ""
|
||||
EndProcedure
|
||||
|
||||
Procedure.s GetQueryField(*Request, Field.s)
|
||||
Protected QS.s = FastCGI::GetParameter(*Request, "QUERY_STRING")
|
||||
Protected Count.i = CountString(QS, "&") + 1
|
||||
Protected i.i, Pair.s, Key.s
|
||||
For i = 1 To Count
|
||||
Pair = StringField(QS, i, "&")
|
||||
Key = StringField(Pair, 1, "=")
|
||||
If Key = Field
|
||||
ProcedureReturn URLDecoder(StringField(Pair, 2, "="))
|
||||
EndIf
|
||||
Next
|
||||
ProcedureReturn ""
|
||||
EndProcedure
|
||||
|
||||
Procedure ServeStatic(*Request, URI.s)
|
||||
Protected File.s
|
||||
|
||||
If FindString(URI, "..") Or FindString(URI, "//")
|
||||
RespondJSON(*Request, ~"{\"error\":\"Forbidden\"}", "403 Forbidden")
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
|
||||
If URI = "/" Or URI = ""
|
||||
File = "www/index.html"
|
||||
Else
|
||||
File = "www" + URI
|
||||
EndIf
|
||||
|
||||
If FileSize(File) >= 0
|
||||
If Not FastCGI::RespondFile(*Request, File)
|
||||
RespondJSON(*Request, ~"{\"error\":\"Read error\"}", "500 Internal Server Error")
|
||||
EndIf
|
||||
Else
|
||||
RespondJSON(*Request, ~"{\"error\":\"Not found\"}", "404 Not Found")
|
||||
EndIf
|
||||
EndProcedure
|
||||
|
||||
EndModule
|
||||
; IDE Options = PureBasic 6.30 (Windows - x64)
|
||||
; CursorPosition = 24
|
||||
; Folding = h
|
||||
; EnableXP
|
||||
; DPIAware
|
||||
87
Server/Includes/Modules.pbi
Normal file
@ -0,0 +1,87 @@
|
||||
DeclareModule Database
|
||||
; Public Constants
|
||||
#SESSION_DURATION = 86400 ; 24 hours
|
||||
|
||||
; Public procedure declarations
|
||||
Declare.i Init(Path.s)
|
||||
Declare Close()
|
||||
Declare.i UserCount()
|
||||
Declare.i FindUser(Username.s)
|
||||
Declare.i CreateUser(Username.s, Password.s)
|
||||
Declare ChangePassword(UserID.i, NewPassword.s)
|
||||
Declare.s ValidateCredentials(Username.s, Password.s)
|
||||
Declare.s CreateSession(UserID.i, Username.s)
|
||||
Declare.s ValidateSession(Token.s)
|
||||
Declare DeleteSession(Token.s)
|
||||
Declare CleanExpiredSessions()
|
||||
|
||||
Declare.i FSInit()
|
||||
Declare.i FSGetOrCreateHome(UserID.i)
|
||||
Declare.i FSResolve(UserID.i, Path.s)
|
||||
Declare.s FSList(NodeID.i)
|
||||
Declare.s FSStat(NodeID.i)
|
||||
Declare.i FSGetOwner(NodeID.i, *IsDir.Integer = 0)
|
||||
Declare.i FSMkdir(UserID.i, ParentID.i, Name.s)
|
||||
Declare.i FSCreateFile(UserID.i, ParentID.i, Name.s, MimeType.s)
|
||||
Declare FSUpdateFile(NodeID.i, Size.i)
|
||||
Declare FSDelete(NodeID.i)
|
||||
Declare FSMove(NodeID.i, NewParentID.i, NewName.s)
|
||||
|
||||
Declare.i AppInstall(UserID.i, AppID.s, Manifest.s, Permissions.s)
|
||||
Declare AppUninstall(UserID.i, AppID.s)
|
||||
Declare.i AppExists(UserID.i, AppID.s)
|
||||
Declare.s AppGetPermissions(UserID.i, AppID.s)
|
||||
Declare.s AppList(UserID.i)
|
||||
EndDeclareModule
|
||||
|
||||
DeclareModule General
|
||||
; Public procedure declarations
|
||||
Declare RespondJSON(*Request, JSON.s, Status.s = "200 OK")
|
||||
Declare ServeStatic(*Request, URI.s)
|
||||
Declare.s GetPostField(*Request, Field.s)
|
||||
Declare.s GetQueryField(*Request, Field.s)
|
||||
EndDeclareModule
|
||||
|
||||
DeclareModule Auth
|
||||
; Public Constants
|
||||
#SESSION_COOKIE = "kumos_session"
|
||||
#SESSION_MAX_AGE = "86400"
|
||||
|
||||
; Public procedure declarations
|
||||
Declare HandleLogin(*Request)
|
||||
Declare HandleLogout(*Request)
|
||||
Declare HandleCheck(*Request)
|
||||
Declare.s GetSessionUser(*Request)
|
||||
Declare HandleChangePassword(*Request)
|
||||
EndDeclareModule
|
||||
|
||||
DeclareModule Router
|
||||
; Public procedure declarations
|
||||
Declare Route(*Request)
|
||||
EndDeclareModule
|
||||
|
||||
DeclareModule FileSystem
|
||||
; Public procedure declarations
|
||||
Declare HandleList(*Request)
|
||||
Declare HandleStat(*Request)
|
||||
Declare HandleRead(*Request)
|
||||
Declare HandleWrite(*Request)
|
||||
Declare HandleMkdir(*Request)
|
||||
Declare HandleDelete(*Request)
|
||||
Declare HandleMove(*Request)
|
||||
EndDeclareModule
|
||||
|
||||
DeclareModule AppStore
|
||||
; Public procedure declarations
|
||||
Declare Init()
|
||||
Declare HandleList(*Request)
|
||||
Declare HandleInstall(*Request)
|
||||
Declare HandleUninstall(*Request)
|
||||
Declare HandleServeFile(*Request, AppID.s, FilePath.s)
|
||||
EndDeclareModule
|
||||
; IDE Options = PureBasic 6.30 (Windows - x64)
|
||||
; CursorPosition = 23
|
||||
; FirstLine = 4
|
||||
; Folding = --
|
||||
; EnableXP
|
||||
; DPIAware
|
||||
117
Server/Includes/Router.pbi
Normal file
@ -0,0 +1,117 @@
|
||||
Module Router
|
||||
EnableExplicit
|
||||
|
||||
Procedure _MethodNotAllowed(*Request)
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Method not allowed\"}", "405 Method Not Allowed")
|
||||
EndProcedure
|
||||
|
||||
Procedure Route(*Request)
|
||||
Protected URI.s = FastCGI::GetParameter(*Request, "REQUEST_URI")
|
||||
Protected Method.s = FastCGI::GetParameter(*Request, "REQUEST_METHOD")
|
||||
|
||||
Protected QPos.i = FindString(URI, "?")
|
||||
If QPos > 0 : URI = Left(URI, QPos - 1) : EndIf
|
||||
|
||||
If Left(URI, 5) <> "/api/"
|
||||
General::ServeStatic(*Request, URI)
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
|
||||
If Left(URI, 10) = "/api/apps/" And
|
||||
URI <> "/api/apps/list" And
|
||||
URI <> "/api/apps/install" And
|
||||
URI <> "/api/apps/uninstall"
|
||||
|
||||
; URI looks like /api/apps/<app_id>/<filepath>
|
||||
Protected AppSegment.s = Mid(URI, 11)
|
||||
Protected SlashPos.i = FindString(AppSegment, "/")
|
||||
|
||||
If SlashPos > 1
|
||||
Protected AppID.s = Left(AppSegment, SlashPos - 1)
|
||||
Protected FilePath.s = Mid(AppSegment, SlashPos + 1)
|
||||
If FilePath <> "" And Method = "GET"
|
||||
AppStore::HandleServeFile(*Request, AppID, FilePath)
|
||||
Else
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Not found\"}", "404 Not Found")
|
||||
EndIf
|
||||
Else
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Not found\"}", "404 Not Found")
|
||||
EndIf
|
||||
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
|
||||
|
||||
Select URI
|
||||
|
||||
; Auth
|
||||
Case "/api/auth/login"
|
||||
If Method = "POST" : Auth::HandleLogin(*Request)
|
||||
Else : _MethodNotAllowed(*Request) : EndIf
|
||||
|
||||
Case "/api/auth/logout"
|
||||
If Method = "POST" : Auth::HandleLogout(*Request)
|
||||
Else : _MethodNotAllowed(*Request) : EndIf
|
||||
|
||||
Case "/api/auth/check"
|
||||
Auth::HandleCheck(*Request)
|
||||
|
||||
Case "/api/auth/password"
|
||||
If Method = "POST" : Auth::HandleChangePassword(*Request)
|
||||
Else : _MethodNotAllowed(*Request) : EndIf
|
||||
|
||||
; Filesystem
|
||||
Case "/api/fs/list"
|
||||
If Method = "GET" : FileSystem::HandleList(*Request)
|
||||
Else : _MethodNotAllowed(*Request) : EndIf
|
||||
|
||||
Case "/api/fs/stat"
|
||||
If Method = "GET" : FileSystem::HandleStat(*Request)
|
||||
Else : _MethodNotAllowed(*Request) : EndIf
|
||||
|
||||
Case "/api/fs/read"
|
||||
If Method = "GET" : FileSystem::HandleRead(*Request)
|
||||
Else : _MethodNotAllowed(*Request) : EndIf
|
||||
|
||||
Case "/api/fs/write"
|
||||
If Method = "POST" : FileSystem::HandleWrite(*Request)
|
||||
Else : _MethodNotAllowed(*Request) : EndIf
|
||||
|
||||
Case "/api/fs/mkdir"
|
||||
If Method = "POST" : FileSystem::HandleMkdir(*Request)
|
||||
Else : _MethodNotAllowed(*Request) : EndIf
|
||||
|
||||
Case "/api/fs/delete"
|
||||
If Method = "POST" : FileSystem::HandleDelete(*Request)
|
||||
Else : _MethodNotAllowed(*Request) : EndIf
|
||||
|
||||
Case "/api/fs/move"
|
||||
If Method = "POST" : FileSystem::HandleMove(*Request)
|
||||
Else : _MethodNotAllowed(*Request) : EndIf
|
||||
|
||||
; App store
|
||||
Case "/api/apps/list"
|
||||
If Method = "GET" : AppStore::HandleList(*Request)
|
||||
Else : _MethodNotAllowed(*Request) : EndIf
|
||||
|
||||
Case "/api/apps/install"
|
||||
If Method = "POST" : AppStore::HandleInstall(*Request)
|
||||
Else : _MethodNotAllowed(*Request) : EndIf
|
||||
|
||||
Case "/api/apps/uninstall"
|
||||
If Method = "POST" : AppStore::HandleUninstall(*Request)
|
||||
Else : _MethodNotAllowed(*Request) : EndIf
|
||||
|
||||
Default
|
||||
General::RespondJSON(*Request, ~"{\"error\":\"Not found\"}", "404 Not Found")
|
||||
|
||||
EndSelect
|
||||
EndProcedure
|
||||
|
||||
EndModule
|
||||
|
||||
; IDE Options = PureBasic 6.30 (Windows - x64)
|
||||
; CursorPosition = 111
|
||||
; Folding = 6
|
||||
; EnableXP
|
||||
; DPIAware
|
||||
63
Server/KUMOS Server.pbp
Normal file
@ -0,0 +1,63 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<project xmlns="http://www.purebasic.com/namespace" version="1.0" creator="PureBasic 6.40 (Windows - x64)">
|
||||
<section name="config">
|
||||
<options closefiles="1" openmode="0" name="KUMO.S."/>
|
||||
</section>
|
||||
<section name="data">
|
||||
<explorer view="C:\ProgramData\PureBasic\Examples\" pattern="0"/>
|
||||
<log show="1"/>
|
||||
<lastopen date="2026-05-02 15:30" user="lastlife" host="MONSTRO"/>
|
||||
</section>
|
||||
<section name="files">
|
||||
<file name="Main.pb">
|
||||
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="1" panelstate="+"/>
|
||||
<fingerprint md5="975dfae8e3c64a16d232169cf2193281"/>
|
||||
</file>
|
||||
<file name="Includes\Modules.pbi">
|
||||
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="2" panelstate="++"/>
|
||||
<fingerprint md5="487cd50ff8f1a3f457dd926f0b8c4e68"/>
|
||||
</file>
|
||||
<file name="Includes\General.pbi">
|
||||
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="3" panelstate="++"/>
|
||||
<fingerprint md5="9eb4031eca84eb662a4cfd8826aafd74"/>
|
||||
</file>
|
||||
<file name="Libraries\FastCGI.pbi">
|
||||
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="4" panelstate="++"/>
|
||||
<fingerprint md5="05d4dd22a81fa4856c5be7bd86e370bf"/>
|
||||
</file>
|
||||
<file name="Includes\Auth.pbi">
|
||||
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="5" panelstate="++"/>
|
||||
<fingerprint md5="6446d7086b781e80c18a93646d3f139f"/>
|
||||
</file>
|
||||
<file name="Includes\Database.pbi">
|
||||
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="6" panelstate="++"/>
|
||||
<fingerprint md5="2c1ef002bd45374258448a15dcfbf731"/>
|
||||
</file>
|
||||
<file name="Includes\FileSystem.pbi">
|
||||
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="7" panelstate="++"/>
|
||||
<fingerprint md5="c5baea3bafe788bdd294651e05068200"/>
|
||||
</file>
|
||||
<file name="Includes\Router.pbi">
|
||||
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="8" panelstate="++"/>
|
||||
<fingerprint md5="3ca46048fb204ffdf8684982c2f41fa5"/>
|
||||
</file>
|
||||
<file name="Includes\AppStore.pbi">
|
||||
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="9" panelstate="++"/>
|
||||
<fingerprint md5="7506c15984978194ae3efba97801934f"/>
|
||||
</file>
|
||||
<file name="Libraries\WebServer.pbi">
|
||||
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="10" panelstate="++"/>
|
||||
<fingerprint md5="e667cb278be1a440284d137bd6502403"/>
|
||||
</file>
|
||||
</section>
|
||||
<section name="targets">
|
||||
<target name="Default Target" enabled="1" default="1">
|
||||
<inputfile value="Main.pb"/>
|
||||
<outputfile value="KUMOS"/>
|
||||
<executable value="KUMOS"/>
|
||||
<options thread="1" debug="1" optimizer="0"/>
|
||||
<format exe="console" cpu="5"/>
|
||||
</target>
|
||||
</section>
|
||||
</project>
|
||||
793
Server/Libraries/FastCGI.pbi
Normal file
@ -0,0 +1,793 @@
|
||||
DeclareModule FastCGI
|
||||
; Server
|
||||
Declare Open(Port, *Callback, BindedIP.s = "") ; Create a FCGI Application on the given port. Return a Server object if succeed or 0 otherwise. Callback format : Callback(Request)
|
||||
Declare Close(*Server) ; Close the given Server.
|
||||
|
||||
; Request
|
||||
Declare FinishResponse(*Request) ; Send the response and close connection
|
||||
Declare.s GetCookie(*Request, Cookie.s) ; Return the value of the given cookie
|
||||
Declare.s GetParameter(*Request, Parameter.s) ; Return the value of the given parameter if it exists.
|
||||
Declare.s GetPostData(*Request) ; Return raw POST data
|
||||
Declare WriteResponseHeader(*Request, Header.s, Value.s) ; Write a header to the response
|
||||
Declare WriteResponseData(*Request, *Buffer, Length) ; Add data to the response
|
||||
Declare WriteResponseString(*Request, String.s, Format = #PB_UTF8) ; Add a string to the response
|
||||
Declare WriteResponseContentType(*Request, File.s) ; Write the MIME type based on file extension
|
||||
Declare RespondFile(*Request, File.s) ; Automatically send a file as a response
|
||||
EndDeclareModule
|
||||
|
||||
Module FastCGI
|
||||
EnableExplicit
|
||||
|
||||
Global NewMap MIMETypes.s()
|
||||
|
||||
;{ Constants
|
||||
#FCGI_VERSION = 1
|
||||
|
||||
; Record types
|
||||
#FCGI_BEGIN_REQUEST = 1
|
||||
#FCGI_ABORT_REQUEST = 2
|
||||
#FCGI_END_REQUEST = 3
|
||||
#FCGI_PARAMS = 4
|
||||
#FCGI_STDIN = 5
|
||||
#FCGI_STDOUT = 6
|
||||
#FCGI_STDERR = 7
|
||||
#FCGI_DATA = 8
|
||||
#FCGI_GET_VALUES = 9
|
||||
#FCGI_GET_VALUES_RESULT = 10
|
||||
#FCGI_UNKNOWN_TYPE = 11
|
||||
|
||||
; Roles
|
||||
#FCGI_RESPONDER = 1
|
||||
#FCGI_AUTHORIZER = 2
|
||||
#FCGI_FILTER = 3
|
||||
|
||||
; Flags
|
||||
#FCGI_KEEP_CONN = 1
|
||||
|
||||
; Protocol status
|
||||
#FCGI_REQUEST_COMPLETE = 0
|
||||
#FCGI_CANT_MPX_CONN = 1
|
||||
#FCGI_OVERLOADED = 2
|
||||
#FCGI_UNKNOWN_ROLE = 3
|
||||
|
||||
#HEADER_SIZE = 8
|
||||
#MAX_CONTENT_LENGTH = 65535
|
||||
#MAX_RECORD_SIZE = 65528 ; 65535 - 8 (aligned to 8 bytes)
|
||||
;}
|
||||
|
||||
;{ Structures
|
||||
Structure FCGI_Header
|
||||
version.a
|
||||
type.a
|
||||
requestIdB1.a
|
||||
requestIdB0.a
|
||||
contentLengthB1.a
|
||||
contentLengthB0.a
|
||||
paddingLength.a
|
||||
reserved.a
|
||||
EndStructure
|
||||
|
||||
Structure FCGI_BeginRequestBody
|
||||
roleB1.a
|
||||
roleB0.a
|
||||
flags.a
|
||||
reserved.a[5]
|
||||
EndStructure
|
||||
|
||||
Structure FCGI_EndRequestBody
|
||||
appStatusB3.a
|
||||
appStatusB2.a
|
||||
appStatusB1.a
|
||||
appStatusB0.a
|
||||
protocolStatus.a
|
||||
reserved.a[3]
|
||||
EndStructure
|
||||
|
||||
Structure Server
|
||||
ServerID.i
|
||||
Thread.i
|
||||
Stop.i
|
||||
*Callback
|
||||
Mutex.i
|
||||
EndStructure
|
||||
|
||||
Structure Request
|
||||
ClientID.i
|
||||
RequestID.u
|
||||
KeepConnection.a
|
||||
Role.u
|
||||
ParamsComplete.a
|
||||
StdinComplete.a
|
||||
Map Parameters.s()
|
||||
Map ResponseHeaders.s()
|
||||
List Cookies.s()
|
||||
List ResponseData.i()
|
||||
PostData.s
|
||||
*PostDataBuffer
|
||||
PostDataLength.i
|
||||
EndStructure
|
||||
;}
|
||||
|
||||
;{ Private procedure declarations
|
||||
Declare ServerThread(*Server)
|
||||
Declare ProcessNameValuePairs(*Data, *Request.Request, Length)
|
||||
Declare ReceiveAllData(ClientID, *Buffer, Length)
|
||||
Declare SendAllData(ClientID, *Buffer, Length)
|
||||
Declare BuildHeader(*Header.FCGI_Header, Type.a, RequestID.u, ContentLength.u, PaddingLength.a)
|
||||
Declare SendRecord(ClientID, Type.a, RequestID.u, *Content, ContentLength)
|
||||
Declare SendEndRequest(ClientID, RequestID.u, AppStatus.l, ProtocolStatus.a)
|
||||
;}
|
||||
|
||||
;{ Helper procedures
|
||||
; Receive exactly 'Length' bytes, blocking until complete or error
|
||||
Procedure ReceiveAllData(ClientID, *Buffer, Length)
|
||||
Protected Received = 0, Result
|
||||
|
||||
While Received < Length
|
||||
Result = ReceiveNetworkData(ClientID, *Buffer + Received, Length - Received)
|
||||
If Result <= 0
|
||||
ProcedureReturn -1 ; Connection closed or error
|
||||
EndIf
|
||||
Received + Result
|
||||
Wend
|
||||
|
||||
ProcedureReturn Received
|
||||
EndProcedure
|
||||
|
||||
; Send all data, blocking until complete
|
||||
Procedure SendAllData(ClientID, *Buffer, Length)
|
||||
Protected Sent = 0, Result
|
||||
|
||||
While Sent < Length
|
||||
Result = SendNetworkData(ClientID, *Buffer + Sent, Length - Sent)
|
||||
If Result <= 0
|
||||
ProcedureReturn -1
|
||||
EndIf
|
||||
Sent + Result
|
||||
Wend
|
||||
|
||||
ProcedureReturn Sent
|
||||
EndProcedure
|
||||
|
||||
; Build a FastCGI header
|
||||
Procedure BuildHeader(*Header.FCGI_Header, Type.a, RequestID.u, ContentLength.u, PaddingLength.a)
|
||||
*Header\version = #FCGI_VERSION
|
||||
*Header\type = Type
|
||||
*Header\requestIdB1 = (RequestID >> 8) & $FF
|
||||
*Header\requestIdB0 = RequestID & $FF
|
||||
*Header\contentLengthB1 = (ContentLength >> 8) & $FF
|
||||
*Header\contentLengthB0 = ContentLength & $FF
|
||||
*Header\paddingLength = PaddingLength
|
||||
*Header\reserved = 0
|
||||
EndProcedure
|
||||
|
||||
; Send a complete FastCGI record
|
||||
Procedure SendRecord(ClientID, Type.a, RequestID.u, *Content, ContentLength)
|
||||
Protected *Packet, PacketSize, PaddingLength.a, Result
|
||||
|
||||
; Calculate padding to align to 8 bytes
|
||||
PaddingLength = (8 - (ContentLength % 8)) % 8
|
||||
PacketSize = #HEADER_SIZE + ContentLength + PaddingLength
|
||||
|
||||
*Packet = AllocateMemory(PacketSize, #PB_Memory_NoClear)
|
||||
If Not *Packet
|
||||
ProcedureReturn #False
|
||||
EndIf
|
||||
|
||||
; Build header
|
||||
BuildHeader(*Packet, Type, RequestID, ContentLength, PaddingLength)
|
||||
|
||||
; Copy content if any
|
||||
If *Content And ContentLength > 0
|
||||
CopyMemory(*Content, *Packet + #HEADER_SIZE, ContentLength)
|
||||
EndIf
|
||||
|
||||
; Zero padding
|
||||
If PaddingLength > 0
|
||||
FillMemory(*Packet + #HEADER_SIZE + ContentLength, PaddingLength, 0)
|
||||
EndIf
|
||||
|
||||
; Send
|
||||
Result = SendAllData(ClientID, *Packet, PacketSize)
|
||||
FreeMemory(*Packet)
|
||||
|
||||
ProcedureReturn Bool(Result > 0)
|
||||
EndProcedure
|
||||
|
||||
; Send FCGI_END_REQUEST record
|
||||
Procedure SendEndRequest(ClientID, RequestID.u, AppStatus.l, ProtocolStatus.a)
|
||||
Protected Body.FCGI_EndRequestBody
|
||||
|
||||
Body\appStatusB3 = (AppStatus >> 24) & $FF
|
||||
Body\appStatusB2 = (AppStatus >> 16) & $FF
|
||||
Body\appStatusB1 = (AppStatus >> 8) & $FF
|
||||
Body\appStatusB0 = AppStatus & $FF
|
||||
Body\protocolStatus = ProtocolStatus
|
||||
|
||||
ProcedureReturn SendRecord(ClientID, #FCGI_END_REQUEST, RequestID, @Body, SizeOf(FCGI_EndRequestBody))
|
||||
EndProcedure
|
||||
|
||||
; Parse name-value pairs from FCGI_PARAMS
|
||||
Procedure ProcessNameValuePairs(*Data, *Request.Request, Length)
|
||||
Protected Offset = 0
|
||||
Protected NameLength.l, ValueLength.l
|
||||
Protected Name.s, Value.s
|
||||
|
||||
While Offset < Length
|
||||
; Read name length
|
||||
NameLength = PeekA(*Data + Offset)
|
||||
If NameLength & $80 ; High bit set = 4-byte length
|
||||
If Offset + 4 > Length : Break : EndIf
|
||||
NameLength = ((PeekA(*Data + Offset) & $7F) << 24) |
|
||||
(PeekA(*Data + Offset + 1) << 16) |
|
||||
(PeekA(*Data + Offset + 2) << 8) |
|
||||
PeekA(*Data + Offset + 3)
|
||||
Offset + 4
|
||||
Else
|
||||
Offset + 1
|
||||
EndIf
|
||||
|
||||
; Read value length
|
||||
If Offset >= Length : Break : EndIf
|
||||
ValueLength = PeekA(*Data + Offset)
|
||||
If ValueLength & $80 ; High bit set = 4-byte length
|
||||
If Offset + 4 > Length : Break : EndIf
|
||||
ValueLength = ((PeekA(*Data + Offset) & $7F) << 24) |
|
||||
(PeekA(*Data + Offset + 1) << 16) |
|
||||
(PeekA(*Data + Offset + 2) << 8) |
|
||||
PeekA(*Data + Offset + 3)
|
||||
Offset + 4
|
||||
Else
|
||||
Offset + 1
|
||||
EndIf
|
||||
|
||||
; Bounds check
|
||||
If Offset + NameLength + ValueLength > Length
|
||||
Break
|
||||
EndIf
|
||||
|
||||
; Read name and value
|
||||
If NameLength > 0
|
||||
Name = PeekS(*Data + Offset, NameLength, #PB_Ascii)
|
||||
Offset + NameLength
|
||||
|
||||
If ValueLength > 0
|
||||
Value = PeekS(*Data + Offset, ValueLength, #PB_Ascii)
|
||||
Offset + ValueLength
|
||||
Else
|
||||
Value = ""
|
||||
EndIf
|
||||
|
||||
*Request\Parameters(Name) = Value
|
||||
Else
|
||||
Offset + ValueLength
|
||||
EndIf
|
||||
Wend
|
||||
EndProcedure
|
||||
;}
|
||||
|
||||
;{ Public procedures - Server
|
||||
Procedure Close(*Server.Server)
|
||||
If *Server
|
||||
*Server\Stop = #True
|
||||
; Wait for thread to finish
|
||||
If IsThread(*Server\Thread)
|
||||
WaitThread(*Server\Thread, 5000)
|
||||
If IsThread(*Server\Thread)
|
||||
KillThread(*Server\Thread)
|
||||
EndIf
|
||||
EndIf
|
||||
If *Server\Mutex
|
||||
FreeMutex(*Server\Mutex)
|
||||
EndIf
|
||||
FreeMemory(*Server)
|
||||
EndIf
|
||||
EndProcedure
|
||||
|
||||
Procedure Open(Port, *Callback, BindedIP.s = "")
|
||||
Protected ServerID, *Server.Server
|
||||
|
||||
If Not *Callback
|
||||
ProcedureReturn #Null
|
||||
EndIf
|
||||
|
||||
ServerID = CreateNetworkServer(#PB_Any, Port, #PB_Network_TCP, BindedIP)
|
||||
|
||||
If ServerID
|
||||
*Server = AllocateMemory(SizeOf(Server))
|
||||
If *Server
|
||||
*Server\ServerID = ServerID
|
||||
*Server\Callback = *Callback
|
||||
*Server\Mutex = CreateMutex()
|
||||
*Server\Thread = CreateThread(@ServerThread(), *Server)
|
||||
|
||||
If Not *Server\Thread
|
||||
CloseNetworkServer(ServerID)
|
||||
If *Server\Mutex : FreeMutex(*Server\Mutex) : EndIf
|
||||
FreeMemory(*Server)
|
||||
*Server = #Null
|
||||
EndIf
|
||||
Else
|
||||
CloseNetworkServer(ServerID)
|
||||
EndIf
|
||||
EndIf
|
||||
|
||||
ProcedureReturn *Server
|
||||
EndProcedure
|
||||
;}
|
||||
|
||||
;{ Public procedures - Request
|
||||
Procedure FinishResponse(*Request.Request)
|
||||
Protected HeaderString.s, *HeaderData, HeaderLength
|
||||
Protected *ContentData, ContentLength, TotalLength
|
||||
Protected Offset, ChunkSize, Result
|
||||
|
||||
If Not *Request
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
|
||||
; Build HTTP headers string
|
||||
ForEach *Request\ResponseHeaders()
|
||||
HeaderString + MapKey(*Request\ResponseHeaders()) + ": " + *Request\ResponseHeaders() + #CRLF$
|
||||
Next
|
||||
|
||||
ForEach *Request\Cookies()
|
||||
HeaderString + "Set-Cookie: " + *Request\Cookies() + #CRLF$
|
||||
Next
|
||||
|
||||
HeaderString + #CRLF$ ; End of headers
|
||||
|
||||
; Calculate total response size
|
||||
HeaderLength = StringByteLength(HeaderString, #PB_Ascii)
|
||||
ContentLength = 0
|
||||
ForEach *Request\ResponseData()
|
||||
ContentLength + MemorySize(*Request\ResponseData())
|
||||
Next
|
||||
TotalLength = HeaderLength + ContentLength
|
||||
|
||||
; Allocate combined buffer
|
||||
*ContentData = AllocateMemory(TotalLength, #PB_Memory_NoClear)
|
||||
If Not *ContentData
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
|
||||
; Copy headers
|
||||
PokeS(*ContentData, HeaderString, -1, #PB_Ascii | #PB_String_NoZero)
|
||||
Offset = HeaderLength
|
||||
|
||||
; Copy response data
|
||||
ForEach *Request\ResponseData()
|
||||
CopyMemory(*Request\ResponseData(), *ContentData + Offset, MemorySize(*Request\ResponseData()))
|
||||
Offset + MemorySize(*Request\ResponseData())
|
||||
FreeMemory(*Request\ResponseData())
|
||||
Next
|
||||
ClearList(*Request\ResponseData())
|
||||
|
||||
; Send STDOUT records (split if necessary)
|
||||
Offset = 0
|
||||
While Offset < TotalLength
|
||||
ChunkSize = TotalLength - Offset
|
||||
If ChunkSize > #MAX_RECORD_SIZE
|
||||
ChunkSize = #MAX_RECORD_SIZE
|
||||
EndIf
|
||||
|
||||
Result = SendRecord(*Request\ClientID, #FCGI_STDOUT, *Request\RequestID, *ContentData + Offset, ChunkSize)
|
||||
If Not Result
|
||||
Break
|
||||
EndIf
|
||||
Offset + ChunkSize
|
||||
Wend
|
||||
|
||||
FreeMemory(*ContentData)
|
||||
|
||||
; Send empty STDOUT to signal end of output
|
||||
SendRecord(*Request\ClientID, #FCGI_STDOUT, *Request\RequestID, #Null, 0)
|
||||
|
||||
; Send END_REQUEST
|
||||
SendEndRequest(*Request\ClientID, *Request\RequestID, 0, #FCGI_REQUEST_COMPLETE)
|
||||
|
||||
; Close connection if not keep-alive
|
||||
If Not *Request\KeepConnection
|
||||
CloseNetworkConnection(*Request\ClientID)
|
||||
EndIf
|
||||
|
||||
; Clean up POST data buffer if allocated
|
||||
If *Request\PostDataBuffer
|
||||
FreeMemory(*Request\PostDataBuffer)
|
||||
*Request\PostDataBuffer = #Null
|
||||
EndIf
|
||||
EndProcedure
|
||||
|
||||
Procedure.s GetCookie(*Request.Request, Cookie.s)
|
||||
Protected CookieHeader.s, Result.s
|
||||
Protected SearchStr.s, StartPos, EndPos
|
||||
|
||||
If Not *Request
|
||||
ProcedureReturn ""
|
||||
EndIf
|
||||
|
||||
CookieHeader = *Request\Parameters("HTTP_COOKIE")
|
||||
If CookieHeader = ""
|
||||
ProcedureReturn ""
|
||||
EndIf
|
||||
|
||||
SearchStr = Cookie + "="
|
||||
StartPos = FindString(CookieHeader, SearchStr)
|
||||
|
||||
If StartPos
|
||||
StartPos + Len(SearchStr)
|
||||
EndPos = FindString(CookieHeader, ";", StartPos)
|
||||
|
||||
If EndPos = 0
|
||||
EndPos = Len(CookieHeader) + 1
|
||||
EndIf
|
||||
|
||||
Result = Trim(Mid(CookieHeader, StartPos, EndPos - StartPos))
|
||||
EndIf
|
||||
|
||||
ProcedureReturn Result
|
||||
EndProcedure
|
||||
|
||||
Procedure.s GetParameter(*Request.Request, Parameter.s)
|
||||
If *Request
|
||||
ProcedureReturn *Request\Parameters(Parameter)
|
||||
EndIf
|
||||
ProcedureReturn ""
|
||||
EndProcedure
|
||||
|
||||
Procedure.s GetPostData(*Request.Request)
|
||||
If *Request
|
||||
ProcedureReturn *Request\PostData
|
||||
EndIf
|
||||
ProcedureReturn ""
|
||||
EndProcedure
|
||||
|
||||
Procedure WriteResponseHeader(*Request.Request, Header.s, Value.s)
|
||||
If *Request
|
||||
If LCase(Header) = "set-cookie" Or Header = #PB_CGI_HeaderSetCookie
|
||||
AddElement(*Request\Cookies())
|
||||
*Request\Cookies() = Value
|
||||
Else
|
||||
*Request\ResponseHeaders(Header) = Value
|
||||
EndIf
|
||||
EndIf
|
||||
EndProcedure
|
||||
|
||||
Procedure WriteResponseString(*Request.Request, String.s, Format = #PB_UTF8)
|
||||
Protected *Buffer, Length
|
||||
|
||||
If *Request And String <> ""
|
||||
Length = StringByteLength(String, Format)
|
||||
*Buffer = AllocateMemory(Length, #PB_Memory_NoClear)
|
||||
If *Buffer
|
||||
PokeS(*Buffer, String, -1, Format | #PB_String_NoZero)
|
||||
AddElement(*Request\ResponseData())
|
||||
*Request\ResponseData() = *Buffer
|
||||
EndIf
|
||||
EndIf
|
||||
EndProcedure
|
||||
|
||||
Procedure WriteResponseData(*Request.Request, *Buffer, Length)
|
||||
Protected *Copy
|
||||
|
||||
If *Request And *Buffer And Length > 0
|
||||
*Copy = AllocateMemory(Length, #PB_Memory_NoClear)
|
||||
If *Copy
|
||||
CopyMemory(*Buffer, *Copy, Length)
|
||||
AddElement(*Request\ResponseData())
|
||||
*Request\ResponseData() = *Copy
|
||||
EndIf
|
||||
EndIf
|
||||
EndProcedure
|
||||
|
||||
Procedure WriteResponseContentType(*Request.Request, File.s)
|
||||
Protected Extension.s, MIMEType.s
|
||||
|
||||
If *Request
|
||||
Extension = LCase(GetExtensionPart(File))
|
||||
If FindMapElement(MIMETypes(), Extension)
|
||||
MIMEType = MIMETypes()
|
||||
Else
|
||||
MIMEType = "application/octet-stream"
|
||||
EndIf
|
||||
*Request\ResponseHeaders("Content-Type") = MIMEType
|
||||
EndIf
|
||||
EndProcedure
|
||||
|
||||
Procedure RespondFile(*Request.Request, File.s)
|
||||
Protected Result = #False
|
||||
Protected FileID, FileSize, *FileData
|
||||
|
||||
If Not *Request
|
||||
ProcedureReturn #False
|
||||
EndIf
|
||||
|
||||
FileID = ReadFile(#PB_Any, File, #PB_File_SharedRead)
|
||||
If FileID
|
||||
FileSize = Lof(FileID)
|
||||
If FileSize > 0
|
||||
*FileData = AllocateMemory(FileSize, #PB_Memory_NoClear)
|
||||
If *FileData
|
||||
ReadData(FileID, *FileData, FileSize)
|
||||
WriteResponseContentType(*Request, File)
|
||||
WriteResponseData(*Request, *FileData, FileSize)
|
||||
FreeMemory(*FileData)
|
||||
Result = #True
|
||||
EndIf
|
||||
EndIf
|
||||
CloseFile(FileID)
|
||||
|
||||
If Result
|
||||
FinishResponse(*Request)
|
||||
EndIf
|
||||
EndIf
|
||||
|
||||
ProcedureReturn Result
|
||||
EndProcedure
|
||||
;}
|
||||
|
||||
;{ Server thread
|
||||
Procedure ServerThread(*Server.Server)
|
||||
Protected Header.FCGI_Header
|
||||
Protected BeginBody.FCGI_BeginRequestBody
|
||||
Protected ContentLength, PaddingLength
|
||||
Protected *ContentBuffer, *PaddingBuffer
|
||||
Protected Event, ClientID
|
||||
Protected NewMap Requests.Request()
|
||||
Protected *Request.Request
|
||||
Protected RequestKey.s
|
||||
|
||||
*ContentBuffer = AllocateMemory(#MAX_CONTENT_LENGTH)
|
||||
*PaddingBuffer = AllocateMemory(256)
|
||||
|
||||
If Not *ContentBuffer Or Not *PaddingBuffer
|
||||
If *ContentBuffer : FreeMemory(*ContentBuffer) : EndIf
|
||||
If *PaddingBuffer : FreeMemory(*PaddingBuffer) : EndIf
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
|
||||
Repeat
|
||||
Event = NetworkServerEvent(*Server\ServerID)
|
||||
|
||||
Select Event
|
||||
Case #PB_NetworkEvent_None
|
||||
Delay(1)
|
||||
|
||||
Case #PB_NetworkEvent_Connect
|
||||
ClientID = EventClient()
|
||||
; New connection - request will be created on BEGIN_REQUEST
|
||||
|
||||
Case #PB_NetworkEvent_Data
|
||||
ClientID = EventClient()
|
||||
RequestKey = Str(ClientID)
|
||||
|
||||
; Read header
|
||||
If ReceiveAllData(ClientID, @Header, #HEADER_SIZE) = #HEADER_SIZE
|
||||
ContentLength = (Header\contentLengthB1 << 8) | Header\contentLengthB0
|
||||
PaddingLength = Header\paddingLength
|
||||
|
||||
; Read content
|
||||
If ContentLength > 0
|
||||
If ReceiveAllData(ClientID, *ContentBuffer, ContentLength) <> ContentLength
|
||||
Continue
|
||||
EndIf
|
||||
EndIf
|
||||
|
||||
; Read padding
|
||||
If PaddingLength > 0
|
||||
ReceiveAllData(ClientID, *PaddingBuffer, PaddingLength)
|
||||
EndIf
|
||||
|
||||
; Process based on record type
|
||||
Select Header\type
|
||||
Case #FCGI_BEGIN_REQUEST
|
||||
; Create new request
|
||||
*Request = AddMapElement(Requests(), RequestKey)
|
||||
If *Request
|
||||
*Request\ClientID = ClientID
|
||||
*Request\RequestID = (Header\requestIdB1 << 8) | Header\requestIdB0
|
||||
|
||||
If ContentLength >= SizeOf(FCGI_BeginRequestBody)
|
||||
CopyMemory(*ContentBuffer, @BeginBody, SizeOf(FCGI_BeginRequestBody))
|
||||
*Request\Role = (BeginBody\roleB1 << 8) | BeginBody\roleB0
|
||||
*Request\KeepConnection = Bool(BeginBody\flags & #FCGI_KEEP_CONN)
|
||||
EndIf
|
||||
EndIf
|
||||
|
||||
Case #FCGI_PARAMS
|
||||
*Request = FindMapElement(Requests(), RequestKey)
|
||||
If *Request
|
||||
If ContentLength > 0
|
||||
ProcessNameValuePairs(*ContentBuffer, *Request, ContentLength)
|
||||
Else
|
||||
; Empty PARAMS record signals end of parameters
|
||||
*Request\ParamsComplete = #True
|
||||
EndIf
|
||||
EndIf
|
||||
|
||||
Case #FCGI_STDIN
|
||||
*Request = FindMapElement(Requests(), RequestKey)
|
||||
If *Request
|
||||
If ContentLength > 0
|
||||
; Accumulate POST data
|
||||
Protected *NewBuffer, NewLength
|
||||
NewLength = *Request\PostDataLength + ContentLength
|
||||
*NewBuffer = AllocateMemory(NewLength)
|
||||
If *NewBuffer
|
||||
If *Request\PostDataBuffer
|
||||
CopyMemory(*Request\PostDataBuffer, *NewBuffer, *Request\PostDataLength)
|
||||
FreeMemory(*Request\PostDataBuffer)
|
||||
EndIf
|
||||
CopyMemory(*ContentBuffer, *NewBuffer + *Request\PostDataLength, ContentLength)
|
||||
*Request\PostDataBuffer = *NewBuffer
|
||||
*Request\PostDataLength = NewLength
|
||||
EndIf
|
||||
Else
|
||||
; Empty STDIN record signals end of input
|
||||
*Request\StdinComplete = #True
|
||||
|
||||
; Convert POST data to string
|
||||
If *Request\PostDataBuffer And *Request\PostDataLength > 0
|
||||
*Request\PostData = PeekS(*Request\PostDataBuffer, *Request\PostDataLength, #PB_UTF8 | #PB_ByteLength)
|
||||
EndIf
|
||||
|
||||
; Request is complete - call handler
|
||||
If *Request\ParamsComplete
|
||||
Protected Callback.i = *Server\Callback
|
||||
If Callback
|
||||
CallFunctionFast(Callback, *Request)
|
||||
EndIf
|
||||
|
||||
; Clean up request from map after response
|
||||
DeleteMapElement(Requests(), RequestKey)
|
||||
EndIf
|
||||
EndIf
|
||||
EndIf
|
||||
|
||||
Case #FCGI_ABORT_REQUEST
|
||||
*Request = FindMapElement(Requests(), RequestKey)
|
||||
If *Request
|
||||
If *Request\PostDataBuffer
|
||||
FreeMemory(*Request\PostDataBuffer)
|
||||
EndIf
|
||||
ForEach *Request\ResponseData()
|
||||
FreeMemory(*Request\ResponseData())
|
||||
Next
|
||||
DeleteMapElement(Requests(), RequestKey)
|
||||
EndIf
|
||||
|
||||
EndSelect
|
||||
EndIf
|
||||
|
||||
Case #PB_NetworkEvent_Disconnect
|
||||
ClientID = EventClient()
|
||||
RequestKey = Str(ClientID)
|
||||
|
||||
; Clean up any pending request
|
||||
*Request = FindMapElement(Requests(), RequestKey)
|
||||
If *Request
|
||||
If *Request\PostDataBuffer
|
||||
FreeMemory(*Request\PostDataBuffer)
|
||||
EndIf
|
||||
ForEach *Request\ResponseData()
|
||||
FreeMemory(*Request\ResponseData())
|
||||
Next
|
||||
DeleteMapElement(Requests(), RequestKey)
|
||||
EndIf
|
||||
|
||||
EndSelect
|
||||
|
||||
Until *Server\Stop
|
||||
|
||||
; Cleanup
|
||||
FreeMemory(*ContentBuffer)
|
||||
FreeMemory(*PaddingBuffer)
|
||||
|
||||
; Clean up remaining requests
|
||||
ForEach Requests()
|
||||
If Requests()\PostDataBuffer
|
||||
FreeMemory(Requests()\PostDataBuffer)
|
||||
EndIf
|
||||
ForEach Requests()\ResponseData()
|
||||
FreeMemory(Requests()\ResponseData())
|
||||
Next
|
||||
Next
|
||||
|
||||
CloseNetworkServer(*Server\ServerID)
|
||||
EndProcedure
|
||||
;}
|
||||
|
||||
;{ MIME Types
|
||||
Procedure LoadMimeTypes()
|
||||
Protected.s Ext, Type
|
||||
Restore MimeData
|
||||
Read.s Ext
|
||||
While Ext <> "END"
|
||||
Read.s Type
|
||||
MIMETypes(Ext) = Type
|
||||
Read.s Ext
|
||||
Wend
|
||||
EndProcedure
|
||||
|
||||
LoadMimeTypes()
|
||||
|
||||
DataSection
|
||||
MimeData:
|
||||
Data.s "aac", "audio/aac", "abw", "application/x-abiword", "apng", "image/apng", "avi", "video/x-msvideo", "bin", "application/octet-stream", "bmp", "image/bmp"
|
||||
Data.s "css", "text/css", "csv", "text/csv", "doc", "application/msword", "gif", "image/gif", "htm", "text/html", "html", "text/html", "ico", "image/x-icon"
|
||||
Data.s "jpeg", "image/jpeg", "jpg", "image/jpeg", "js", "text/javascript", "json", "application/json", "mp3", "audio/mpeg", "mp4", "video/mp4", "mpeg", "video/mpeg"
|
||||
Data.s "otf", "font/otf", "png", "image/png", "pdf", "application/pdf", "php", "application/x-httpd-php", "svg", "image/svg+xml", "txt", "text/plain"
|
||||
Data.s "wav", "audio/wav", "webm", "video/webm", "webp", "image/webp", "woff", "font/woff", "woff2", "font/woff2", "xml", "application/xml", "zip", "application/zip"
|
||||
Data.s "END"
|
||||
EndDataSection
|
||||
;}
|
||||
EndModule
|
||||
|
||||
;{ Test/Demo code
|
||||
CompilerIf #PB_Compiler_IsMainFile
|
||||
|
||||
Global *ImageData
|
||||
Global ImageSize
|
||||
|
||||
; Load test image
|
||||
If ReadFile(0, #PB_Compiler_Home + "examples/sources/Data/Map.bmp")
|
||||
ImageSize = Lof(0)
|
||||
*ImageData = AllocateMemory(ImageSize)
|
||||
ReadData(0, *ImageData, ImageSize)
|
||||
CloseFile(0)
|
||||
Else
|
||||
; Create a simple test response if image not found
|
||||
*ImageData = #Null
|
||||
ImageSize = 0
|
||||
EndIf
|
||||
|
||||
Procedure RequestHandler(*Request)
|
||||
Protected URI.s
|
||||
|
||||
URI = FastCGI::GetParameter(*Request, "REQUEST_URI")
|
||||
|
||||
Debug "Request received: " + URI
|
||||
Debug "Method: " + FastCGI::GetParameter(*Request, "REQUEST_METHOD")
|
||||
Debug "Query: " + FastCGI::GetParameter(*Request, "QUERY_STRING")
|
||||
|
||||
If *ImageData And ImageSize > 0
|
||||
FastCGI::WriteResponseContentType(*Request, "test.bmp")
|
||||
FastCGI::WriteResponseData(*Request, *ImageData, ImageSize)
|
||||
Else
|
||||
FastCGI::WriteResponseHeader(*Request, "Content-Type", "text/html")
|
||||
FastCGI::WriteResponseString(*Request, "<html><body><h1>FastCGI Test</h1><p>Request URI: " + URI + "</p></body></html>")
|
||||
EndIf
|
||||
|
||||
FastCGI::FinishResponse(*Request)
|
||||
EndProcedure
|
||||
|
||||
OpenConsole("FastCGI Demo")
|
||||
PrintN("Starting FastCGI server on port 5600...")
|
||||
PrintN("Press Enter to stop")
|
||||
|
||||
Global Server = FastCGI::Open(5600, @RequestHandler())
|
||||
|
||||
If Server
|
||||
PrintN("Server started successfully")
|
||||
Input()
|
||||
FastCGI::Close(Server)
|
||||
PrintN("Server closed")
|
||||
Else
|
||||
PrintN("Failed to start server!")
|
||||
EndIf
|
||||
|
||||
If *ImageData
|
||||
FreeMemory(*ImageData)
|
||||
EndIf
|
||||
|
||||
PrintN("Press Enter to exit")
|
||||
Input()
|
||||
CompilerEndIf
|
||||
;}
|
||||
|
||||
; IDE Options = PureBasic 6.30 (Windows - x64)
|
||||
; ExecutableFormat = Console
|
||||
; CursorPosition = 55
|
||||
; Folding = GAAAA9
|
||||
; EnableXP
|
||||
; DPIAware
|
||||
734
Server/Libraries/WebServer.pbi
Normal file
@ -0,0 +1,734 @@
|
||||
; ============================================================
|
||||
; WebServer.pbi: Simple HTTP / FastCGI gateway for services
|
||||
; development.
|
||||
;
|
||||
; Routing:
|
||||
; - Path matching a registered FCGI prefix -> forward to FCGI
|
||||
; - Otherwise: try local file, fall back to FCGI on miss
|
||||
; ============================================================
|
||||
|
||||
DeclareModule WebServer
|
||||
Declare Open(Port, WebRoot.s, FcgiHost.s = "127.0.0.1", FcgiPort = 5600)
|
||||
Declare Close(*Server)
|
||||
Declare AddFcgiPrefix(*Server, Prefix.s)
|
||||
EndDeclareModule
|
||||
|
||||
Module WebServer
|
||||
EnableExplicit
|
||||
|
||||
;{ Structures
|
||||
Structure Server
|
||||
ServerID.i
|
||||
Thread.i
|
||||
Stop.i
|
||||
Port.i
|
||||
WebRoot.s
|
||||
FcgiHost.s
|
||||
FcgiPort.l
|
||||
List Prefixes.s()
|
||||
EndStructure
|
||||
|
||||
Structure HttpConn
|
||||
*Buffer
|
||||
AllocSize.i
|
||||
Received.i
|
||||
HeadersEnd.i ; byte AFTER \r\n\r\n; 0 means not yet found
|
||||
ContentLength.i ; -1 = not yet parsed
|
||||
EndStructure
|
||||
|
||||
Structure FCGI_Header
|
||||
version.a
|
||||
type.a
|
||||
requestIdB1.a
|
||||
requestIdB0.a
|
||||
contentLengthB1.a
|
||||
contentLengthB0.a
|
||||
paddingLength.a
|
||||
reserved.a
|
||||
EndStructure
|
||||
|
||||
Structure FCGI_BeginRequestBody
|
||||
roleB1.a
|
||||
roleB0.a
|
||||
flags.a
|
||||
reserved.a[5]
|
||||
EndStructure
|
||||
;}
|
||||
|
||||
;{ Constants
|
||||
#FCGI_VERSION = 1
|
||||
#FCGI_BEGIN_REQUEST = 1
|
||||
#FCGI_END_REQUEST = 3
|
||||
#FCGI_PARAMS = 4
|
||||
#FCGI_STDIN = 5
|
||||
#FCGI_STDOUT = 6
|
||||
#FCGI_RESPONDER = 1
|
||||
#FCGI_HEADER_SIZE = 8
|
||||
#FCGI_MAX_RECORD = 65528
|
||||
;}
|
||||
|
||||
;{ MIME Types
|
||||
Global NewMap MIMETypes.s()
|
||||
|
||||
Procedure LoadMimeTypes()
|
||||
Protected.s Ext, Type
|
||||
Restore MimeData
|
||||
Read.s Ext
|
||||
While Ext <> "END"
|
||||
Read.s Type
|
||||
MIMETypes(Ext) = Type
|
||||
Read.s Ext
|
||||
Wend
|
||||
EndProcedure
|
||||
|
||||
LoadMimeTypes()
|
||||
|
||||
DataSection
|
||||
MimeData:
|
||||
Data.s "aac", "audio/aac", "abw", "application/x-abiword", "apng", "image/apng", "avi", "video/x-msvideo", "bin", "application/octet-stream", "bmp", "image/bmp"
|
||||
Data.s "css", "text/css", "csv", "text/csv", "doc", "application/msword", "gif", "image/gif", "htm", "text/html", "html", "text/html", "ico", "image/x-icon"
|
||||
Data.s "jpeg", "image/jpeg", "jpg", "image/jpeg", "js", "text/javascript", "json", "application/json", "mp3", "audio/mpeg", "mp4", "video/mp4", "mpeg", "video/mpeg"
|
||||
Data.s "otf", "font/otf", "png", "image/png", "pdf", "application/pdf", "php", "application/x-httpd-php", "svg", "image/svg+xml", "txt", "text/plain"
|
||||
Data.s "wav", "audio/wav", "webm", "video/webm", "webp", "image/webp", "woff", "font/woff", "woff2", "font/woff2", "xml", "application/xml", "zip", "application/zip"
|
||||
Data.s "END"
|
||||
EndDataSection
|
||||
;}
|
||||
|
||||
;- Private declarations
|
||||
Declare ServerThread(*Server.Server)
|
||||
Declare HandleRequest(*Server.Server, ClientID, *Data, DataLen)
|
||||
Declare ForwardToFcgi(*Server.Server, ClientID, Method.s, FullURI.s, Path.s, QueryString.s, Map ReqHdrs.s(), *Body, BodyLen)
|
||||
Declare FcgiBuildAndSendParams(FcgiConn, *Server.Server, ReqID.u, Method.s, FullURI.s, Path.s, QueryString.s, Map ReqHdrs.s(), BodyLen)
|
||||
Declare FcgiSendBody(FcgiConn, ReqID.u, *Body, BodyLen)
|
||||
Declare FcgiReadResponse(FcgiConn, *OutLen)
|
||||
Declare FcgiSendHttpResponse(ClientID, *RespBuf, RespLen)
|
||||
Declare ServeStaticFile(ClientID, FilePath.s)
|
||||
Declare SendErrorResponse(ClientID, Code, Reason.s)
|
||||
Declare SendRawHttpResponse(ClientID, StatusLine.s, Headers.s, *Body, BodyLen)
|
||||
Declare ReceiveAll(ConnID, *Buffer, Length)
|
||||
Declare SendAll(ConnID, *Buffer, Length)
|
||||
Declare SendFcgiRecord(ConnID, Type.a, RequestID.u, *Content, ContentLen)
|
||||
Declare AppendNVP(*Buffer, Offset, Name.s, Value.s)
|
||||
Declare.s GetMime(FilePath.s)
|
||||
Declare.s GetHeaderCI(Map H.s(), Name.s)
|
||||
|
||||
;- Public API
|
||||
Procedure Open(Port, WebRoot.s, FcgiHost.s = "127.0.0.1", FcgiPort = 5600)
|
||||
Protected ServerID = CreateNetworkServer(#PB_Any, Port, #PB_Network_TCP, "")
|
||||
Protected *Server.Server
|
||||
If Not ServerID : ProcedureReturn #Null : EndIf
|
||||
|
||||
*Server = AllocateMemory(SizeOf(Server))
|
||||
If *Server
|
||||
InitializeStructure(*Server, Server)
|
||||
*Server\ServerID = ServerID
|
||||
*Server\Port = Port
|
||||
*Server\WebRoot = WebRoot
|
||||
*Server\FcgiHost = FcgiHost
|
||||
*Server\FcgiPort = FcgiPort
|
||||
*Server\Thread = CreateThread(@ServerThread(), *Server)
|
||||
If Not *Server\Thread
|
||||
CloseNetworkServer(ServerID)
|
||||
FreeStructure(*Server)
|
||||
*Server = #Null
|
||||
EndIf
|
||||
Else
|
||||
CloseNetworkServer(ServerID)
|
||||
EndIf
|
||||
ProcedureReturn *Server
|
||||
EndProcedure
|
||||
|
||||
Procedure Close(*Server.Server)
|
||||
If *Server
|
||||
*Server\Stop = #True
|
||||
If IsThread(*Server\Thread)
|
||||
WaitThread(*Server\Thread, 5000)
|
||||
If IsThread(*Server\Thread) : KillThread(*Server\Thread) : EndIf
|
||||
EndIf
|
||||
FreeMemory(*Server)
|
||||
EndIf
|
||||
EndProcedure
|
||||
|
||||
Procedure AddFcgiPrefix(*Server.Server, Prefix.s)
|
||||
If *Server
|
||||
AddElement(*Server\Prefixes())
|
||||
*Server\Prefixes() = Prefix
|
||||
EndIf
|
||||
EndProcedure
|
||||
|
||||
;- Private procedures
|
||||
; Helpers
|
||||
Procedure.s GetHeaderCI(Map H.s(), Name.s)
|
||||
; Case-insensitive header lookup so we don't depend on which capitalisation
|
||||
; the browser used (Chrome and Firefox usually send "Content-Type:" but
|
||||
; HTTP/2 frontends and some proxies will lowercase headers).
|
||||
Protected Lower.s = LCase(Name)
|
||||
ForEach H()
|
||||
If LCase(MapKey(H())) = Lower
|
||||
ProcedureReturn H()
|
||||
EndIf
|
||||
Next
|
||||
ProcedureReturn ""
|
||||
EndProcedure
|
||||
|
||||
Procedure.s GetMime(FilePath.s)
|
||||
If FindMapElement(MimeTypes(), LCase(GetExtensionPart(FilePath)))
|
||||
ProcedureReturn MimeTypes()
|
||||
EndIf
|
||||
ProcedureReturn "application/octet-stream"
|
||||
EndProcedure
|
||||
|
||||
; Network helpers
|
||||
Procedure ReceiveAll(ConnID, *Buffer, Length)
|
||||
Protected Received = 0, Got
|
||||
While Received < Length
|
||||
Got = ReceiveNetworkData(ConnID, *Buffer + Received, Length - Received)
|
||||
If Got <= 0
|
||||
Received = -1
|
||||
Break
|
||||
EndIf
|
||||
Received + Got
|
||||
Wend
|
||||
ProcedureReturn Received
|
||||
EndProcedure
|
||||
|
||||
Procedure SendAll(ConnID, *Buffer, Length)
|
||||
Protected Sent = 0, Chunk
|
||||
While Sent < Length
|
||||
Chunk = SendNetworkData(ConnID, *Buffer + Sent, Length - Sent)
|
||||
If Chunk <= 0
|
||||
Sent = -1
|
||||
Break
|
||||
EndIf
|
||||
Sent + Chunk
|
||||
Wend
|
||||
ProcedureReturn Sent
|
||||
EndProcedure
|
||||
|
||||
; FCGI helpers
|
||||
Procedure SendFcgiRecord(ConnID, Type.a, RequestID.u, *Content, ContentLen)
|
||||
Protected Result = #False
|
||||
Protected Padding = (8 - (ContentLen % 8)) % 8
|
||||
Protected PktSize = #FCGI_HEADER_SIZE + ContentLen + Padding
|
||||
Protected *Pkt = AllocateMemory(PktSize, #PB_Memory_NoClear)
|
||||
|
||||
If *Pkt
|
||||
PokeA(*Pkt, #FCGI_VERSION)
|
||||
PokeA(*Pkt + 1, Type)
|
||||
PokeA(*Pkt + 2, (RequestID >> 8) & $FF)
|
||||
PokeA(*Pkt + 3, RequestID & $FF)
|
||||
PokeA(*Pkt + 4, (ContentLen >> 8) & $FF)
|
||||
PokeA(*Pkt + 5, ContentLen & $FF)
|
||||
PokeA(*Pkt + 6, Padding)
|
||||
PokeA(*Pkt + 7, 0)
|
||||
|
||||
If *Content And ContentLen > 0
|
||||
CopyMemory(*Content, *Pkt + #FCGI_HEADER_SIZE, ContentLen)
|
||||
EndIf
|
||||
If Padding > 0
|
||||
FillMemory(*Pkt + #FCGI_HEADER_SIZE + ContentLen, Padding, 0)
|
||||
EndIf
|
||||
|
||||
Result = Bool(SendAll(ConnID, *Pkt, PktSize) > 0)
|
||||
FreeMemory(*Pkt)
|
||||
EndIf
|
||||
|
||||
ProcedureReturn Result
|
||||
EndProcedure
|
||||
|
||||
Procedure AppendNVP(*Buffer, Offset, Name.s, Value.s)
|
||||
Protected NameLen = StringByteLength(Name, #PB_Ascii)
|
||||
Protected ValueLen = StringByteLength(Value, #PB_UTF8)
|
||||
|
||||
If NameLen < 128
|
||||
PokeA(*Buffer + Offset, NameLen) : Offset + 1
|
||||
Else
|
||||
PokeA(*Buffer + Offset, ((NameLen >> 24) & $7F) | $80)
|
||||
PokeA(*Buffer + Offset + 1, (NameLen >> 16) & $FF)
|
||||
PokeA(*Buffer + Offset + 2, (NameLen >> 8) & $FF)
|
||||
PokeA(*Buffer + Offset + 3, NameLen & $FF)
|
||||
Offset + 4
|
||||
EndIf
|
||||
|
||||
If ValueLen < 128
|
||||
PokeA(*Buffer + Offset, ValueLen) : Offset + 1
|
||||
Else
|
||||
PokeA(*Buffer + Offset, ((ValueLen >> 24) & $7F) | $80)
|
||||
PokeA(*Buffer + Offset + 1, (ValueLen >> 16) & $FF)
|
||||
PokeA(*Buffer + Offset + 2, (ValueLen >> 8) & $FF)
|
||||
PokeA(*Buffer + Offset + 3, ValueLen & $FF)
|
||||
Offset + 4
|
||||
EndIf
|
||||
|
||||
If NameLen > 0
|
||||
PokeS(*Buffer + Offset, Name, -1, #PB_Ascii | #PB_String_NoZero)
|
||||
Offset + NameLen
|
||||
EndIf
|
||||
If ValueLen > 0
|
||||
PokeS(*Buffer + Offset, Value, -1, #PB_UTF8 | #PB_String_NoZero)
|
||||
Offset + ValueLen
|
||||
EndIf
|
||||
|
||||
ProcedureReturn Offset
|
||||
EndProcedure
|
||||
|
||||
; HTTP response helpers
|
||||
Procedure SendRawHttpResponse(ClientID, StatusLine.s, Headers.s, *Body, BodyLen)
|
||||
; FIX: ensure Headers ends with CRLF so the appended CRLF below produces
|
||||
; the CRLFCRLF that terminates the header block. Without this, FCGI-forwarded
|
||||
; responses (whose CgiHdrs has no trailing CRLF after PeekS) produced output
|
||||
; with only one CRLF between headers and body - some browsers (notably Chrome
|
||||
; on POST) refused to display the result.
|
||||
If Headers <> "" And Right(Headers, 2) <> #CRLF$
|
||||
Headers + #CRLF$
|
||||
EndIf
|
||||
|
||||
Protected Hdr.s = StatusLine + #CRLF$ + "Connection: close" + #CRLF$ + Headers + #CRLF$
|
||||
Protected HdrLen = StringByteLength(Hdr, #PB_Ascii)
|
||||
Protected *HdrBuf = AllocateMemory(HdrLen, #PB_Memory_NoClear)
|
||||
If *HdrBuf
|
||||
PokeS(*HdrBuf, Hdr, -1, #PB_Ascii | #PB_String_NoZero)
|
||||
SendAll(ClientID, *HdrBuf, HdrLen)
|
||||
FreeMemory(*HdrBuf)
|
||||
EndIf
|
||||
|
||||
If *Body And BodyLen > 0
|
||||
SendAll(ClientID, *Body, BodyLen)
|
||||
EndIf
|
||||
CloseNetworkConnection(ClientID)
|
||||
EndProcedure
|
||||
|
||||
Procedure SendErrorResponse(ClientID, Code, Reason.s)
|
||||
Protected Body.s = "<h1>" + Str(Code) + " " + Reason + "</h1>"
|
||||
Protected BodyLen = StringByteLength(Body, #PB_Ascii)
|
||||
Protected *B = AllocateMemory(BodyLen, #PB_Memory_NoClear)
|
||||
If *B
|
||||
PokeS(*B, Body, -1, #PB_Ascii | #PB_String_NoZero)
|
||||
SendRawHttpResponse(ClientID, "HTTP/1.1 " + Str(Code) + " " + Reason,
|
||||
"Content-Type: text/html" + #CRLF$ + "Content-Length: " + Str(BodyLen) + #CRLF$,
|
||||
*B, BodyLen)
|
||||
FreeMemory(*B)
|
||||
EndIf
|
||||
EndProcedure
|
||||
|
||||
Procedure ServeStaticFile(ClientID, FilePath.s)
|
||||
Protected Result, FileSize, FileID = ReadFile(#PB_Any, FilePath, #PB_File_SharedRead)
|
||||
Protected *FileData
|
||||
|
||||
If FileID
|
||||
FileSize = Lof(FileID)
|
||||
*FileData = AllocateMemory(FileSize, #PB_Memory_NoClear)
|
||||
If *FileData
|
||||
ReadData(FileID, *FileData, FileSize)
|
||||
SendRawHttpResponse(ClientID, "HTTP/1.1 200 OK",
|
||||
"Content-Type: " + GetMime(FilePath) + #CRLF$ + "Content-Length: " + Str(FileSize) + #CRLF$,
|
||||
*FileData, FileSize)
|
||||
FreeMemory(*FileData)
|
||||
EndIf
|
||||
Result = #True
|
||||
CloseFile(FileID)
|
||||
EndIf
|
||||
|
||||
ProcedureReturn Result
|
||||
EndProcedure
|
||||
|
||||
; FCGI gateway
|
||||
Procedure FcgiBuildAndSendParams(FcgiConn, *Server.Server, ReqID.u, Method.s, FullURI.s, Path.s, QueryString.s, Map ReqHdrs.s(), BodyLen)
|
||||
Protected *Params, PO, PSent, PChunk, Result
|
||||
Protected HName.s, HLower.s, CType.s
|
||||
|
||||
*Params = AllocateMemory(65536)
|
||||
If Not *Params : ProcedureReturn #False : EndIf
|
||||
|
||||
PO = AppendNVP(*Params, PO, "GATEWAY_INTERFACE", "CGI/1.1")
|
||||
PO = AppendNVP(*Params, PO, "SERVER_PROTOCOL", "HTTP/1.1")
|
||||
PO = AppendNVP(*Params, PO, "SERVER_SOFTWARE", "KUMO.S/1.0")
|
||||
PO = AppendNVP(*Params, PO, "SERVER_NAME", "localhost")
|
||||
PO = AppendNVP(*Params, PO, "SERVER_PORT", Str(*Server\Port))
|
||||
PO = AppendNVP(*Params, PO, "REQUEST_METHOD", Method)
|
||||
PO = AppendNVP(*Params, PO, "REQUEST_URI", FullURI)
|
||||
PO = AppendNVP(*Params, PO, "SCRIPT_NAME", Path)
|
||||
PO = AppendNVP(*Params, PO, "PATH_INFO", Path)
|
||||
PO = AppendNVP(*Params, PO, "QUERY_STRING", QueryString)
|
||||
PO = AppendNVP(*Params, PO, "DOCUMENT_ROOT", *Server\WebRoot)
|
||||
PO = AppendNVP(*Params, PO, "SCRIPT_FILENAME", *Server\WebRoot + Path)
|
||||
PO = AppendNVP(*Params, PO, "CONTENT_LENGTH", Str(BodyLen))
|
||||
PO = AppendNVP(*Params, PO, "REMOTE_ADDR", "127.0.0.1")
|
||||
PO = AppendNVP(*Params, PO, "REMOTE_PORT", "0")
|
||||
|
||||
; FIX: case-insensitive lookup
|
||||
CType = GetHeaderCI(ReqHdrs(), "Content-Type")
|
||||
If CType <> ""
|
||||
PO = AppendNVP(*Params, PO, "CONTENT_TYPE", CType)
|
||||
EndIf
|
||||
|
||||
ForEach ReqHdrs()
|
||||
HName = MapKey(ReqHdrs())
|
||||
HLower = LCase(HName)
|
||||
If HLower <> "content-type" And HLower <> "content-length"
|
||||
PO = AppendNVP(*Params, PO, "HTTP_" + UCase(ReplaceString(HName, "-", "_")), ReqHdrs())
|
||||
EndIf
|
||||
Next
|
||||
|
||||
While PSent < PO
|
||||
PChunk = PO - PSent
|
||||
If PChunk > #FCGI_MAX_RECORD : PChunk = #FCGI_MAX_RECORD : EndIf
|
||||
If Not SendFcgiRecord(FcgiConn, #FCGI_PARAMS, ReqID, *Params + PSent, PChunk) : Break : EndIf
|
||||
PSent + PChunk
|
||||
Wend
|
||||
FreeMemory(*Params)
|
||||
|
||||
Result = Bool(Bool(PSent >= PO) And SendFcgiRecord(FcgiConn, #FCGI_PARAMS, ReqID, #Null, 0))
|
||||
ProcedureReturn Result
|
||||
EndProcedure
|
||||
|
||||
Procedure FcgiSendBody(FcgiConn, ReqID.u, *Body, BodyLen)
|
||||
Protected SSent, SChunk, Result = #True
|
||||
|
||||
If *Body And BodyLen > 0
|
||||
While SSent < BodyLen And Result
|
||||
SChunk = BodyLen - SSent
|
||||
If SChunk > #FCGI_MAX_RECORD : SChunk = #FCGI_MAX_RECORD : EndIf
|
||||
Result = SendFcgiRecord(FcgiConn, #FCGI_STDIN, ReqID, *Body + SSent, SChunk)
|
||||
SSent + SChunk
|
||||
Wend
|
||||
EndIf
|
||||
If Result
|
||||
Result = SendFcgiRecord(FcgiConn, #FCGI_STDIN, ReqID, #Null, 0)
|
||||
EndIf
|
||||
|
||||
ProcedureReturn Result
|
||||
EndProcedure
|
||||
|
||||
Procedure FcgiReadResponse(FcgiConn, *OutLen)
|
||||
Protected FcgiHdr.FCGI_Header, PadBuf.q
|
||||
Protected *RecBuf, *RespBuf, *Grown
|
||||
Protected RecLen, RecPad, RespLen, RespAlloced = 65536
|
||||
|
||||
*RespBuf = AllocateMemory(RespAlloced)
|
||||
*RecBuf = AllocateMemory(65536)
|
||||
If Not *RespBuf Or Not *RecBuf
|
||||
If *RespBuf : FreeMemory(*RespBuf) : EndIf
|
||||
If *RecBuf : FreeMemory(*RecBuf) : EndIf
|
||||
ProcedureReturn 0
|
||||
EndIf
|
||||
|
||||
Repeat
|
||||
If ReceiveAll(FcgiConn, @FcgiHdr, #FCGI_HEADER_SIZE) <> #FCGI_HEADER_SIZE : Break : EndIf
|
||||
RecLen = (FcgiHdr\contentLengthB1 << 8) | FcgiHdr\contentLengthB0
|
||||
RecPad = FcgiHdr\paddingLength
|
||||
|
||||
If RecLen > 0 And ReceiveAll(FcgiConn, *RecBuf, RecLen) <> RecLen : Break : EndIf
|
||||
If RecPad > 0 : ReceiveAll(FcgiConn, @PadBuf, RecPad) : EndIf
|
||||
|
||||
Select FcgiHdr\type
|
||||
Case #FCGI_STDOUT
|
||||
If RecLen > 0
|
||||
While RespLen + RecLen > RespAlloced
|
||||
RespAlloced * 2
|
||||
*Grown = ReAllocateMemory(*RespBuf, RespAlloced)
|
||||
If Not *Grown : FreeMemory(*RespBuf) : FreeMemory(*RecBuf) : ProcedureReturn 0 : EndIf
|
||||
*RespBuf = *Grown
|
||||
Wend
|
||||
CopyMemory(*RecBuf, *RespBuf + RespLen, RecLen)
|
||||
RespLen + RecLen
|
||||
EndIf
|
||||
|
||||
Case #FCGI_END_REQUEST
|
||||
FreeMemory(*RecBuf)
|
||||
PokeI(*OutLen, RespLen)
|
||||
ProcedureReturn *RespBuf
|
||||
EndSelect
|
||||
ForEver
|
||||
|
||||
FreeMemory(*RecBuf)
|
||||
FreeMemory(*RespBuf)
|
||||
ProcedureReturn 0
|
||||
EndProcedure
|
||||
|
||||
Procedure FcgiSendHttpResponse(ClientID, *RespBuf, RespLen)
|
||||
Protected k, SepPos = -1, BodyOff, CgiBodyLen, StatusCode = 200, StatusPos, SEnd, SpPos
|
||||
Protected.s CgiHdrs, ExtraHdrs, StatusText = "OK", SVal
|
||||
|
||||
For k = 0 To RespLen - 4
|
||||
If PeekA(*RespBuf + k) = $0D And PeekA(*RespBuf + k + 1) = $0A And
|
||||
PeekA(*RespBuf + k + 2) = $0D And PeekA(*RespBuf + k + 3) = $0A
|
||||
SepPos = k : Break
|
||||
EndIf
|
||||
Next
|
||||
|
||||
If SepPos >= 0
|
||||
CgiHdrs = PeekS(*RespBuf, SepPos, #PB_Ascii)
|
||||
BodyOff = SepPos + 4
|
||||
CgiBodyLen = RespLen - BodyOff
|
||||
Else
|
||||
BodyOff = 0 : CgiBodyLen = RespLen
|
||||
EndIf
|
||||
|
||||
StatusPos = FindString(CgiHdrs, "Status:", 1, #PB_String_NoCase)
|
||||
If StatusPos
|
||||
SEnd = FindString(CgiHdrs, #CRLF$, StatusPos)
|
||||
If SEnd = 0 : SEnd = Len(CgiHdrs) + 1 : EndIf
|
||||
SVal = Trim(Mid(CgiHdrs, StatusPos + 7, SEnd - StatusPos - 7))
|
||||
StatusCode = Val(SVal)
|
||||
SpPos = FindString(SVal, " ")
|
||||
If SpPos : StatusText = Trim(Mid(SVal, SpPos + 1)) : EndIf
|
||||
CgiHdrs = Left(CgiHdrs, StatusPos - 1) + Mid(CgiHdrs, SEnd + 2)
|
||||
EndIf
|
||||
|
||||
If FindString(CgiHdrs, "Content-Length:", 1, #PB_String_NoCase) = 0
|
||||
ExtraHdrs = "Content-Length: " + Str(CgiBodyLen) + #CRLF$
|
||||
EndIf
|
||||
|
||||
; CgiHdrs from PeekS does NOT end with CRLF; SendRawHttpResponse normalises that.
|
||||
SendRawHttpResponse(ClientID, "HTTP/1.1 " + Str(StatusCode) + " " + StatusText,
|
||||
ExtraHdrs + CgiHdrs, *RespBuf + BodyOff, CgiBodyLen)
|
||||
EndProcedure
|
||||
|
||||
Procedure ForwardToFcgi(*Server.Server, ClientID, Method.s, FullURI.s, Path.s, QueryString.s, Map ReqHdrs.s(), *Body, BodyLen)
|
||||
Protected FcgiConn, ReqID.u = 1, RespLen, *RespBuf
|
||||
Protected BeginBody.FCGI_BeginRequestBody
|
||||
|
||||
FcgiConn = OpenNetworkConnection(*Server\FcgiHost, *Server\FcgiPort)
|
||||
If Not FcgiConn
|
||||
SendErrorResponse(ClientID, 502, "Bad Gateway") : ProcedureReturn
|
||||
EndIf
|
||||
|
||||
FillMemory(@BeginBody, SizeOf(FCGI_BeginRequestBody), 0)
|
||||
BeginBody\roleB0 = #FCGI_RESPONDER
|
||||
|
||||
; FIX: actually check that BEGIN_REQUEST went through
|
||||
If Not SendFcgiRecord(FcgiConn, #FCGI_BEGIN_REQUEST, ReqID, @BeginBody, SizeOf(FCGI_BeginRequestBody))
|
||||
CloseNetworkConnection(FcgiConn)
|
||||
SendErrorResponse(ClientID, 502, "Bad Gateway") : ProcedureReturn
|
||||
EndIf
|
||||
|
||||
If Not FcgiBuildAndSendParams(FcgiConn, *Server, ReqID, Method, FullURI, Path, QueryString, ReqHdrs(), BodyLen) Or
|
||||
Not FcgiSendBody(FcgiConn, ReqID, *Body, BodyLen)
|
||||
CloseNetworkConnection(FcgiConn)
|
||||
SendErrorResponse(ClientID, 502, "Bad Gateway") : ProcedureReturn
|
||||
EndIf
|
||||
|
||||
*RespBuf = FcgiReadResponse(FcgiConn, @RespLen)
|
||||
CloseNetworkConnection(FcgiConn)
|
||||
|
||||
If *RespBuf
|
||||
FcgiSendHttpResponse(ClientID, *RespBuf, RespLen)
|
||||
FreeMemory(*RespBuf)
|
||||
Else
|
||||
SendErrorResponse(ClientID, 502, "Bad Gateway")
|
||||
EndIf
|
||||
EndProcedure
|
||||
|
||||
Procedure HandleRequest(*Server.Server, ClientID, *Data, DataLen)
|
||||
Protected LineEnd = -1, i, Sp1, Sp2, QPos, HdrStart, HdrEnd, NLines, j, ColPos, BodyStart, BodyLen, GoFcgi
|
||||
Protected *Body
|
||||
Protected.s ReqLine, Method, FullURI, Path, QueryStr, HdrStr, Line, FilePath
|
||||
Protected NewMap ReqHdrs.s()
|
||||
|
||||
For i = 0 To DataLen - 2
|
||||
If PeekA(*Data + i) = $0D And PeekA(*Data + i + 1) = $0A
|
||||
LineEnd = i : Break
|
||||
EndIf
|
||||
Next
|
||||
If LineEnd < 0 : SendErrorResponse(ClientID, 400, "Bad Request") : ProcedureReturn : EndIf
|
||||
|
||||
ReqLine = PeekS(*Data, LineEnd, #PB_Ascii)
|
||||
Sp1 = FindString(ReqLine, " ")
|
||||
Sp2 = FindString(ReqLine, " ", Sp1 + 1)
|
||||
If Sp1 = 0 Or Sp2 = 0 : SendErrorResponse(ClientID, 400, "Bad Request") : ProcedureReturn : EndIf
|
||||
|
||||
Method = Left(ReqLine, Sp1 - 1)
|
||||
FullURI = Mid(ReqLine, Sp1 + 1, Sp2 - Sp1 - 1)
|
||||
|
||||
If Method <> "GET" And Method <> "POST"
|
||||
SendErrorResponse(ClientID, 405, "Method Not Allowed") : ProcedureReturn
|
||||
EndIf
|
||||
|
||||
QPos = FindString(FullURI, "?")
|
||||
If QPos
|
||||
Path = URLDecoder(Left(FullURI, QPos - 1))
|
||||
QueryStr = Mid(FullURI, QPos + 1)
|
||||
Else
|
||||
Path = URLDecoder(FullURI)
|
||||
QueryStr = ""
|
||||
EndIf
|
||||
|
||||
If FindString(Path, "..") : Path = "/" : EndIf
|
||||
|
||||
HdrStart = LineEnd + 2
|
||||
For i = HdrStart To DataLen - 4
|
||||
If PeekA(*Data + i) = $0D And PeekA(*Data + i + 1) = $0A And
|
||||
PeekA(*Data + i + 2) = $0D And PeekA(*Data + i + 3) = $0A
|
||||
HdrEnd = i : Break
|
||||
EndIf
|
||||
Next
|
||||
If HdrEnd = 0 : HdrEnd = DataLen : EndIf
|
||||
|
||||
HdrStr = PeekS(*Data + HdrStart, HdrEnd - HdrStart, #PB_Ascii)
|
||||
NLines = CountString(HdrStr, #CRLF$) + 1
|
||||
For j = 1 To NLines
|
||||
Line.s = StringField(HdrStr, j, #CRLF$)
|
||||
ColPos = FindString(Line, ":")
|
||||
If ColPos > 1
|
||||
ReqHdrs(Trim(Left(Line, ColPos - 1))) = Trim(Mid(Line, ColPos + 1))
|
||||
EndIf
|
||||
Next
|
||||
|
||||
BodyStart = HdrEnd + 4
|
||||
If BodyStart < DataLen
|
||||
*Body = *Data + BodyStart
|
||||
BodyLen = DataLen - BodyStart
|
||||
EndIf
|
||||
|
||||
ForEach *Server\Prefixes()
|
||||
If Left(Path, Len(*Server\Prefixes())) = *Server\Prefixes()
|
||||
GoFcgi = #True : Break
|
||||
EndIf
|
||||
Next
|
||||
|
||||
If GoFcgi
|
||||
ForwardToFcgi(*Server, ClientID, Method, FullURI, Path, QueryStr, ReqHdrs(), *Body, BodyLen)
|
||||
ProcedureReturn
|
||||
EndIf
|
||||
|
||||
FilePath.s = *Server\WebRoot + Path
|
||||
If Right(FilePath, 1) = "/" : FilePath + "index.html" : EndIf
|
||||
|
||||
If FileSize(FilePath) >= 0
|
||||
If Not ServeStaticFile(ClientID, FilePath)
|
||||
SendErrorResponse(ClientID, 500, "Internal Server Error")
|
||||
EndIf
|
||||
Else
|
||||
ForwardToFcgi(*Server, ClientID, Method, FullURI, Path, QueryStr, ReqHdrs(), *Body, BodyLen)
|
||||
EndIf
|
||||
EndProcedure
|
||||
|
||||
Procedure ServerThread(*Server.Server)
|
||||
Protected NewMap Conns.HttpConn()
|
||||
Protected Got, si, CLPos, CLEnd, ReallocFailed, Event, SearchFrom, ClientID, Key.s, HBlock.s, *Grown, *Conn.HttpConn, *ChunkBuf
|
||||
|
||||
*ChunkBuf = AllocateMemory(8192)
|
||||
If Not *ChunkBuf : ProcedureReturn : EndIf
|
||||
|
||||
Repeat
|
||||
Event = NetworkServerEvent(*Server\ServerID)
|
||||
If Event = #PB_NetworkEvent_None
|
||||
Delay(1)
|
||||
Else
|
||||
ClientID = EventClient()
|
||||
Key = Str(ClientID)
|
||||
Select Event
|
||||
Case #PB_NetworkEvent_Connect
|
||||
*Conn = AddMapElement(Conns(), Key)
|
||||
*Conn\AllocSize = 8192
|
||||
*Conn\Buffer = AllocateMemory(*Conn\AllocSize)
|
||||
*Conn\ContentLength = -1
|
||||
If Not *Conn\Buffer
|
||||
DeleteMapElement(Conns(), Key)
|
||||
CloseNetworkConnection(ClientID)
|
||||
EndIf
|
||||
|
||||
Case #PB_NetworkEvent_Data
|
||||
*Conn = FindMapElement(Conns(), Key)
|
||||
If Not *Conn : Continue : EndIf
|
||||
|
||||
Got = ReceiveNetworkData(ClientID, *ChunkBuf, 8192)
|
||||
If Got <= 0 : Continue : EndIf
|
||||
|
||||
ReallocFailed = #False
|
||||
While *Conn\Received + Got > *Conn\AllocSize
|
||||
*Conn\AllocSize * 2
|
||||
*Grown = ReAllocateMemory(*Conn\Buffer, *Conn\AllocSize)
|
||||
If *Grown
|
||||
*Conn\Buffer = *Grown
|
||||
Else
|
||||
FreeMemory(*Conn\Buffer)
|
||||
DeleteMapElement(Conns(), Key)
|
||||
CloseNetworkConnection(ClientID)
|
||||
ReallocFailed = #True : Break
|
||||
EndIf
|
||||
Wend
|
||||
If ReallocFailed : Continue : EndIf
|
||||
|
||||
CopyMemory(*ChunkBuf, *Conn\Buffer + *Conn\Received, Got)
|
||||
*Conn\Received + Got
|
||||
|
||||
If *Conn\HeadersEnd = 0 And *Conn\Received >= 4
|
||||
SearchFrom = *Conn\Received - Got - 3
|
||||
If SearchFrom < 0 : SearchFrom = 0 : EndIf
|
||||
For si = SearchFrom To *Conn\Received - 4
|
||||
If PeekA(*Conn\Buffer + si) = $0D And PeekA(*Conn\Buffer + si + 1) = $0A And
|
||||
PeekA(*Conn\Buffer + si + 2) = $0D And PeekA(*Conn\Buffer + si + 3) = $0A
|
||||
*Conn\HeadersEnd = si + 4 : Break
|
||||
EndIf
|
||||
Next
|
||||
EndIf
|
||||
|
||||
If *Conn\HeadersEnd > 0 And *Conn\ContentLength < 0
|
||||
; FIX: removed duplicate PeekS call from your version
|
||||
HBlock = PeekS(*Conn\Buffer, *Conn\HeadersEnd - 4, #PB_Ascii)
|
||||
CLPos = FindString(HBlock, "Content-Length:", 1, #PB_String_NoCase)
|
||||
If CLPos
|
||||
CLEnd = FindString(HBlock, #CRLF$, CLPos)
|
||||
If CLEnd = 0 : CLEnd = Len(HBlock) + 1 : EndIf
|
||||
*Conn\ContentLength = Val(Trim(Mid(HBlock, CLPos + 15, CLEnd - CLPos - 15)))
|
||||
Else
|
||||
*Conn\ContentLength = 0
|
||||
EndIf
|
||||
EndIf
|
||||
|
||||
If *Conn\HeadersEnd > 0 And *Conn\ContentLength >= 0
|
||||
If *Conn\Received >= *Conn\HeadersEnd + *Conn\ContentLength
|
||||
HandleRequest(*Server, ClientID, *Conn\Buffer, *Conn\Received)
|
||||
FreeMemory(*Conn\Buffer)
|
||||
DeleteMapElement(Conns(), Key)
|
||||
EndIf
|
||||
EndIf
|
||||
|
||||
Case #PB_NetworkEvent_Disconnect
|
||||
*Conn = FindMapElement(Conns(), Key)
|
||||
If *Conn
|
||||
If *Conn\Buffer : FreeMemory(*Conn\Buffer) : EndIf
|
||||
DeleteMapElement(Conns(), Key)
|
||||
EndIf
|
||||
EndSelect
|
||||
EndIf
|
||||
Until *Server\Stop
|
||||
|
||||
FreeMemory(*ChunkBuf)
|
||||
ForEach Conns()
|
||||
If Conns()\Buffer : FreeMemory(Conns()\Buffer) : EndIf
|
||||
Next
|
||||
CloseNetworkServer(*Server\ServerID)
|
||||
EndProcedure
|
||||
|
||||
EndModule
|
||||
|
||||
CompilerIf #PB_Compiler_IsMainFile
|
||||
OpenConsole("KUMO.S WebServer")
|
||||
|
||||
Define Port = 8080
|
||||
Define WebRoot.s = "C:\KUMOS\www"
|
||||
|
||||
Define *Srv = WebServer::Open(Port, WebRoot)
|
||||
If *Srv
|
||||
WebServer::AddFcgiPrefix(*Srv, "/api/")
|
||||
PrintN("WebServer running on :" + Str(Port))
|
||||
PrintN(" Static root : " + WebRoot)
|
||||
PrintN(" FCGI backend: 127.0.0.1:5600 (prefix: /api/)")
|
||||
PrintN("Press Enter to stop.")
|
||||
Input()
|
||||
WebServer::Close(*Srv)
|
||||
PrintN("Server stopped.")
|
||||
Else
|
||||
PrintN("ERROR: could not bind to port " + Str(Port))
|
||||
EndIf
|
||||
Input()
|
||||
CompilerEndIf
|
||||
|
||||
; IDE Options = PureBasic 6.30 (Windows - x64)
|
||||
; CursorPosition = 17
|
||||
; Folding = jAAA9
|
||||
; EnableXP
|
||||
; DPIAware
|
||||
98
Server/Main.pb
Normal file
@ -0,0 +1,98 @@
|
||||
UseZipPacker() ; must be at the top — compiler directive
|
||||
|
||||
IncludePath "Libraries"
|
||||
IncludeFile "FastCGI.pbi"
|
||||
CompilerIf #PB_Compiler_Debugger
|
||||
IncludeFile "WebServer.pbi"
|
||||
CompilerEndIf
|
||||
|
||||
IncludePath "Includes"
|
||||
IncludeFile "Modules.pbi"
|
||||
IncludeFile "Database.pbi"
|
||||
IncludeFile "General.pbi"
|
||||
IncludeFile "Auth.pbi"
|
||||
IncludeFile "FileSystem.pbi"
|
||||
IncludeFile "AppStore.pbi"
|
||||
IncludeFile "Router.pbi"
|
||||
|
||||
#FCGI_PORT = 9683
|
||||
#DB_PATH = "kumos.db"
|
||||
|
||||
Procedure RequestHandler(*Request)
|
||||
Router::Route(*Request)
|
||||
EndProcedure
|
||||
|
||||
OpenConsole("KUMO.S Server")
|
||||
UseSHA2Fingerprint()
|
||||
|
||||
If Not Database::Init(#DB_PATH)
|
||||
PrintN("[ERROR] Cannot open database: " + #DB_PATH)
|
||||
Input() : End 1
|
||||
EndIf
|
||||
PrintN("[ OK] Database ready: " + #DB_PATH)
|
||||
|
||||
If Database::UserCount() = 0
|
||||
Database::CreateUser("admin", "admin")
|
||||
PrintN("[INFO] Created default account: admin / admin")
|
||||
PrintN("[WARN] Change this password immediately after first login!")
|
||||
EndIf
|
||||
|
||||
Database::FSInit()
|
||||
PrintN("[ OK] Filesystem tables ready")
|
||||
|
||||
If FileSize("blobs") = -1
|
||||
CreateDirectory("blobs")
|
||||
PrintN("[ OK] Created blobs directory")
|
||||
EndIf
|
||||
|
||||
AppStore::Init() ; creates apps/ and tmp/ dirs, runs AppInit() DB migration
|
||||
PrintN("[ OK] App store ready")
|
||||
|
||||
Global *Server = FastCGI::Open(#FCGI_PORT, @RequestHandler(), "127.0.0.1")
|
||||
|
||||
If Not *Server
|
||||
PrintN("[ERROR] Failed to start FastCGI server on port " + Str(#FCGI_PORT))
|
||||
Database::Close()
|
||||
Input() : End 1
|
||||
EndIf
|
||||
|
||||
PrintN("[ OK] FastCGI listening on port " + Str(#FCGI_PORT))
|
||||
|
||||
CompilerIf #PB_Compiler_Debugger
|
||||
PrintN("Debug mode. Start a HTTP server on port 8080")
|
||||
*HTTP_Srv = WebServer::Open(8080, "./www", "127.0.0.1", 9683)
|
||||
If *HTTP_Srv
|
||||
WebServer::AddFcgiPrefix(*HTTP_Srv, "/api/")
|
||||
PrintN("[ OK] HTTP server ready. Visit http://localhost:8080/")
|
||||
Else
|
||||
PrintN("[ERROR] Failed to start HTTP server. Port 8080 already in use?")
|
||||
EndIf
|
||||
CompilerEndIf
|
||||
|
||||
|
||||
PrintN("")
|
||||
PrintN("Press Enter to stop.")
|
||||
PrintN("")
|
||||
|
||||
LastClean.i = Date()
|
||||
Repeat
|
||||
Delay(100)
|
||||
If Date() - LastClean > 60
|
||||
Database::CleanExpiredSessions()
|
||||
LastClean = Date()
|
||||
EndIf
|
||||
Until Inkey() = Chr(13)
|
||||
|
||||
PrintN("Shutting down...")
|
||||
FastCGI::Close(*Server)
|
||||
Database::Close()
|
||||
PrintN("Done. Press Enter to exit.")
|
||||
Input()
|
||||
|
||||
; IDE Options = PureBasic 6.30 (Windows - x64)
|
||||
; ExecutableFormat = Console
|
||||
; CursorPosition = 89
|
||||
; FirstLine = 14
|
||||
; Folding = -
|
||||
; EnableXP
|
||||
; DPIAware
|
||||
50
Server/www/index.html
Normal file
@ -0,0 +1,50 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<meta name="viewport" content="user-scalable=no, width=device-width, height=device-height, initial-scale=1, minimum-scale=1, maximum-scale=1, shrink-to-fit=no">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<script type="text/javascript">var spider = {}; spider.nbModules = 1; spider.nbLoadedModules = 0;</script>
|
||||
|
||||
<title>KUMO.S.</title>
|
||||
|
||||
<script type="text/javascript">function onLoad() { spiderCheckBrowser(); }</script>
|
||||
<script type="text/javascript" src="spiderbasic/platform.js"></script>
|
||||
<script type="text/javascript" src="spiderbasic/init.js"></script>
|
||||
<script type="text/javascript">dojoConfig.baseUrl = 'spiderbasic/'; </script>
|
||||
<script type="text/javascript" src="spiderbasic/dojo/dojo.js"></script>
|
||||
<script type="text/javascript" src="spiderbasic/debug.js?t=1777726808"></script>
|
||||
<script type="text/javascript">
|
||||
spider.debugFilename="D:\\Documents\\GitHub\\KUMOS\\Client\\Main.sb";
|
||||
spider.debugSourcePath="D:\\Documents\\GitHub\\KUMOS\\Client\\";
|
||||
spider.debugIncludes=[
|
||||
"D:\\Documents\\GitHub\\KUMOS\\Client\\Libraries\\IDB.sbi"
|
||||
,"D:\\Documents\\GitHub\\KUMOS\\Client\\Includes\\Modules.sbi"
|
||||
,"D:\\Documents\\GitHub\\KUMOS\\Client\\Includes\\General.sbi"
|
||||
,"D:\\Documents\\GitHub\\KUMOS\\Client\\Includes\\FileCache.sbi"
|
||||
,"D:\\Documents\\GitHub\\KUMOS\\Client\\Includes\\FS.sbi"
|
||||
,"D:\\Documents\\GitHub\\KUMOS\\Client\\Includes\\Notify.sbi"
|
||||
,"D:\\Documents\\GitHub\\KUMOS\\Client\\Includes\\Desktop.sbi"
|
||||
,"D:\\Documents\\GitHub\\KUMOS\\Client\\Includes\\Login.sbi"
|
||||
,"D:\\Documents\\GitHub\\KUMOS\\Client\\Includes\\AppRuntime.sbi"
|
||||
,"D:\\Documents\\GitHub\\KUMOS\\Client\\Default Apps\\TextEditor.sbi"
|
||||
,"D:\\Documents\\GitHub\\KUMOS\\Client\\Default Apps\\FileExplorer.sbi"
|
||||
,"D:\\Documents\\GitHub\\KUMOS\\Client\\Default Apps\\Settings.sbi"
|
||||
,"D:\\Documents\\GitHub\\KUMOS\\Client\\Default Apps\\WebBrowser.sbi"
|
||||
,"D:\\Documents\\GitHub\\KUMOS\\Client\\Default Apps\\AppManager.sbi"
|
||||
];
|
||||
if (window.spiderDebug) { window.spiderDebug( { "command": 0, "filename": spider.debugFilename, "sourcePath": spider.debugSourcePath, "includes": spider.debugIncludes } ); }
|
||||
</script>
|
||||
<script type="text/javascript" src="spiderbasic/main.js?t=1777726808"></script>
|
||||
<link rel="stylesheet" href="spiderbasic/dojo/themes/flat/flat.css" />
|
||||
<link rel="stylesheet" href="spiderbasic/dojo/dgrid/css/dgrid.css" />
|
||||
<script type="text/javascript" src="spiderbasic/xdate.min.js"></script>
|
||||
<link rel="stylesheet" title="Default" href="spiderbasic/themes/flat/window.css" type="text/css"/>
|
||||
<script type="text/javascript" src="js.js?t=1777726808"></script>
|
||||
|
||||
</head>
|
||||
|
||||
<body oncontextmenu="return false;" class="flat" id="spiderbody" onload="onLoad()">
|
||||
|
||||
</body>
|
||||
</html>
|
||||
5803
Server/www/js.js
Normal file
124
Server/www/kumos.js
Normal file
@ -0,0 +1,124 @@
|
||||
/**
|
||||
* KUMO.S App SDK — include in your app with:
|
||||
* <script src="/kumos.js"></script>
|
||||
*
|
||||
* All methods return Promises. Call KUMOS.ready() first.
|
||||
*
|
||||
* Permissions required per namespace:
|
||||
* storage.* — always available (private app namespace)
|
||||
* fs.* — requires "fs.read" or "fs.write" grant
|
||||
* notify.* — requires "notify" grant
|
||||
* window.* — always available
|
||||
*/
|
||||
(function (global) {
|
||||
'use strict';
|
||||
|
||||
var _pending = {}; // kmid → { resolve, reject, timer }
|
||||
|
||||
// ── Internal helpers ──────────────────────────────────────────────────────
|
||||
|
||||
function _uuid() {
|
||||
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
|
||||
var r = Math.random() * 16 | 0;
|
||||
return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
|
||||
});
|
||||
}
|
||||
|
||||
function _send(action, args) {
|
||||
return new Promise(function (resolve, reject) {
|
||||
var kmid = _uuid();
|
||||
var timer = setTimeout(function () {
|
||||
if (_pending[kmid]) {
|
||||
delete _pending[kmid];
|
||||
reject(new Error('KUMOS timeout: ' + action));
|
||||
}
|
||||
}, 15000);
|
||||
_pending[kmid] = { resolve: resolve, reject: reject, timer: timer };
|
||||
window.parent.postMessage(
|
||||
JSON.stringify({ kmid: kmid, action: action, args: args || {} }),
|
||||
'*'
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
// Incoming responses from the shell
|
||||
window.addEventListener('message', function (e) {
|
||||
if (e.source !== window.parent) return;
|
||||
var msg;
|
||||
try { msg = JSON.parse(e.data); } catch (err) { return; }
|
||||
if (!msg || !msg.kmid) return;
|
||||
var p = _pending[msg.kmid];
|
||||
if (!p) return;
|
||||
clearTimeout(p.timer);
|
||||
delete _pending[msg.kmid];
|
||||
if (msg.success) {
|
||||
p.resolve(msg.data !== undefined ? msg.data : null);
|
||||
} else {
|
||||
p.reject(new Error(msg.error || 'Unknown error'));
|
||||
}
|
||||
});
|
||||
|
||||
// ── Public API ────────────────────────────────────────────────────────────
|
||||
|
||||
var KUMOS = {
|
||||
|
||||
/**
|
||||
* Handshake with the shell. Resolves with { app_id }.
|
||||
* Always call this first and await it before using any other APIs.
|
||||
*/
|
||||
ready: function () {
|
||||
return _send('window.ready', {});
|
||||
},
|
||||
|
||||
// ── Private app storage (no extra permission required) ───────────────
|
||||
|
||||
storage: {
|
||||
/** Read a file. Resolves with the content string. */
|
||||
read: function (path) { return _send('storage.read', { path: path }); },
|
||||
/** Write content to a file. Creates it if it does not exist. */
|
||||
write: function (path, content) { return _send('storage.write', { path: path, content: content }); },
|
||||
/** List a directory. Resolves with an array of entry objects. */
|
||||
list: function (path) { return _send('storage.list', { path: path || '/' }); },
|
||||
/** Stat a path. */
|
||||
stat: function (path) { return _send('storage.stat', { path: path }); },
|
||||
/** Create a directory. */
|
||||
mkdir: function (path) { return _send('storage.mkdir', { path: path }); },
|
||||
/** Delete a file. */
|
||||
delete: function (path) { return _send('storage.delete', { path: path }); }
|
||||
},
|
||||
|
||||
// ── User filesystem (requires fs.read / fs.write permission) ─────────
|
||||
|
||||
fs: {
|
||||
/** Read a file from the user's filesystem. */
|
||||
read: function (path) { return _send('fs.read', { path: path }); },
|
||||
/** Write content to a file in the user's filesystem. */
|
||||
write: function (path, content) { return _send('fs.write', { path: path, content: content }); },
|
||||
/** List a directory. */
|
||||
list: function (path) { return _send('fs.list', { path: path || '/' }); },
|
||||
/** Stat a path. */
|
||||
stat: function (path) { return _send('fs.stat', { path: path }); }
|
||||
},
|
||||
|
||||
// ── Notifications (requires notify permission) ────────────────────────
|
||||
|
||||
notify: {
|
||||
/** Show a toast. type: 'info' | 'success' | 'warning' | 'error' */
|
||||
toast: function (message, type) { return _send('notify.toast', { message: message, type: type || 'info' }); },
|
||||
/** Show a confirm dialog. Resolves with true (OK) or false (Cancel). */
|
||||
confirm: function (title, message) { return _send('notify.confirm', { title: title, message: message }); }
|
||||
},
|
||||
|
||||
// ── Window control ────────────────────────────────────────────────────
|
||||
|
||||
window: {
|
||||
/** Update the host window title. */
|
||||
setTitle: function (title) { return _send('window.setTitle', { title: title }); },
|
||||
/** Close this app instance. */
|
||||
close: function () { return _send('window.close', {}); }
|
||||
}
|
||||
};
|
||||
|
||||
global.KUMOS = KUMOS;
|
||||
|
||||
}(window));
|
||||
3
Server/www/spiderbasic/canvas-toBlob.min.js
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
(function(a){var l=a.Uint8Array,d=(a=a.HTMLCanvasElement)&&a.prototype,t=/\s*;\s*base64\s*(?:;|$)/i,n="toDataURL",s;l&&(s=new l([62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,0,-1,-1,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51]));a&&!d.toBlob&&(d.toBlob=function(a,g){g||(g="image/png");if(this.mozGetAsFile)a(this.mozGetAsFile("canvas",g));else if(this.msToBlob&&/^\s*image\/png\s*(?:$|;)/i.test(g))a(this.msToBlob());
|
||||
else{var e=Array.prototype.slice.call(arguments,1),b=this[n].apply(this,e),f=b.indexOf(","),e=b.substring(f+1),b=t.test(b.substring(0,f)),c;if(Blob.fake)c=new Blob,c.encoding=b?"base64":"URI",c.data=e,c.size=e.length;else if(l)if(b){c=Blob;for(var b=e.length,f=new l(b/4*3|0),d=0,p=0,h=[0,0],q=0,k=0,m,r;b--;)r=e.charCodeAt(d++),m=s[r-43],255!==m&&void 0!==m&&(h[1]=h[0],h[0]=r,k=k<<6|m,q++,4===q&&(f[p++]=k>>>16,61!==h[1]&&(f[p++]=k>>>8),61!==h[0]&&(f[p++]=k),q=0));c=new c([f],{type:g})}else c=new Blob([decodeURIComponent(e)],
|
||||
{type:g});a(c)}},d.toBlobHD=d.toDataURLHD?function(){n="toDataURLHD";var a=this.toBlob();n="toDataURL";return a}:d.toBlob)})("undefined"!==typeof self&&self||"undefined"!==typeof window&&window||this.content||this);
|
||||
1214
Server/www/spiderbasic/canvas2svg.js
Normal file
109
Server/www/spiderbasic/cipher/crc.js
Normal file
@ -0,0 +1,109 @@
|
||||
/*
|
||||
* js-crc v0.1.0
|
||||
* https://github.com/emn178/js-crc
|
||||
*
|
||||
* Copyright 2015, emn178@gmail.com
|
||||
*
|
||||
* Licensed under the MIT license:
|
||||
* http://www.opensource.org/licenses/MIT
|
||||
*/
|
||||
;(function(root, undefined) {
|
||||
'use strict';
|
||||
|
||||
var NODE_JS = typeof(module) != 'undefined';
|
||||
if(NODE_JS) {
|
||||
root = global;
|
||||
}
|
||||
var HEX_CHARS = '0123456789abcdef'.split('');
|
||||
|
||||
var Modules = [
|
||||
{
|
||||
name: 'crc32',
|
||||
polynom: 0xEDB88320,
|
||||
initValue: -1,
|
||||
bytes: 4
|
||||
},
|
||||
{
|
||||
name: 'crc16',
|
||||
polynom: 0xA001,
|
||||
initValue: 0,
|
||||
bytes: 2
|
||||
}
|
||||
];
|
||||
|
||||
var i, j, k, b;
|
||||
for(i = 0;i < Modules.length;++i) {
|
||||
var m = Modules[i];
|
||||
m.method = (function(m) {
|
||||
// SpiderBasic hack
|
||||
return function(message, initValue) {
|
||||
return crc(message, m, initValue);
|
||||
};
|
||||
})(m);
|
||||
m.table = [];
|
||||
for(j = 0;j < 256;++j) {
|
||||
b = j;
|
||||
for(k = 0;k < 8;++k) {
|
||||
b = b & 1 ? m.polynom ^ (b >>> 1) : b >>> 1;
|
||||
}
|
||||
m.table[j] = b >>> 0;
|
||||
}
|
||||
}
|
||||
|
||||
var crc = function(message, module, initValue) {
|
||||
var notString = typeof(message) != 'string';
|
||||
if(notString && message.constructor == ArrayBuffer) {
|
||||
message = new Uint8Array(message);
|
||||
}
|
||||
|
||||
// SpiderBasic hack
|
||||
var crc = initValue ^ 0xffffffff, code, i, length = message.length, table = module.table;
|
||||
if(notString) {
|
||||
for(i = 0;i < length;++i) {
|
||||
crc = table[(crc ^ message[i]) & 0xFF] ^ (crc >>> 8);
|
||||
}
|
||||
} else {
|
||||
for(i = 0;i < length;++i) {
|
||||
code = message.charCodeAt(i);
|
||||
if (code < 0x80) {
|
||||
crc = table[(crc ^ code) & 0xFF] ^ (crc >>> 8);
|
||||
} else if (code < 0x800) {
|
||||
crc = table[(crc ^ (0xc0 | (code >> 6))) & 0xFF] ^ (crc >>> 8);
|
||||
crc = table[(crc ^ (0x80 | (code & 0x3f))) & 0xFF] ^ (crc >>> 8);
|
||||
} else if (code < 0xd800 || code >= 0xe000) {
|
||||
crc = table[(crc ^ (0xe0 | (code >> 12))) & 0xFF] ^ (crc >>> 8);
|
||||
crc = table[(crc ^ (0x80 | ((code >> 6) & 0x3f))) & 0xFF] ^ (crc >>> 8);
|
||||
crc = table[(crc ^ (0x80 | (code & 0x3f))) & 0xFF] ^ (crc >>> 8);
|
||||
} else {
|
||||
code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++i) & 0x3ff));
|
||||
crc = table[(crc ^ (0xf0 | (code >> 18))) & 0xFF] ^ (crc >>> 8);
|
||||
crc = table[(crc ^ (0x80 | ((code >> 12) & 0x3f))) & 0xFF] ^ (crc >>> 8);
|
||||
crc = table[(crc ^ (0x80 | ((code >> 6) & 0x3f))) & 0xFF] ^ (crc >>> 8);
|
||||
crc = table[(crc ^ (0x80 | (code & 0x3f))) & 0xFF] ^ (crc >>> 8);
|
||||
}
|
||||
}
|
||||
}
|
||||
// SpiderBasic hack
|
||||
crc ^= 0xffffffff;
|
||||
|
||||
var hex = '';
|
||||
if(module.bytes > 2) {
|
||||
hex += HEX_CHARS[(crc >> 28) & 0x0F] + HEX_CHARS[(crc >> 24) & 0x0F] +
|
||||
HEX_CHARS[(crc >> 20) & 0x0F] + HEX_CHARS[(crc >> 16) & 0x0F];
|
||||
}
|
||||
hex += HEX_CHARS[(crc >> 12) & 0x0F] + HEX_CHARS[(crc >> 8) & 0x0F] +
|
||||
HEX_CHARS[(crc >> 4) & 0x0F] + HEX_CHARS[crc & 0x0F];
|
||||
return hex;
|
||||
};
|
||||
|
||||
var exports;
|
||||
if(!root.HI_CRC32_TEST && NODE_JS) {
|
||||
exports = module.exports = {};
|
||||
} else if(root) {
|
||||
exports = root;
|
||||
}
|
||||
for(i = 0;i < Modules.length;++i) {
|
||||
var m = Modules[i];
|
||||
exports[m.name] = m.method;
|
||||
}
|
||||
}(this));
|
||||
1
Server/www/spiderbasic/cipher/md5.js
Normal file
23
Server/www/spiderbasic/cipher/sha3.js
Normal file
@ -0,0 +1,23 @@
|
||||
/*
|
||||
* js-sha3 v0.5.1
|
||||
* https://github.com/emn178/js-sha3
|
||||
*
|
||||
* Copyright 2015, emn178@gmail.com
|
||||
*
|
||||
* Licensed under the MIT license:
|
||||
* http://www.opensource.org/licenses/MIT
|
||||
*/
|
||||
(function(r,ma){function n(a,b,c){this.blocks=[];this.s=[];this.padding=b;this.outputBits=c;this.reset=!0;this.start=this.block=0;this.blockCount=1600-(a<<1)>>5;this.byteCount=this.blockCount<<2;this.outputBlocks=c>>5;this.extraBytes=(c&31)>>3;for(a=0;50>a;++a)this.s[a]=0}var ga="undefined"!=typeof module;ga&&(r=global,r.JS_SHA3_TEST&&(r.navigator={userAgent:"Chrome"}));for(var l="0123456789abcdef".split(""),p=[0,8,16,24],ha=[1,0,32898,0,32906,2147483648,2147516416,2147483648,32907,0,2147483649,0,
|
||||
2147516545,2147483648,32777,2147483648,138,0,136,0,2147516425,0,2147483658,0,2147516555,0,139,2147483648,32905,2147483648,32771,2147483648,32770,2147483648,128,2147483648,32778,0,2147483658,2147483648,2147516545,2147483648,32896,2147483648,2147483649,0,2147516424,2147483648],t=[224,256,384,512],w=["hex","buffer","array"],ia=function(a,b,c){return function(e){return(new n(a,b,a)).update(e)[c]()}},ja=function(a,b,c){return function(e,g){return(new n(a,b,g)).update(e)[c]()}},q=function(a,b){var c=ia(a,
|
||||
b,"hex");c.create=function(){return new n(a,b,a)};c.update=function(a){return c.create().update(a)};for(var e=0;e<w.length;++e){var g=w[e];c[g]=ia(a,b,g)}return c},t=[{name:"keccak",padding:[1,256,65536,16777216],bits:t,createMethod:q},{name:"sha3",padding:[6,1536,393216,100663296],bits:t,createMethod:q},{name:"shake",padding:[31,7936,2031616,520093696],bits:[128,256],createMethod:function(a,b){var c=ja(a,b,"hex");c.create=function(c){return new n(a,b,c)};c.update=function(a,b){return c.create(b).update(a)};
|
||||
for(var e=0;e<w.length;++e){var g=w[e];c[g]=ja(a,b,g)}return c}}],x={},ea=0;ea<t.length;++ea)for(var u=t[ea],fa=u.bits,q=u.createMethod,q=0;q<fa.length;++q){var la=u.createMethod(fa[q],u.padding);x[u.name+"_"+fa[q]]=la}n.prototype.update=function(a){var b="string"!=typeof a;b&&a.constructor==r.ArrayBuffer&&(a=new Uint8Array(a));for(var c=a.length,e=this.blocks,g=this.byteCount,k=this.blockCount,h=0,f=this.s,d,m;h<c;){if(this.reset)for(this.reset=!1,e[0]=this.block,d=1;d<k+1;++d)e[d]=0;if(b)for(d=
|
||||
this.start;h<c&&d<g;++h)e[d>>2]|=a[h]<<p[d++&3];else for(d=this.start;h<c&&d<g;++h)m=a.charCodeAt(h),128>m?e[d>>2]|=m<<p[d++&3]:(2048>m?e[d>>2]|=(192|m>>6)<<p[d++&3]:(55296>m||57344<=m?e[d>>2]|=(224|m>>12)<<p[d++&3]:(m=65536+((m&1023)<<10|a.charCodeAt(++h)&1023),e[d>>2]|=(240|m>>18)<<p[d++&3],e[d>>2]|=(128|m>>12&63)<<p[d++&3]),e[d>>2]|=(128|m>>6&63)<<p[d++&3]),e[d>>2]|=(128|m&63)<<p[d++&3]);this.lastByteIndex=d;if(d>=g){this.start=d-g;this.block=e[k];for(d=0;d<k;++d)f[d]^=e[d];v(f);this.reset=!0}else this.start=
|
||||
d}return this};n.prototype.finalize=function(){var a=this.blocks,b=this.lastByteIndex,c=this.blockCount,e=this.s;a[b>>2]|=this.padding[b&3];if(this.lastByteIndex==this.byteCount)for(a[0]=a[c],b=1;b<c+1;++b)a[b]=0;a[c-1]|=2147483648;for(b=0;b<c;++b)e[b]^=a[b];v(e)};n.prototype.toString=n.prototype.hex=function(){this.finalize();for(var a=this.blockCount,b=this.s,c=this.outputBlocks,e=this.extraBytes,g=0,k=0,h="",f;k<c;){for(g=0;g<a&&k<c;++g,++k)f=b[g],h+=l[f>>4&15]+l[f&15]+l[f>>12&15]+l[f>>8&15]+l[f>>
|
||||
20&15]+l[f>>16&15]+l[f>>28&15]+l[f>>24&15];0==k%a&&v(b)}e&&(f=b[g],0<e&&(h+=l[f>>4&15]+l[f&15]),1<e&&(h+=l[f>>12&15]+l[f>>8&15]),2<e&&(h+=l[f>>20&15]+l[f>>16&15]));return h};n.prototype.buffer=function(){this.finalize();var a=this.blockCount,b=this.s,c=this.outputBlocks,e=this.extraBytes,g=0,k=0,h=this.outputBits>>3,f;f=e?new ArrayBuffer(c+1<<2):new ArrayBuffer(h);for(var d=new Uint32Array(f);k<c;){for(g=0;g<a&&k<c;++g,++k)d[k]=b[g];0==k%a&&v(b)}e&&(d[g]=b[g],f=f.slice(0,h));return f};n.prototype.digest=
|
||||
n.prototype.array=function(){this.finalize();for(var a=this.blockCount,b=this.s,c=this.outputBlocks,e=this.extraBytes,g=0,k=0,h=[],f,d;k<c;){for(g=0;g<a&&k<c;++g,++k)f=k<<2,d=b[g],h[f]=d&255,h[f+1]=d>>8&255,h[f+2]=d>>16&255,h[f+3]=d>>24&255;0==k%a&&v(b)}e&&(f=k<<2,d=b[g],0<e&&(h[f]=d&255),1<e&&(h[f+1]=d>>8&255),2<e&&(h[f+2]=d>>16&255));return h};var v=function(a){var b,c,e,g,k,h,f,d,m,l,n,p,q,r,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,aa,ba,ca,da;for(e=0;48>e;e+=2)g=a[0]^
|
||||
a[10]^a[20]^a[30]^a[40],k=a[1]^a[11]^a[21]^a[31]^a[41],h=a[2]^a[12]^a[22]^a[32]^a[42],f=a[3]^a[13]^a[23]^a[33]^a[43],d=a[4]^a[14]^a[24]^a[34]^a[44],m=a[5]^a[15]^a[25]^a[35]^a[45],l=a[6]^a[16]^a[26]^a[36]^a[46],n=a[7]^a[17]^a[27]^a[37]^a[47],p=a[8]^a[18]^a[28]^a[38]^a[48],q=a[9]^a[19]^a[29]^a[39]^a[49],b=p^(h<<1|f>>>31),c=q^(f<<1|h>>>31),a[0]^=b,a[1]^=c,a[10]^=b,a[11]^=c,a[20]^=b,a[21]^=c,a[30]^=b,a[31]^=c,a[40]^=b,a[41]^=c,b=g^(d<<1|m>>>31),c=k^(m<<1|d>>>31),a[2]^=b,a[3]^=c,a[12]^=b,a[13]^=c,a[22]^=
|
||||
b,a[23]^=c,a[32]^=b,a[33]^=c,a[42]^=b,a[43]^=c,b=h^(l<<1|n>>>31),c=f^(n<<1|l>>>31),a[4]^=b,a[5]^=c,a[14]^=b,a[15]^=c,a[24]^=b,a[25]^=c,a[34]^=b,a[35]^=c,a[44]^=b,a[45]^=c,b=d^(p<<1|q>>>31),c=m^(q<<1|p>>>31),a[6]^=b,a[7]^=c,a[16]^=b,a[17]^=c,a[26]^=b,a[27]^=c,a[36]^=b,a[37]^=c,a[46]^=b,a[47]^=c,b=l^(g<<1|k>>>31),c=n^(k<<1|g>>>31),a[8]^=b,a[9]^=c,a[18]^=b,a[19]^=c,a[28]^=b,a[29]^=c,a[38]^=b,a[39]^=c,a[48]^=b,a[49]^=c,b=a[0],c=a[1],M=a[11]<<4|a[10]>>>28,N=a[10]<<4|a[11]>>>28,u=a[20]<<3|a[21]>>>29,v=
|
||||
a[21]<<3|a[20]>>>29,aa=a[31]<<9|a[30]>>>23,ba=a[30]<<9|a[31]>>>23,I=a[40]<<18|a[41]>>>14,J=a[41]<<18|a[40]>>>14,A=a[2]<<1|a[3]>>>31,B=a[3]<<1|a[2]>>>31,g=a[13]<<12|a[12]>>>20,k=a[12]<<12|a[13]>>>20,O=a[22]<<10|a[23]>>>22,P=a[23]<<10|a[22]>>>22,w=a[33]<<13|a[32]>>>19,x=a[32]<<13|a[33]>>>19,ca=a[42]<<2|a[43]>>>30,da=a[43]<<2|a[42]>>>30,U=a[5]<<30|a[4]>>>2,V=a[4]<<30|a[5]>>>2,C=a[14]<<6|a[15]>>>26,D=a[15]<<6|a[14]>>>26,h=a[25]<<11|a[24]>>>21,f=a[24]<<11|a[25]>>>21,Q=a[34]<<15|a[35]>>>17,R=a[35]<<15|
|
||||
a[34]>>>17,y=a[45]<<29|a[44]>>>3,z=a[44]<<29|a[45]>>>3,p=a[6]<<28|a[7]>>>4,q=a[7]<<28|a[6]>>>4,W=a[17]<<23|a[16]>>>9,X=a[16]<<23|a[17]>>>9,E=a[26]<<25|a[27]>>>7,F=a[27]<<25|a[26]>>>7,d=a[36]<<21|a[37]>>>11,m=a[37]<<21|a[36]>>>11,S=a[47]<<24|a[46]>>>8,T=a[46]<<24|a[47]>>>8,K=a[8]<<27|a[9]>>>5,L=a[9]<<27|a[8]>>>5,r=a[18]<<20|a[19]>>>12,t=a[19]<<20|a[18]>>>12,Y=a[29]<<7|a[28]>>>25,Z=a[28]<<7|a[29]>>>25,G=a[38]<<8|a[39]>>>24,H=a[39]<<8|a[38]>>>24,l=a[48]<<14|a[49]>>>18,n=a[49]<<14|a[48]>>>18,a[0]=b^~g&
|
||||
h,a[1]=c^~k&f,a[10]=p^~r&u,a[11]=q^~t&v,a[20]=A^~C&E,a[21]=B^~D&F,a[30]=K^~M&O,a[31]=L^~N&P,a[40]=U^~W&Y,a[41]=V^~X&Z,a[2]=g^~h&d,a[3]=k^~f&m,a[12]=r^~u&w,a[13]=t^~v&x,a[22]=C^~E&G,a[23]=D^~F&H,a[32]=M^~O&Q,a[33]=N^~P&R,a[42]=W^~Y&aa,a[43]=X^~Z&ba,a[4]=h^~d&l,a[5]=f^~m&n,a[14]=u^~w&y,a[15]=v^~x&z,a[24]=E^~G&I,a[25]=F^~H&J,a[34]=O^~Q&S,a[35]=P^~R&T,a[44]=Y^~aa&ca,a[45]=Z^~ba&da,a[6]=d^~l&b,a[7]=m^~n&c,a[16]=w^~y&p,a[17]=x^~z&q,a[26]=G^~I&A,a[27]=H^~J&B,a[36]=Q^~S&K,a[37]=R^~T&L,a[46]=aa^~ca&U,a[47]=
|
||||
ba^~da&V,a[8]=l^~b&g,a[9]=n^~c&k,a[18]=y^~p&r,a[19]=z^~q&t,a[28]=I^~A&C,a[29]=J^~B&D,a[38]=S^~K&M,a[39]=T^~L&N,a[48]=ca^~U&W,a[49]=da^~V&X,a[0]^=ha[e],a[1]^=ha[e+1]};if(!r.JS_SHA3_TEST&&ga)module.exports=x;else if(r)for(var ka in x)r[ka]=x[ka]})(this);
|
||||
211
Server/www/spiderbasic/debug.js
Normal file
@ -0,0 +1,211 @@
|
||||
|
||||
spider.debug = {
|
||||
y : 0,
|
||||
window : null,
|
||||
editorGadget : null,
|
||||
disabled: false,
|
||||
fatalError: false,
|
||||
Init : function() {
|
||||
|
||||
// A webview is attached, don't display the built-in debug window
|
||||
if (window.spiderDebug)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
this.window = spider_OpenWindow(-1, 0, 0, 350, 150, "SpiderBasic - Debug output", (1 << 4) | (1 << 5));
|
||||
|
||||
this.editorGadget = spider_EditorGadget(-1, 5, 5, spider_WindowWidth(spider.debug.window) - 10, spider_WindowHeight(spider.debug.window) - 10, (1 << 0));
|
||||
spider_StickyWindow(this.window, 1);
|
||||
|
||||
// Position the window in the top/right corner
|
||||
spider_ResizeWindow(this.window, spider_DesktopWidth() - spider_WindowWidth(this.window, 1)-10, 10, -0xFFFF , -0xFFFF)
|
||||
|
||||
spider_BindEvent(4, // PB_Event_CloseWindow
|
||||
function() {
|
||||
spider_CloseWindow(spider.debug.window);
|
||||
spider.debug.disabled = true;
|
||||
},
|
||||
this.window);
|
||||
|
||||
spider_BindEvent(7, // PB_Event_SizeWindow
|
||||
function() {
|
||||
spider_ResizeGadget(spider.debug.editorGadget, 5, 5, spider_WindowWidth(spider.debug.window) - 10, spider_WindowHeight(spider.debug.window) - 10);
|
||||
},
|
||||
this.window);
|
||||
},
|
||||
|
||||
RawPrint : function(text) {
|
||||
|
||||
if (this.editorGadget && !this.disabled)
|
||||
{
|
||||
spider_SetGadgetText(this.editorGadget, spider_GetGadgetText(this.editorGadget)+text+"\n");
|
||||
|
||||
var editorTextArea = spider_GadgetID(this.editorGadget).gadget.domNode;
|
||||
|
||||
// Use jquery animate to scroll down automatically
|
||||
$(editorTextArea).animate({
|
||||
scrollTop:$(editorTextArea)[0].scrollHeight - $(editorTextArea).height()
|
||||
},0);
|
||||
}
|
||||
},
|
||||
|
||||
Print : function(text) {
|
||||
|
||||
if (spider.debug.fatalError) // Don't do anything if the program has already crash
|
||||
return;
|
||||
|
||||
// log in browser console first, just in case the GUI text doesn't work
|
||||
console.log(text);
|
||||
|
||||
// A webview is attached, forward the debug to the IDE debug output
|
||||
if (window.spiderDebug)
|
||||
{
|
||||
window.spiderDebug({"command": 5, "text": ""+text });
|
||||
}
|
||||
else
|
||||
{
|
||||
this.RawPrint(text);
|
||||
}
|
||||
},
|
||||
|
||||
CheckSingleFlags : function(parameter, flags, allowedFlags)
|
||||
{
|
||||
var callerName = spider.debug.CheckSingleFlags.caller.name;
|
||||
var functionName = callerName.substring(7, callerName.length - 6); // remove 'spider_' and '_DEBUG'
|
||||
|
||||
if (allowedFlags.indexOf(flags) === -1)
|
||||
throw new Error(functionName+"(): : invalid value specified for parameter '"+parameter+"'.", { cause: "spider" });
|
||||
},
|
||||
|
||||
CheckCombinationFlags : function(parameter, flags, allowedFlags)
|
||||
{
|
||||
var callerName = spider.debug.CheckCombinationFlags.caller.name;
|
||||
var functionName = callerName.substring(7, callerName.length - 6); // remove 'spider_' and '_DEBUG'
|
||||
|
||||
var allFlags = 0;
|
||||
for (var k = 0; k < allowedFlags.length; k++)
|
||||
{
|
||||
allFlags |= allowedFlags[k];
|
||||
}
|
||||
|
||||
if ((allFlags & flags) !== flags) // Something is wrong is the specified value doesn't fit in the flags
|
||||
throw new Error(functionName+"(): : invalid value specified for parameter '"+parameter+"'.", { cause: "spider" });
|
||||
},
|
||||
|
||||
Error : function(text, callerName)
|
||||
{
|
||||
if (spider.debug.fatalError) // Don't do anything if the program has already crash
|
||||
return;
|
||||
|
||||
if (typeof callerName === "undefined")
|
||||
{
|
||||
callerName = spider.debug.Error.caller.name;
|
||||
}
|
||||
|
||||
functionName = callerName.substring(7, callerName.length - 6); // remove 'spider_' and '_DEBUG'
|
||||
|
||||
throw new Error(functionName+"(): "+text, { cause: "spider" });
|
||||
},
|
||||
|
||||
CheckId : function(callerName, ObjectName, id)
|
||||
{
|
||||
if (spider.debug.fatalError) // Don't do anything if the program has already crash
|
||||
return;
|
||||
|
||||
var functionName = callerName.substring(7, callerName.length - 6); // remove 'spider_' and '_DEBUG'
|
||||
|
||||
if (id < -1)
|
||||
throw new Error(functionName+"(): #"+ObjectName+" object number can't be negative (value: "+id+").", { cause: "spider" });
|
||||
else if (id >= 10000)
|
||||
throw new Error(functionName+"(): #"+ObjectName+" object number is very high (over 10000), are you sure of that ?", { cause: "spider" });
|
||||
},
|
||||
|
||||
CheckObject : function(callerName, ObjectName, isObject)
|
||||
{
|
||||
if (spider.debug.fatalError) // Don't do anything if the program has already crash
|
||||
return;
|
||||
|
||||
var functionName = callerName.substring(7, callerName.length - 6); // remove 'spider_' and '_DEBUG'
|
||||
|
||||
if (isObject === 0)
|
||||
throw new Error(functionName+"(): The specified #"+ObjectName+" is not initialised.", { cause: "spider" });
|
||||
},
|
||||
|
||||
ThrowError : function(functionName, text)
|
||||
{
|
||||
if (spider.debug.fatalError) // Don't do anything if the program has already crash
|
||||
return;
|
||||
|
||||
throw new Error(functionName+"(): "+ text, { cause: "spider" });
|
||||
},
|
||||
|
||||
DebuggerLineGetLine : function(a)
|
||||
{
|
||||
return ((a) & ((1 << 20)-1));
|
||||
},
|
||||
|
||||
DebuggerLineGetFile : function(a)
|
||||
{
|
||||
return (((a) >> 20) & ((1 << (32-20))-1));
|
||||
},
|
||||
|
||||
DisplayError : function(text)
|
||||
{
|
||||
if (spider.debug.fatalError) // Don't do anything if the program has already crash
|
||||
return;
|
||||
|
||||
// A webview is attached
|
||||
if (window.spiderDebug)
|
||||
{
|
||||
window.spiderDebug( { "command": 8, "lineId": spiderLine, "text": text } );
|
||||
}
|
||||
else
|
||||
{
|
||||
var line = spider.debug.DebuggerLineGetLine(spiderLine)+1;
|
||||
var fileIndex = spider.debug.DebuggerLineGetFile(spiderLine);
|
||||
var filename = spider.debugFilename;
|
||||
|
||||
if (fileIndex > 0) // It's an include file
|
||||
{
|
||||
filename = spider.debugIncludes[fileIndex-1];
|
||||
}
|
||||
|
||||
spider.debug.Print(filename+":"+line+" "+text);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
// temporary Shortcut
|
||||
spider.Debug = function(text) {
|
||||
spider.debug.Print(text);
|
||||
};
|
||||
|
||||
// temporary Shortcut
|
||||
function debug(text) {
|
||||
spider.debug.Print(text);
|
||||
}
|
||||
|
||||
// global error handler
|
||||
window.addEventListener("error", (event) => {
|
||||
|
||||
if (spider.debug.fatalError) // Don't do anything if the program has already crash
|
||||
return;
|
||||
|
||||
var text;
|
||||
if (event.error.cause == "spider") // It's a SpiderBasic exception
|
||||
{
|
||||
text = event.error.message;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Not a SpiderBasic exception, put the full details
|
||||
text = `${event.type}: ${event.message} (${event.filename}, line: ${event.lineno})`;
|
||||
}
|
||||
|
||||
spider.debug.DisplayError(text);
|
||||
|
||||
spider.debug.fatalError = true;
|
||||
});
|
||||
|
||||
25
Server/www/spiderbasic/dojo/cbtree/errors/CBTErrors.json
Normal file
@ -0,0 +1,25 @@
|
||||
[
|
||||
{"AbstractOnlyError": {"text":"method is abstract only and requires implementation"} },
|
||||
{"AccessError": {"text":"requested or required access is not allowed"} },
|
||||
{"ItemExistError": {"text":"object with specified ID already exist"} },
|
||||
{"InvalidAccessError": {"text":"operation or parameter is not allowed"} },
|
||||
{"InvalidDataError": {"text":"store data must be an array of objects"} },
|
||||
{"InvalidParameterError": {"text":"Invalid parameter specified"} },
|
||||
{"InvalidPropertyError": {"text":"invalid property or type specified"} },
|
||||
{"InvalidObjectError": {"text":"item is not an a valid store object"} },
|
||||
{"InvalidPathError": {"text":"invalid path"} },
|
||||
{"InvalidResponseError": {"text":"function returned an invalid or unexpected response"} },
|
||||
{"InvalidTypeError": {"text":"parameter or property type is invalid"} },
|
||||
{"InvalidVersionError": {"text":"invalid dojo or dijit version"} },
|
||||
{"InvalidWidgetError": {"text":"invalid widget"} },
|
||||
{"MethodMissingError": {"text":"a required function is missing"} },
|
||||
{"NotFoundError": {"text":"the object can not be found here."} },
|
||||
{"ParameterMissingError": {"text":"required parameter is missing"} },
|
||||
{"PropertyMissingError": {"text":"required property is missing"} },
|
||||
{"ReadOnlyError": {"text":"property is READ-ONLY"} },
|
||||
{"RequestCancelError": {"text":"request was canceled"} },
|
||||
{"RequestError": {"text":"XHR request failed"} },
|
||||
{"RequestPendingError": {"text":"another request is still pending"} },
|
||||
{"UnknownVersionError": {"text":"unknown dojo and/or dijit version"} }
|
||||
]
|
||||
|
||||
1
Server/www/spiderbasic/dojo/cbtree/icons/fileIconsMS.css
Normal file
@ -0,0 +1 @@
|
||||
.claro .cbtreeCheckBox {background-image: url('images/spriteCheckbox.gif'); background-repeat: no-repeat; width: 16px; height: 16px; margin: 0; padding: 0;}.claro .cbtreeCheckBox {background-position: -16px;}.claro .cbtreeCheckBoxChecked {background-position: 0px;}.claro .cbtreeCheckBoxMixed {background-position: -32px;}.claro .cbtreeCheckBoxDisabled {background-position: -64px;}.claro .cbtreeCheckBoxCheckedDisabled {background-position: -48px;}.claro .cbtreeCheckBoxMixedDisabled {background-position: -80px;}.claro .cbtreeCheckBoxReadOnly {background-position: -64px;}.claro .cbtreeCheckBoxCheckedReadOnly {background-position: -48px;}.claro .cbtreeCheckBoxMixedReadOnly {background-position: -80px;}.claro .cbtreeCheckBoxHover {background-position: -112px;}.claro .cbtreeCheckBoxCheckedHover {background-position: -96px;}.claro .cbtreeCheckBoxMixedHover {background-position: -128px;}
|
||||
1
Server/www/spiderbasic/dojo/dgrid/css/dgrid.css
Normal file
|
After Width: | Height: | Size: 4.3 KiB |
|
After Width: | Height: | Size: 4.9 KiB |
1122
Server/www/spiderbasic/dojo/dojo.js
vendored
Normal file
10
Server/www/spiderbasic/dojo/nls/colors.js
Normal file
@ -0,0 +1,10 @@
|
||||
//>>built
|
||||
define("dojo/nls/colors",{root:{aliceblue:"alice blue",antiquewhite:"antique white",aqua:"aqua",aquamarine:"aquamarine",azure:"azure",beige:"beige",bisque:"bisque",black:"black",blanchedalmond:"blanched almond",blue:"blue",blueviolet:"blue-violet",brown:"brown",burlywood:"burlywood",cadetblue:"cadet blue",chartreuse:"chartreuse",chocolate:"chocolate",coral:"coral",cornflowerblue:"cornflower blue",cornsilk:"cornsilk",crimson:"crimson",cyan:"cyan",darkblue:"dark blue",darkcyan:"dark cyan",darkgoldenrod:"dark goldenrod",
|
||||
darkgray:"dark gray",darkgreen:"dark green",darkgrey:"dark gray",darkkhaki:"dark khaki",darkmagenta:"dark magenta",darkolivegreen:"dark olive green",darkorange:"dark orange",darkorchid:"dark orchid",darkred:"dark red",darksalmon:"dark salmon",darkseagreen:"dark sea green",darkslateblue:"dark slate blue",darkslategray:"dark slate gray",darkslategrey:"dark slate gray",darkturquoise:"dark turquoise",darkviolet:"dark violet",deeppink:"deep pink",deepskyblue:"deep sky blue",dimgray:"dim gray",dimgrey:"dim gray",
|
||||
dodgerblue:"dodger blue",firebrick:"fire brick",floralwhite:"floral white",forestgreen:"forest green",fuchsia:"fuchsia",gainsboro:"gainsboro",ghostwhite:"ghost white",gold:"gold",goldenrod:"goldenrod",gray:"gray",green:"green",greenyellow:"green-yellow",grey:"gray",honeydew:"honeydew",hotpink:"hot pink",indianred:"indian red",indigo:"indigo",ivory:"ivory",khaki:"khaki",lavender:"lavender",lavenderblush:"lavender blush",lawngreen:"lawn green",lemonchiffon:"lemon chiffon",lightblue:"light blue",lightcoral:"light coral",
|
||||
lightcyan:"light cyan",lightgoldenrodyellow:"light goldenrod yellow",lightgray:"light gray",lightgreen:"light green",lightgrey:"light gray",lightpink:"light pink",lightsalmon:"light salmon",lightseagreen:"light sea green",lightskyblue:"light sky blue",lightslategray:"light slate gray",lightslategrey:"light slate gray",lightsteelblue:"light steel blue",lightyellow:"light yellow",lime:"lime",limegreen:"lime green",linen:"linen",magenta:"magenta",maroon:"maroon",mediumaquamarine:"medium aquamarine",
|
||||
mediumblue:"medium blue",mediumorchid:"medium orchid",mediumpurple:"medium purple",mediumseagreen:"medium sea green",mediumslateblue:"medium slate blue",mediumspringgreen:"medium spring green",mediumturquoise:"medium turquoise",mediumvioletred:"medium violet-red",midnightblue:"midnight blue",mintcream:"mint cream",mistyrose:"misty rose",moccasin:"moccasin",navajowhite:"navajo white",navy:"navy",oldlace:"old lace",olive:"olive",olivedrab:"olive drab",orange:"orange",orangered:"orange red",orchid:"orchid",
|
||||
palegoldenrod:"pale goldenrod",palegreen:"pale green",paleturquoise:"pale turquoise",palevioletred:"pale violet-red",papayawhip:"papaya whip",peachpuff:"peach puff",peru:"peru",pink:"pink",plum:"plum",powderblue:"powder blue",purple:"purple",red:"red",rosybrown:"rosy brown",royalblue:"royal blue",saddlebrown:"saddle brown",salmon:"salmon",sandybrown:"sandy brown",seagreen:"sea green",seashell:"seashell",sienna:"sienna",silver:"silver",skyblue:"sky blue",slateblue:"slate blue",slategray:"slate gray",
|
||||
slategrey:"slate gray",snow:"snow",springgreen:"spring green",steelblue:"steel blue",tan:"tan",teal:"teal",thistle:"thistle",tomato:"tomato",transparent:"transparent",turquoise:"turquoise",violet:"violet",wheat:"wheat",white:"white",whitesmoke:"white smoke",yellow:"yellow",yellowgreen:"yellow green"},bs:!0,mk:!0,sr:!0,zh:!0,"zh-tw":!0,uk:!0,tr:!0,th:!0,sv:!0,sl:!0,sk:!0,ru:!0,ro:!0,pt:!0,"pt-pt":!0,pl:!0,nl:!0,nb:!0,ko:!0,kk:!0,ja:!0,it:!0,id:!0,hu:!0,hr:!0,he:!0,fr:!0,fi:!0,eu:!0,es:!0,el:!0,de:!0,
|
||||
da:!0,cs:!0,ca:!0,bg:!0,az:!0,ar:!0});
|
||||
//# sourceMappingURL=colors.js.map
|
||||
27
Server/www/spiderbasic/dojo/nls/dojo_ar.js
Normal file
@ -0,0 +1,27 @@
|
||||
//>>built
|
||||
define("dojo/nls/dojo_ar",{"dijit/form/nls/validate":{invalidMessage:"\u0627\u0644\u0642\u064a\u0645\u0629 \u0627\u0644\u062a\u064a \u062a\u0645 \u0627\u062f\u062e\u0627\u0644\u0647\u0627 \u063a\u064a\u0631 \u0635\u062d\u064a\u062d\u0629.",rangeMessage:"\u0647\u0630\u0647 \u0627\u0644\u0642\u064a\u0645\u0629 \u0644\u064a\u0633 \u0628\u0627\u0644\u0645\u062f\u0649 \u0627\u0644\u0635\u062d\u064a\u062d.",_localized:{},missingMessage:"\u064a\u062c\u0628 \u0627\u062f\u062e\u0627\u0644 \u0647\u0630\u0647 \u0627\u0644\u0642\u064a\u0645\u0629."},
|
||||
"dojo/cldr/nls/gregorian":{"dateFormatItem-Ehm":"E h:mm a","days-standAlone-short":"\u0627\u0644\u0623\u062d\u062f \u0627\u0644\u0627\u062b\u0646\u064a\u0646 \u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 \u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 \u0627\u0644\u062e\u0645\u064a\u0633 \u0627\u0644\u062c\u0645\u0639\u0629 \u0627\u0644\u0633\u0628\u062a".split(" "),"months-format-narrow":"\u064a\u0641\u0645\u0623\u0648\u0646\u0644\u063a\u0633\u0643\u0628\u062f".split(""),"field-second-relative+0":"\u0627\u0644\u0622\u0646",
|
||||
"quarters-standAlone-narrow":["\u0661","\u0662","\u0663","\u0664"],"field-weekday":"\u0627\u0644\u064a\u0648\u0645","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"E\u060c d/M/y","field-wed-relative+0":"\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 \u0627\u0644\u062d\u0627\u0644\u064a","field-wed-relative+1":"\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 \u0627\u0644\u062a\u0627\u0644\u064a","dateFormatItem-GyMMMEd":"E\u060c d MMM\u060c y G","dateFormatItem-MMMEd":"E\u060c d MMM",eraNarrow:["\u0642.\u0645",
|
||||
"\u0645"],"dateFormatItem-yMM":"MM/y","field-tue-relative+-1":"\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 \u0627\u0644\u0645\u0627\u0636\u064a","days-format-short":"\u0627\u0644\u0623\u062d\u062f \u0627\u0644\u0627\u062b\u0646\u064a\u0646 \u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 \u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 \u0627\u0644\u062e\u0645\u064a\u0633 \u0627\u0644\u062c\u0645\u0639\u0629 \u0627\u0644\u0633\u0628\u062a".split(" "),"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}",
|
||||
"dateFormat-long":"d MMMM\u060c y","field-fri-relative+-1":"\u0627\u0644\u062c\u0645\u0639\u0629 \u0627\u0644\u0645\u0627\u0636\u064a\u0629","field-wed-relative+-1":"\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 \u0627\u0644\u0645\u0627\u0636\u064a","months-format-wide":"\u064a\u0646\u0627\u064a\u0631 \u0641\u0628\u0631\u0627\u064a\u0631 \u0645\u0627\u0631\u0633 \u0623\u0628\u0631\u064a\u0644 \u0645\u0627\u064a\u0648 \u064a\u0648\u0646\u064a\u0648 \u064a\u0648\u0644\u064a\u0648 \u0623\u063a\u0633\u0637\u0633 \u0633\u0628\u062a\u0645\u0628\u0631 \u0623\u0643\u062a\u0648\u0628\u0631 \u0646\u0648\u0641\u0645\u0628\u0631 \u062f\u064a\u0633\u0645\u0628\u0631".split(" "),
|
||||
"dateTimeFormat-medium":"{1} {0}","dayPeriods-format-wide-pm":"\u0645","dateFormat-full":"EEEE\u060c d MMMM\u060c y","field-thu-relative+-1":"\u0627\u0644\u062e\u0645\u064a\u0633 \u0627\u0644\u0645\u0627\u0636\u064a","dateFormatItem-Md":"d/M",_localized:{},"dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dayPeriods-format-wide-noon":"noon","dateFormatItem-yMd":"d/M/y","field-era":"\u0627\u0644\u0639\u0635\u0631","dateFormatItem-yM":"M/y","months-standAlone-wide":"\u064a\u0646\u0627\u064a\u0631 \u0641\u0628\u0631\u0627\u064a\u0631 \u0645\u0627\u0631\u0633 \u0623\u0628\u0631\u064a\u0644 \u0645\u0627\u064a\u0648 \u064a\u0648\u0646\u064a\u0648 \u064a\u0648\u0644\u064a\u0648 \u0623\u063a\u0633\u0637\u0633 \u0633\u0628\u062a\u0645\u0628\u0631 \u0623\u0643\u062a\u0648\u0628\u0631 \u0646\u0648\u0641\u0645\u0628\u0631 \u062f\u064a\u0633\u0645\u0628\u0631".split(" "),
|
||||
"timeFormat-short":"h:mm a","quarters-format-wide":["\u0627\u0644\u0631\u0628\u0639 \u0627\u0644\u0623\u0648\u0644","\u0627\u0644\u0631\u0628\u0639 \u0627\u0644\u062b\u0627\u0646\u064a","\u0627\u0644\u0631\u0628\u0639 \u0627\u0644\u062b\u0627\u0644\u062b","\u0627\u0644\u0631\u0628\u0639 \u0627\u0644\u0631\u0627\u0628\u0639"],"dateFormatItem-yQQQQ":"QQQQ y","timeFormat-long":"h:mm:ss a z","field-year":"\u0627\u0644\u0633\u0646\u0629","dateFormatItem-yMMM":"MMM y","dateTimeFormats-appendItem-Era":"{1} {0}",
|
||||
"field-hour":"\u0627\u0644\u0633\u0627\u0639\u0627\u062a","dateFormatItem-MMdd":"dd/MM","months-format-abbr":"\u064a\u0646\u0627\u064a\u0631 \u0641\u0628\u0631\u0627\u064a\u0631 \u0645\u0627\u0631\u0633 \u0623\u0628\u0631\u064a\u0644 \u0645\u0627\u064a\u0648 \u064a\u0648\u0646\u064a\u0648 \u064a\u0648\u0644\u064a\u0648 \u0623\u063a\u0633\u0637\u0633 \u0633\u0628\u062a\u0645\u0628\u0631 \u0623\u0643\u062a\u0648\u0628\u0631 \u0646\u0648\u0641\u0645\u0628\u0631 \u062f\u064a\u0633\u0645\u0628\u0631".split(" "),
|
||||
"field-sat-relative+0":"\u0627\u0644\u0633\u0628\u062a \u0627\u0644\u062d\u0627\u0644\u064a","field-sat-relative+1":"\u0627\u0644\u0633\u0628\u062a \u0627\u0644\u062a\u0627\u0644\u064a","timeFormat-full":"h:mm:ss a zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-day-relative+0":"\u0627\u0644\u064a\u0648\u0645","field-thu-relative+0":"\u0627\u0644\u062e\u0645\u064a\u0633 \u0627\u0644\u062d\u0627\u0644\u064a","field-day-relative+1":"\u063a\u062f\u064b\u0627","field-thu-relative+1":"\u0627\u0644\u062e\u0645\u064a\u0633 \u0627\u0644\u062a\u0627\u0644\u064a",
|
||||
"dateFormatItem-GyMMMd":"d MMM\u060c y G","field-day-relative+2":"\u0628\u0639\u062f \u0627\u0644\u063a\u062f","dateFormatItem-H":"HH","months-standAlone-abbr":"\u064a\u0646\u0627\u064a\u0631 \u0641\u0628\u0631\u0627\u064a\u0631 \u0645\u0627\u0631\u0633 \u0623\u0628\u0631\u064a\u0644 \u0645\u0627\u064a\u0648 \u064a\u0648\u0646\u064a\u0648 \u064a\u0648\u0644\u064a\u0648 \u0623\u063a\u0633\u0637\u0633 \u0633\u0628\u062a\u0645\u0628\u0631 \u0623\u0643\u062a\u0648\u0628\u0631 \u0646\u0648\u0641\u0645\u0628\u0631 \u062f\u064a\u0633\u0645\u0628\u0631".split(" "),
|
||||
"quarters-format-abbr":["\u0627\u0644\u0631\u0628\u0639 \u0627\u0644\u0623\u0648\u0644","\u0627\u0644\u0631\u0628\u0639 \u0627\u0644\u062b\u0627\u0646\u064a","\u0627\u0644\u0631\u0628\u0639 \u0627\u0644\u062b\u0627\u0644\u062b","\u0627\u0644\u0631\u0628\u0639 \u0627\u0644\u0631\u0627\u0628\u0639"],"quarters-standAlone-wide":["\u0627\u0644\u0631\u0628\u0639 \u0627\u0644\u0623\u0648\u0644","\u0627\u0644\u0631\u0628\u0639 \u0627\u0644\u062b\u0627\u0646\u064a","\u0627\u0644\u0631\u0628\u0639 \u0627\u0644\u062b\u0627\u0644\u062b",
|
||||
"\u0627\u0644\u0631\u0628\u0639 \u0627\u0644\u0631\u0627\u0628\u0639"],"dateFormatItem-Gy":"y G","dateFormatItem-M":"L","days-standAlone-wide":"\u0627\u0644\u0623\u062d\u062f \u0627\u0644\u0627\u062b\u0646\u064a\u0646 \u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 \u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 \u0627\u0644\u062e\u0645\u064a\u0633 \u0627\u0644\u062c\u0645\u0639\u0629 \u0627\u0644\u0633\u0628\u062a".split(" "),"dateFormatItem-MMMMd":"d MMMM","dayPeriods-format-abbr-noon":"noon",
|
||||
"timeFormat-medium":"h:mm:ss a","field-sun-relative+0":"\u0627\u0644\u0623\u062d\u062f \u0627\u0644\u062d\u0627\u0644\u064a","dateFormatItem-Hm":"HH:mm","field-sun-relative+1":"\u0627\u0644\u0623\u062d\u062f \u0627\u0644\u062a\u0627\u0644\u064a","quarters-standAlone-abbr":["\u0627\u0644\u0631\u0628\u0639 \u0627\u0644\u0623\u0648\u0644","\u0627\u0644\u0631\u0628\u0639 \u0627\u0644\u062b\u0627\u0646\u064a","\u0627\u0644\u0631\u0628\u0639 \u0627\u0644\u062b\u0627\u0644\u062b","\u0627\u0644\u0631\u0628\u0639 \u0627\u0644\u0631\u0627\u0628\u0639"],
|
||||
eraAbbr:["\u0642.\u0645","\u0645"],"field-minute":"\u0627\u0644\u062f\u0642\u0627\u0626\u0642","field-dayperiod":"\u0635/\u0645","days-standAlone-abbr":"\u0627\u0644\u0623\u062d\u062f \u0627\u0644\u0627\u062b\u0646\u064a\u0646 \u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 \u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 \u0627\u0644\u062e\u0645\u064a\u0633 \u0627\u0644\u062c\u0645\u0639\u0629 \u0627\u0644\u0633\u0628\u062a".split(" "),"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["\u0661",
|
||||
"\u0662","\u0663","\u0664"],"field-day-relative+-1":"\u0623\u0645\u0633","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"a","dateFormatItem-h":"h a","field-day-relative+-2":"\u0623\u0648\u0644 \u0623\u0645\u0633","dateFormatItem-MMMd":"d MMM","dateFormatItem-MEd":"E\u060c d/M","dateTimeFormat-full":"{1} {0}","field-fri-relative+0":"\u0627\u0644\u062c\u0645\u0639\u0629 \u0627\u0644\u062d\u0627\u0644\u064a\u0629","field-fri-relative+1":"\u0627\u0644\u062c\u0645\u0639\u0629 \u0627\u0644\u062a\u0627\u0644\u064a\u0629",
|
||||
"dateFormatItem-yMMMM":"MMMM y","field-day":"\u064a\u0648\u0645","days-format-wide":"\u0627\u0644\u0623\u062d\u062f \u0627\u0644\u0627\u062b\u0646\u064a\u0646 \u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 \u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 \u0627\u0644\u062e\u0645\u064a\u0633 \u0627\u0644\u062c\u0645\u0639\u0629 \u0627\u0644\u0633\u0628\u062a".split(" "),"field-zone":"\u0627\u0644\u062a\u0648\u0642\u064a\u062a","months-standAlone-narrow":"\u064a\u0641\u0645\u0623\u0648\u0646\u0644\u063a\u0633\u0643\u0628\u062f".split(""),
|
||||
"dateFormatItem-y":"y","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-year-relative+-1":"\u0627\u0644\u0633\u0646\u0629 \u0627\u0644\u0645\u0627\u0636\u064a\u0629","field-month-relative+-1":"\u0627\u0644\u0634\u0647\u0631 \u0627\u0644\u0645\u0627\u0636\u064a","dateTimeFormats-appendItem-Year":"{1} {0}","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-abbr":"\u0627\u0644\u0623\u062d\u062f \u0627\u0644\u0627\u062b\u0646\u064a\u0646 \u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 \u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 \u0627\u0644\u062e\u0645\u064a\u0633 \u0627\u0644\u062c\u0645\u0639\u0629 \u0627\u0644\u0633\u0628\u062a".split(" "),
|
||||
eraNames:["\u0642\u0628\u0644 \u0627\u0644\u0645\u064a\u0644\u0627\u062f","\u0645\u064a\u0644\u0627\u062f\u064a"],"dateFormatItem-yMMMd":"d MMM\u060c y","days-format-narrow":"\u062d\u0646\u062b\u0631\u062e\u062c\u0633".split(""),"field-month":"\u0627\u0644\u0634\u0647\u0631","days-standAlone-narrow":"\u062d\u0646\u062b\u0631\u062e\u062c\u0633".split(""),"dateFormatItem-MMM":"LLL","field-tue-relative+0":"\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 \u0627\u0644\u062d\u0627\u0644\u064a","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})",
|
||||
"field-tue-relative+1":"\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 \u0627\u0644\u062a\u0627\u0644\u064a","dayPeriods-format-wide-am":"\u0635","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-MMMMEd":"E\u060c d MMMM","dateFormatItem-EHm":"E HH:mm","field-mon-relative+0":"\u0627\u0644\u0627\u062b\u0646\u064a\u0646 \u0627\u0644\u062d\u0627\u0644\u064a","field-mon-relative+1":"\u0627\u0644\u0627\u062b\u0646\u064a\u0646 \u0627\u0644\u062a\u0627\u0644\u064a",
|
||||
"dateFormat-short":"d/M/y","dateFormatItem-EHms":"E HH:mm:ss","dateFormatItem-Ehms":"E h:mm:ss a","dayPeriods-format-narrow-noon":"n","field-second":"\u0627\u0644\u062b\u0648\u0627\u0646\u064a","field-sat-relative+-1":"\u0627\u0644\u0633\u0628\u062a \u0627\u0644\u0645\u0627\u0636\u064a","dateFormatItem-yMMMEd":"E\u060c d MMM\u060c y","field-sun-relative+-1":"\u0627\u0644\u0623\u062d\u062f \u0627\u0644\u0645\u0627\u0636\u064a","field-month-relative+0":"\u0647\u0630\u0627 \u0627\u0644\u0634\u0647\u0631",
|
||||
"field-month-relative+1":"\u0627\u0644\u0634\u0647\u0631 \u0627\u0644\u062a\u0627\u0644\u064a","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormatItem-Ed":"E\u060c d","field-week":"\u0627\u0644\u0623\u0633\u0628\u0648\u0639","dateFormat-medium":"dd/MM/y","field-week-relative+-1":"\u0627\u0644\u0623\u0633\u0628\u0648\u0639 \u0627\u0644\u0645\u0627\u0636\u064a","field-year-relative+0":"\u0647\u0630\u0647 \u0627\u0644\u0633\u0646\u0629","field-year-relative+1":"\u0627\u0644\u0633\u0646\u0629 \u0627\u0644\u062a\u0627\u0644\u064a\u0629",
|
||||
"dayPeriods-format-narrow-pm":"p","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a","dateFormatItem-GyMMM":"MMM y G","field-mon-relative+-1":"\u0627\u0644\u0627\u062b\u0646\u064a\u0646 \u0627\u0644\u0645\u0627\u0636\u064a","field-week-relative+0":"\u0647\u0630\u0627 \u0627\u0644\u0623\u0633\u0628\u0648\u0639","field-week-relative+1":"\u0627\u0644\u0623\u0633\u0628\u0648\u0639 \u0627\u0644\u062a\u0627\u0644\u064a"},"dijit/nls/loading":{_localized:{},
|
||||
loadingState:"\u062c\u0627\u0631\u064a \u0627\u0644\u062a\u062d\u0645\u064a\u0644...",errorState:"\u0639\u0641\u0648\u0627\u060c \u062d\u062f\u062b \u062e\u0637\u0623"},"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},"decimalFormat-short":"000\u00a0\u062a\u0631\u0644\u064a\u0648","currencySpacing-afterCurrency-insertBetween":"\u00a0",
|
||||
nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"\u00a4#,##0.00;(\u00a4#,##0.00)","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:",",percentFormat:"#,##0%","decimalFormat-long":"000 \u062a\u0631\u064a\u0644\u064a\u0648\u0646",decimalFormat:"#,##0.###",decimal:".","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"\u0627\u0644\u0627\u062e\u062a\u064a\u0627\u0631\u0627\u062a \u0627\u0644\u0633\u0627\u0628\u0642\u0629",
|
||||
_localized:{},nextMessage:"\u0645\u0632\u064a\u062f \u0645\u0646 \u0627\u0644\u0627\u062e\u062a\u064a\u0627\u0631\u0627\u062a"},"dijit/nls/common":{buttonOk:"\u062d\u0633\u0646\u0627",buttonCancel:"\u0627\u0644\u063a\u0627\u0621",_localized:{},buttonSave:"\u062d\u0641\u0638",itemClose:"\u0627\u063a\u0644\u0627\u0642"}});
|
||||
//# sourceMappingURL=dojo_ar.js.map
|
||||
16
Server/www/spiderbasic/dojo/nls/dojo_ca.js
Normal file
@ -0,0 +1,16 @@
|
||||
//>>built
|
||||
define("dojo/nls/dojo_ca",{"dijit/form/nls/validate":{invalidMessage:"El valor introdu\u00eft no \u00e9s v\u00e0lid",rangeMessage:"Aquest valor \u00e9s fora de l'interval",_localized:{},missingMessage:"Aquest valor \u00e9s necessari"},"dojo/cldr/nls/gregorian":{"dateFormatItem-Ehm":"E h:mm a","days-standAlone-short":"dg. dl. dm. dc. dj. dv. ds.".split(" "),"months-format-narrow":"GN FB M\u00c7 AB MG JN JL AG ST OC NV DS".split(" "),"field-second-relative+0":"ara","quarters-standAlone-narrow":["1",
|
||||
"2","3","4"],"field-weekday":"dia de la setmana","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"E, d/M/y","field-wed-relative+0":"aquest dimecres","field-wed-relative+1":"dimecres que ve","dateFormatItem-GyMMMEd":"E, d MMM, y G","dateFormatItem-MMMEd":"E d MMM",eraNarrow:["aC","dC"],"field-tue-relative+-1":"dimarts passat","days-format-short":"dg. dl. dt. dc. dj. dv. ds.".split(" "),"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"d MMMM 'de' y","field-fri-relative+-1":"divendres passat",
|
||||
"field-wed-relative+-1":"dimecres passat","months-format-wide":"gener febrer mar\u00e7 abril maig juny juliol agost setembre octubre novembre desembre".split(" "),"dateTimeFormat-medium":"{1} {0}","dayPeriods-format-wide-pm":"p. m.","dateFormat-full":"EEEE, d MMMM 'de' y","field-thu-relative+-1":"dijous passat","dateFormatItem-Md":"d/M","dateFormatItem-GyMMMM":"LLLL 'de' y G",_localized:{},"dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dayPeriods-format-wide-noon":"noon",
|
||||
"dateFormatItem-yMd":"d/M/y","field-era":"era","dateFormatItem-yM":"M/y","months-standAlone-wide":"gener febrer mar\u00e7 abril maig juny juliol agost setembre octubre novembre desembre".split(" "),"timeFormat-short":"H:mm","quarters-format-wide":["1r trimestre","2n trimestre","3r trimestre","4t trimestre"],"dateFormatItem-yQQQQ":"QQQQ y","timeFormat-long":"H:mm:ss z","field-year":"any","dateFormatItem-yMMM":"LLL y","dateTimeFormats-appendItem-Era":"{1} {0}","field-hour":"hora","months-format-abbr":"gen. feb. mar\u00e7 abr. maig juny jul. ag. set. oct. nov. des.".split(" "),
|
||||
"field-sat-relative+0":"aquest dissabte","field-sat-relative+1":"dissabte que ve","timeFormat-full":"H:mm:ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-day-relative+0":"avui","field-thu-relative+0":"aquest dijous","field-day-relative+1":"dem\u00e0","field-thu-relative+1":"dijous que ve","dateFormatItem-GyMMMd":"d MMM y G","field-day-relative+2":"dem\u00e0 passat","dateFormatItem-H":"H","months-standAlone-abbr":"gen. feb. mar\u00e7 abr. maig juny jul. ag. set. oct. nov. des.".split(" "),
|
||||
"quarters-format-abbr":["1T","2T","3T","4T"],"quarters-standAlone-wide":["1r trimestre","2n trimestre","3r trimestre","4t trimestre"],"dateFormatItem-Gy":"y G","dateFormatItem-M":"L","days-standAlone-wide":"diumenge dilluns dimarts dimecres dijous divendres dissabte".split(" "),"dateFormatItem-MMMMd":"d MMMM","dayPeriods-format-abbr-noon":"noon","timeFormat-medium":"H:mm:ss","field-sun-relative+0":"aquest diumenge","dateFormatItem-Hm":"HH:mm","field-sun-relative+1":"diumenge que ve","quarters-standAlone-abbr":["1T",
|
||||
"2T","3T","4T"],eraAbbr:["aC","dC"],"field-minute":"minut","field-dayperiod":"a. m./p. m.","days-standAlone-abbr":"dg. dl. dt. dc. dj. dv. ds.".split(" "),"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"field-day-relative+-1":"ahir","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"a.m.","dateFormatItem-h":"h a","field-day-relative+-2":"abans-d'ahir","dateFormatItem-MMMd":"d MMM","dateFormatItem-MEd":"E d/M","dateTimeFormat-full":"{1} {0}",
|
||||
"field-fri-relative+0":"aquest divendres","field-fri-relative+1":"divendres que ve","dateFormatItem-yMMMM":"LLLL 'de' y","field-day":"dia","days-format-wide":"diumenge dilluns dimarts dimecres dijous divendres dissabte".split(" "),"field-zone":"zona","months-standAlone-narrow":"GN FB M\u00c7 AB MG JN JL AG ST OC NV DS".split(" "),"dateFormatItem-y":"y","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-year-relative+-1":"l'any passat","field-month-relative+-1":"el mes passat","dateTimeFormats-appendItem-Year":"{1} {0}",
|
||||
"dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-abbr":"dg. dl. dt. dc. dj. dv. ds.".split(" "),eraNames:["abans de Crist","a. de la n. e.","despr\u00e9s de Crist","de la n. e."],"dateFormatItem-yMMMd":"d MMM y","days-format-narrow":"dg dl dt dc dj dv ds".split(" "),"field-month":"mes","days-standAlone-narrow":"dg dl dt dc dj dv ds".split(" "),"dateFormatItem-MMM":"LLL","field-tue-relative+0":"aquest dimarts","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})",
|
||||
"field-tue-relative+1":"dimarts que ve","dayPeriods-format-wide-am":"a. m.","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-MMMMEd":"E d MMMM","dateFormatItem-EHm":"E H:mm","field-mon-relative+0":"aquest dilluns","field-mon-relative+1":"dilluns que ve","dateFormat-short":"d/M/yy","dateFormatItem-EHms":"E H:mm:ss","dateFormatItem-Ehms":"E h:mm:ss a","dayPeriods-format-narrow-noon":"n","field-second":"segon","field-sat-relative+-1":"dissabte passat",
|
||||
"dateFormatItem-yMMMEd":"E, d MMM, y","field-sun-relative+-1":"diumenge passat","field-month-relative+0":"aquest mes","field-month-relative+1":"el mes que ve","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormatItem-Ed":"E d","field-week":"setmana","dateFormat-medium":"dd/MM/y","field-week-relative+-1":"la setmana passada","field-year-relative+0":"enguany","field-year-relative+1":"l'any que ve","dayPeriods-format-narrow-pm":"p.m.","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH:mm:ss",
|
||||
"dateFormatItem-hms":"h:mm:ss a","dateFormatItem-GyMMM":"LLL y G","field-mon-relative+-1":"dilluns passat","field-week-relative+0":"aquesta setmana","field-week-relative+1":"la setmana que ve"},"dijit/nls/loading":{_localized:{},loadingState:"S'est\u00e0 carregant...",errorState:"Ens sap greu. S'ha produ\u00eft un error."},"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",
|
||||
minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},"decimalFormat-short":"000\u00a0B","currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"#,##0.00\u00a0\u00a4;(#,##0.00\u00a0\u00a4)","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:".",percentFormat:"#,##0%","decimalFormat-long":"000 bilions",decimalFormat:"#,##0.###",decimal:",",
|
||||
"currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"Opcions anteriors",_localized:{},nextMessage:"M\u00e9s opcions"},"dijit/nls/common":{buttonOk:"D'acord",buttonCancel:"Cancel\u00b7la",_localized:{},buttonSave:"Desa",itemClose:"Tanca"}});
|
||||
//# sourceMappingURL=dojo_ca.js.map
|
||||
18
Server/www/spiderbasic/dojo/nls/dojo_cs.js
Normal file
@ -0,0 +1,18 @@
|
||||
//>>built
|
||||
define("dojo/nls/dojo_cs",{"dijit/form/nls/validate":{invalidMessage:"Zadan\u00e1 hodnota nen\u00ed platn\u00e1.",rangeMessage:"Tato hodnota je mimo rozsah.",_localized:{},missingMessage:"Tato hodnota je vy\u017eadov\u00e1na."},"dojo/cldr/nls/gregorian":{"dateFormatItem-Ehm":"E h:mm a","days-standAlone-short":"ne po \u00fat st \u010dt p\u00e1 so".split(" "),"months-format-narrow":"1 2 3 4 5 6 7 8 9 10 11 12".split(" "),"field-second-relative+0":"nyn\u00ed","quarters-standAlone-narrow":["1","2","3",
|
||||
"4"],"field-weekday":"Den v t\u00fddnu","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"E d. M. y","field-wed-relative+0":"tuto st\u0159edu","field-wed-relative+1":"p\u0159\u00ed\u0161t\u00ed st\u0159edu","dateFormatItem-GyMMMEd":"E d. M. y G","dateFormatItem-MMMEd":"E d. M.",eraNarrow:["p\u0159.n.l.","n.l."],"field-tue-relative+-1":"minul\u00e9 \u00fater\u00fd","days-format-short":"ne po \u00fat st \u010dt p\u00e1 so".split(" "),"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"d. MMMM y",
|
||||
"field-fri-relative+-1":"minul\u00fd p\u00e1tek","field-wed-relative+-1":"minulou st\u0159edu","months-format-wide":"ledna \u00fanora b\u0159ezna dubna kv\u011btna \u010dervna \u010dervence srpna z\u00e1\u0159\u00ed \u0159\u00edjna listopadu prosince".split(" "),"dateTimeFormat-medium":"{1} {0}","dateFormatItem-yMMMMd":"d. MMMM y","dayPeriods-format-wide-pm":"PM","dateFormat-full":"EEEE d. MMMM y","field-thu-relative+-1":"minul\u00fd \u010dtvrtek","dateFormatItem-Md":"d. M.",_localized:{},"dayPeriods-format-abbr-am":"AM",
|
||||
"dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dayPeriods-format-wide-noon":"noon","dateFormatItem-yMd":"d. M. y","field-era":"Letopo\u010det","dateFormatItem-yM":"M/y","months-standAlone-wide":"leden \u00fanor b\u0159ezen duben kv\u011bten \u010derven \u010dervenec srpen z\u00e1\u0159\u00ed \u0159\u00edjen listopad prosinec".split(" "),"timeFormat-short":"H:mm","quarters-format-wide":["1. \u010dtvrtlet\u00ed","2. \u010dtvrtlet\u00ed","3. \u010dtvrtlet\u00ed","4. \u010dtvrtlet\u00ed"],"dateFormatItem-yQQQQ":"QQQQ y",
|
||||
"timeFormat-long":"H:mm:ss z","field-year":"Rok","dateFormatItem-yMMM":"LLLL y","dateTimeFormats-appendItem-Era":"{1} {0}","field-hour":"Hodina","months-format-abbr":"led \u00fano b\u0159e dub kv\u011b \u010dvn \u010dvc srp z\u00e1\u0159 \u0159\u00edj lis pro".split(" "),"field-sat-relative+0":"tuto sobotu","field-sat-relative+1":"p\u0159\u00ed\u0161t\u00ed sobotu","timeFormat-full":"H:mm:ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-day-relative+0":"dnes","field-thu-relative+0":"tento \u010dtvrtek",
|
||||
"field-day-relative+1":"z\u00edtra","field-thu-relative+1":"p\u0159\u00ed\u0161t\u00ed \u010dtvrtek","dateFormatItem-GyMMMd":"d. M. y G","field-day-relative+2":"poz\u00edt\u0159\u00ed","dateFormatItem-H":"H","months-standAlone-abbr":"led \u00fano b\u0159e dub kv\u011b \u010dvn \u010dvc srp z\u00e1\u0159 \u0159\u00edj lis pro".split(" "),"quarters-format-abbr":["Q1","Q2","Q3","Q4"],"quarters-standAlone-wide":["1. \u010dtvrtlet\u00ed","2. \u010dtvrtlet\u00ed","3. \u010dtvrtlet\u00ed","4. \u010dtvrtlet\u00ed"],
|
||||
"dateFormatItem-Gy":"y G","dateFormatItem-M":"L","days-standAlone-wide":"ned\u011ble pond\u011bl\u00ed \u00fater\u00fd st\u0159eda \u010dtvrtek p\u00e1tek sobota".split(" "),"dateFormatItem-MMMMd":"d. MMMM","dateFormatItem-GyMMMMd":"d. MMMM y G","dayPeriods-format-abbr-noon":"noon","timeFormat-medium":"H:mm:ss","field-sun-relative+0":"tuto ned\u011bli","dateFormatItem-Hm":"H:mm","field-sun-relative+1":"p\u0159\u00ed\u0161t\u00ed ned\u011bli","quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],eraAbbr:["p\u0159. n. l.",
|
||||
"n. l."],"field-minute":"Minuta","field-dayperiod":"AM/PM","days-standAlone-abbr":"ne po \u00fat st \u010dt p\u00e1 so".split(" "),"dateFormatItem-d":"d.","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"field-day-relative+-1":"v\u010dera","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateFormatItem-h":"h a","field-day-relative+-2":"p\u0159edev\u010d\u00edrem","dateFormatItem-MMMd":"d. M.","dateFormatItem-MEd":"E d. M.","dateTimeFormat-full":"{1} {0}",
|
||||
"field-fri-relative+0":"tento p\u00e1tek","field-fri-relative+1":"p\u0159\u00ed\u0161t\u00ed p\u00e1tek","dateFormatItem-yMMMM":"LLLL y","field-day":"Den","days-format-wide":"ned\u011ble pond\u011bl\u00ed \u00fater\u00fd st\u0159eda \u010dtvrtek p\u00e1tek sobota".split(" "),"field-zone":"\u010casov\u00e9 p\u00e1smo","months-standAlone-narrow":"l\u00fabdk\u010d\u010dsz\u0159lp".split(""),"dateFormatItem-y":"y","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-year-relative+-1":"minul\u00fd rok",
|
||||
"field-month-relative+-1":"minul\u00fd m\u011bs\u00edc","dateTimeFormats-appendItem-Year":"{1} {0}","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-abbr":"ne po \u00fat st \u010dt p\u00e1 so".split(" "),eraNames:["p\u0159. n. l.","n. l."],"dateFormatItem-yMMMd":"d. M. y","days-format-narrow":"NP\u00daS\u010cPS".split(""),"field-month":"M\u011bs\u00edc","days-standAlone-narrow":"NP\u00daS\u010cPS".split(""),"dateFormatItem-MMM":"LLL",
|
||||
"field-tue-relative+0":"toto \u00fater\u00fd","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","field-tue-relative+1":"p\u0159\u00ed\u0161t\u00ed \u00fater\u00fd","dayPeriods-format-wide-am":"AM","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-MMMMEd":"E d. MMMM","dateFormatItem-EHm":"E H:mm","field-mon-relative+0":"toto pond\u011bl\u00ed","field-mon-relative+1":"p\u0159\u00ed\u0161t\u00ed pond\u011bl\u00ed","dateFormat-short":"dd.MM.yy",
|
||||
"dateFormatItem-EHms":"E H:mm:ss","dateFormatItem-yMMMMEd":"E d. MMMM y","dateFormatItem-Ehms":"E h:mm:ss a","dayPeriods-format-narrow-noon":"n","field-second":"Sekunda","field-sat-relative+-1":"minulou sobotu","dateFormatItem-yMMMEd":"E d. M. y","field-sun-relative+-1":"minulou ned\u011bli","field-month-relative+0":"tento m\u011bs\u00edc","field-month-relative+1":"p\u0159\u00ed\u0161t\u00ed m\u011bs\u00edc","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormatItem-Ed":"E d.","field-week":"T\u00fdden",
|
||||
"dateFormat-medium":"d. M. y","field-week-relative+-1":"minul\u00fd t\u00fdden","field-year-relative+0":"tento rok","field-year-relative+1":"p\u0159\u00ed\u0161t\u00ed rok","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"H:mm:ss","dateFormatItem-hms":"h:mm:ss a","dateFormatItem-GyMMM":"LLLL y G","field-mon-relative+-1":"minul\u00e9 pond\u011bl\u00ed","dateFormatItem-GyMMMMEd":"E d. MMMM y G","field-week-relative+0":"tento t\u00fdden","field-week-relative+1":"p\u0159\u00ed\u0161t\u00ed t\u00fdden"},
|
||||
"dijit/nls/loading":{_localized:{},loadingState:"Prob\u00edh\u00e1 na\u010d\u00edt\u00e1n\u00ed...",errorState:"Omlouv\u00e1me se, do\u0161lo k chyb\u011b"},"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},"decimalFormat-short":"000\u00a0bil'.'","currencySpacing-afterCurrency-insertBetween":"\u00a0",
|
||||
nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"#,##0.00\u00a0\u00a4","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:"\u00a0",percentFormat:"#,##0\u00a0%","decimalFormat-long":"000 bilion\u016f",decimalFormat:"#,##0.###",decimal:",","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"P\u0159edchoz\u00ed volby",_localized:{},nextMessage:"Dal\u0161\u00ed volby"},
|
||||
"dijit/nls/common":{buttonOk:"OK",buttonCancel:"Storno",_localized:{},buttonSave:"Ulo\u017eit",itemClose:"Zav\u0159\u00edt"}});
|
||||
//# sourceMappingURL=dojo_cs.js.map
|
||||
16
Server/www/spiderbasic/dojo/nls/dojo_da.js
Normal file
@ -0,0 +1,16 @@
|
||||
//>>built
|
||||
define("dojo/nls/dojo_da",{"dijit/form/nls/validate":{invalidMessage:"Den angivne v\u00e6rdi er ugyldig.",rangeMessage:"V\u00e6rdien er uden for intervallet.",_localized:{},missingMessage:"V\u00e6rdien er p\u00e5kr\u00e6vet."},"dojo/cldr/nls/gregorian":{"dateFormatItem-Ehm":"E h.mm a","days-standAlone-short":"s\u00f8 ma ti on to fr l\u00f8".split(" "),"months-format-narrow":"JFMAMJJASOND".split(""),"field-second-relative+0":"nu","quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"Ugedag",
|
||||
"dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"E d/M/y","field-wed-relative+0":"denne onsdag","field-wed-relative+1":"n\u00e6ste onsdag","dateFormatItem-GyMMMEd":"E d. MMM y G","dateFormatItem-MMMEd":"E d. MMM",eraNarrow:["fKr","fvt","eKr","vt"],"dateFormatItem-yMM":"MM/y","field-tue-relative+-1":"sidste tirsdag","days-format-short":"s\u00f8 ma ti on to fr l\u00f8".split(" "),"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"d. MMM y","field-fri-relative+-1":"sidste fredag",
|
||||
"field-wed-relative+-1":"sidste onsdag","months-format-wide":"januar februar marts april maj juni juli august september oktober november december".split(" "),"dateTimeFormat-medium":"{1} {0}","dayPeriods-format-wide-pm":"PM","dateFormat-full":"EEEE 'den' d. MMMM y","field-thu-relative+-1":"sidste torsdag","dateFormatItem-Md":"d/M",_localized:{},"dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dayPeriods-format-wide-noon":"middag","dateFormatItem-yMd":"d/M/y",
|
||||
"field-era":"\u00c6ra","dateFormatItem-yM":"M/y","months-standAlone-wide":"januar februar marts april maj juni juli august september oktober november december".split(" "),"timeFormat-short":"HH.mm","quarters-format-wide":["1. kvartal","2. kvartal","3. kvartal","4. kvartal"],"dateFormatItem-yQQQQ":"QQQQ y","timeFormat-long":"HH.mm.ss z","field-year":"\u00c5r","dateFormatItem-yMMM":"MMM y","dateTimeFormats-appendItem-Era":"{1} {0}","field-hour":"Time","dateFormatItem-MMdd":"dd/MM","months-format-abbr":"jan. feb. mar. apr. maj jun. jul. aug. sep. okt. nov. dec.".split(" "),
|
||||
"field-sat-relative+0":"denne l\u00f8rdag","field-sat-relative+1":"n\u00e6ste l\u00f8rdag","timeFormat-full":"HH.mm.ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-day-relative+0":"i dag","field-thu-relative+0":"denne torsdag","field-day-relative+1":"i morgen","field-thu-relative+1":"n\u00e6ste torsdag","dateFormatItem-GyMMMd":"d. MMM y G","field-day-relative+2":"i overmorgen","dateFormatItem-H":"HH","months-standAlone-abbr":"jan feb mar apr maj jun jul aug sep okt nov dec".split(" "),
|
||||
"quarters-format-abbr":["K1","K2","K3","K4"],"quarters-standAlone-wide":["1. kvartal","2. kvartal","3. kvartal","4. kvartal"],"dateFormatItem-Gy":"y G","dateFormatItem-M":"M","days-standAlone-wide":"s\u00f8ndag mandag tirsdag onsdag torsdag fredag l\u00f8rdag".split(" "),"dayPeriods-format-abbr-noon":"middag","timeFormat-medium":"HH.mm.ss","field-sun-relative+0":"denne s\u00f8ndag","dateFormatItem-Hm":"HH.mm","field-sun-relative+1":"n\u00e6ste s\u00f8ndag","quarters-standAlone-abbr":["K1","K2","K3",
|
||||
"K4"],eraAbbr:["f.Kr.","e.Kr."],"field-minute":"Minut","field-dayperiod":"AM/PM","days-standAlone-abbr":"s\u00f8n man tir ons tor fre l\u00f8r".split(" "),"dateFormatItem-d":"d.","dateFormatItem-ms":"mm.ss","quarters-format-narrow":["1","2","3","4"],"field-day-relative+-1":"i g\u00e5r","dateTimeFormat-long":"{1} 'kl.' {0}","dayPeriods-format-narrow-am":"a","dateFormatItem-h":"h a","field-day-relative+-2":"i forg\u00e5rs","dateFormatItem-MMMd":"d. MMM","dateFormatItem-MEd":"E d/M","dateTimeFormat-full":"{1} 'kl.' {0}",
|
||||
"field-fri-relative+0":"denne fredag","field-fri-relative+1":"n\u00e6ste fredag","field-day":"Dag","days-format-wide":"s\u00f8ndag mandag tirsdag onsdag torsdag fredag l\u00f8rdag".split(" "),"field-zone":"Tidszone","months-standAlone-narrow":"JFMAMJJASOND".split(""),"dateFormatItem-y":"y","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-year-relative+-1":"sidste \u00e5r","field-month-relative+-1":"sidste m\u00e5ned","dateTimeFormats-appendItem-Year":"{1} {0}","dateFormatItem-hm":"h.mm a",
|
||||
"dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-abbr":"s\u00f8n. man. tir. ons. tor. fre. l\u00f8r.".split(" "),eraNames:["f.Kr.","f\u00f8r vesterlandsk tidsregning","e.Kr.","vesterlandsk tidsregning"],"dateFormatItem-yMMMd":"d. MMM y","days-format-narrow":"SMTOTFL".split(""),"field-month":"M\u00e5ned","days-standAlone-narrow":"SMTOTFL".split(""),"dateFormatItem-MMM":"MMM","field-tue-relative+0":"denne tirsdag","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})",
|
||||
"field-tue-relative+1":"n\u00e6ste tirsdag","dayPeriods-format-wide-am":"AM","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-MMMMEd":"E d. MMMM","dateFormatItem-EHm":"E HH.mm","field-mon-relative+0":"denne mandag","field-mon-relative+1":"n\u00e6ste mandag","dateFormat-short":"dd/MM/yy","dateFormatItem-EHms":"E HH.mm.ss","dateFormatItem-Ehms":"E h.mm.ss a","dayPeriods-format-narrow-noon":"middag","field-second":"Sekund","field-sat-relative+-1":"sidste l\u00f8rdag",
|
||||
"dateFormatItem-yMMMEd":"E d. MMM y","field-sun-relative+-1":"sidste s\u00f8ndag","field-month-relative+0":"denne m\u00e5ned","field-month-relative+1":"n\u00e6ste m\u00e5ned","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormatItem-Ed":"E 'd'. d.","field-week":"Uge","dateFormat-medium":"dd/MM/y","field-week-relative+-1":"sidste uge","field-year-relative+0":"i \u00e5r","field-year-relative+1":"n\u00e6ste \u00e5r","dayPeriods-format-narrow-pm":"p","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH.mm.ss",
|
||||
"dateFormatItem-hms":"h.mm.ss a","dateFormatItem-GyMMM":"MMM y G","field-mon-relative+-1":"sidste mandag","field-week-relative+0":"denne uge","field-week-relative+1":"n\u00e6ste uge"},"dijit/nls/loading":{_localized:{},loadingState:"Indl\u00e6ser...",errorState:"Der er opst\u00e5et en fejl"},"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",
|
||||
_localized:{},"decimalFormat-short":"000\u00a0bill","currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"#,##0.00\u00a0\u00a4","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:".",percentFormat:"#,##0\u00a0%","decimalFormat-long":"000 billioner",decimalFormat:"#,##0.###",decimal:",","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"Forrige valg",
|
||||
_localized:{},nextMessage:"Flere valg"},"dijit/nls/common":{buttonOk:"OK",buttonCancel:"Annull\u00e9r",_localized:{},buttonSave:"Gem",itemClose:"Luk"}});
|
||||
//# sourceMappingURL=dojo_da.js.map
|
||||
16
Server/www/spiderbasic/dojo/nls/dojo_de.js
Normal file
@ -0,0 +1,16 @@
|
||||
//>>built
|
||||
define("dojo/nls/dojo_de",{"dijit/form/nls/validate":{invalidMessage:"Der eingegebene Wert ist ung\u00fcltig. ",rangeMessage:"Dieser Wert liegt au\u00dferhalb des g\u00fcltigen Bereichs. ",_localized:{},missingMessage:"Dieser Wert ist erforderlich."},"dojo/cldr/nls/gregorian":{"dateTimeFormats-appendItem-Year":"{1} {0}","field-tue-relative+-1":"Letzten Dienstag","field-year":"Jahr","dateFormatItem-Hm":"HH:mm","field-wed-relative+0":"Diesen Mittwoch","field-wed-relative+1":"N\u00e4chsten Mittwoch",
|
||||
"dayPeriods-format-wide-night":"nachts","dateFormatItem-ms":"mm:ss","timeFormat-short":"HH:mm","field-minute":"Minute","dateTimeFormat-short":"{1} {0}","field-day-relative+0":"Heute","field-day-relative+1":"Morgen","field-day-relative+2":"\u00dcbermorgen","field-tue-relative+0":"Diesen Dienstag","field-tue-relative+1":"N\u00e4chsten Dienstag","dayPeriods-format-narrow-am":"a","dateFormatItem-MMMd":"d. MMM","dayPeriods-format-abbr-am":"AM","field-week-relative+0":"Diese Woche","field-month-relative+0":"Dieser Monat",
|
||||
"field-week-relative+1":"N\u00e4chste Woche","field-month-relative+1":"N\u00e4chster Monat","timeFormat-medium":"HH:mm:ss","field-second-relative+0":"jetzt","dayPeriods-format-wide-afternoon":"nachmittags","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","months-standAlone-narrow":"JFMAMJJASOND".split(""),eraNames:["v. Chr.","n. Chr."],"dateFormatItem-GyMMMEd":"E, d. MMM y G","field-day":"Tag","field-year-relative+-1":"Letztes Jahr","dayPeriods-format-wide-am":"vorm.","field-wed-relative+-1":"Letzten Mittwoch",
|
||||
"dateTimeFormat-medium":"{1} {0}","field-second":"Sekunde","days-standAlone-narrow":"SMDMDFS".split(""),"dateFormatItem-Ehms":"E, h:mm:ss a","dateFormat-long":"d. MMMM y","dateFormatItem-GyMMMd":"d. MMM y G","dateFormatItem-yMMMEd":"E, d. MMM y","quarters-standAlone-wide":["1. Quartal","2. Quartal","3. Quartal","4. Quartal"],"days-format-narrow":"SMDMDFS".split(""),"dateTimeFormats-appendItem-Timezone":"{0} {1}","field-mon-relative+-1":"Letzten Montag","dateFormatItem-GyMMM":"MMM y G","field-month":"Monat",
|
||||
"dateFormatItem-MMM":"LLL","field-dayperiod":"Tagesh\u00e4lfte","dayPeriods-format-narrow-pm":"p","dateFormat-medium":"dd.MM.y",eraAbbr:["v. Chr.","n. Chr."],"quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],"dayPeriods-format-abbr-pm":"PM","dateFormatItem-MMd":"d.MM.","field-mon-relative+0":"Diesen Montag","field-mon-relative+1":"N\u00e4chsten Montag","months-format-narrow":"JFMAMJJASOND".split(""),"days-format-short":"So. Mo. Di. Mi. Do. Fr. Sa.".split(" "),"quarters-format-narrow":["1","2","3",
|
||||
"4"],"dayPeriods-format-wide-pm":"nachm.","field-sat-relative+-1":"Letzten Samstag","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dateTimeFormat-long":"{1} {0}","dateFormatItem-Md":"d.M.","field-hour":"Stunde","dateFormatItem-yQQQQ":"QQQQ y","months-format-wide":"Januar Februar M\u00e4rz April Mai Juni Juli August September Oktober November Dezember".split(" "),"dateFormat-full":"EEEE, d. MMMM y","field-month-relative+-1":"Letzter Monat","dayPeriods-format-wide-earlyMorning":"morgens","dateFormatItem-Hms":"HH:mm:ss",
|
||||
"field-fri-relative+0":"Diesen Freitag","field-fri-relative+1":"N\u00e4chsten Freitag","dayPeriods-format-narrow-noon":"n","dayPeriods-format-wide-morning":"vormittags","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})",_localized:{},"field-week-relative+-1":"Letzte Woche","dateFormatItem-Ehm":"E h:mm a","months-format-abbr":"Jan. Feb. M\u00e4rz Apr. Mai Juni Juli Aug. Sep. Okt. Nov. Dez.".split(" "),"timeFormat-long":"HH:mm:ss z","dateFormatItem-yMMM":"MMM y","dateFormat-short":"dd.MM.yy","days-standAlone-wide":"Sonntag Montag Dienstag Mittwoch Donnerstag Freitag Samstag".split(" "),
|
||||
"dateTimeFormats-appendItem-Era":"{1} {0}","dateFormatItem-H":"HH 'Uhr'","dateFormatItem-M":"L","months-standAlone-wide":"Januar Februar M\u00e4rz April Mai Juni Juli August September Oktober November Dezember".split(" "),"field-sun-relative+-1":"Letzten Sonntag","dateFormatItem-MMMMEd":"E, d. MMMM","days-standAlone-abbr":"So Mo Di Mi Do Fr Sa".split(" "),"dateTimeFormat-full":"{1} {0}","dateFormatItem-hm":"h:mm a","dateFormatItem-d":"d","field-weekday":"Wochentag","field-sat-relative+0":"Diesen Samstag",
|
||||
"dateFormatItem-h":"h a","field-sat-relative+1":"N\u00e4chsten Samstag","months-standAlone-abbr":"Jan Feb M\u00e4r Apr Mai Jun Jul Aug Sep Okt Nov Dez".split(" "),"dateFormatItem-yMM":"MM.y","timeFormat-full":"HH:mm:ss zzzz","dateFormatItem-MEd":"E, d.M.","dateFormatItem-y":"y","field-thu-relative+0":"Diesen Donnerstag","field-thu-relative+1":"N\u00e4chsten Donnerstag","dateFormatItem-hms":"h:mm:ss a","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dayPeriods-format-abbr-noon":"noon","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})",
|
||||
"field-thu-relative+-1":"Letzten Donnerstag","dateFormatItem-yMd":"d.M.y","field-week":"Woche","quarters-standAlone-narrow":["1","2","3","4"],"quarters-format-wide":["1. Quartal","2. Quartal","3. Quartal","4. Quartal"],"dateFormatItem-Ed":"E, d.","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","days-standAlone-short":"So. Mo. Di. Mi. Do. Fr. Sa.".split(" "),"dayPeriods-format-wide-evening":"abends","dateFormatItem-yMMdd":"dd.MM.y","quarters-format-abbr":["Q1","Q2","Q3","Q4"],"field-year-relative+0":"Dieses Jahr",
|
||||
"field-year-relative+1":"N\u00e4chstes Jahr","field-fri-relative+-1":"Letzten Freitag",eraNarrow:["v. Chr.","n. Chr."],"dayPeriods-format-wide-noon":"Mittag","dateFormatItem-yQQQ":"QQQ y","days-format-wide":"Sonntag Montag Dienstag Mittwoch Donnerstag Freitag Samstag".split(" "),"dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateFormatItem-EHm":"E, HH:mm","field-zone":"Zeitzone","dateFormatItem-yM":"M.y","dateFormatItem-yMMMM":"MMMM y","dateFormatItem-MMMEd":"E, d. MMM","dateFormatItem-EHms":"E, HH:mm:ss",
|
||||
"dateFormatItem-yMEd":"E, d.M.y","field-day-relative+-1":"Gestern","field-day-relative+-2":"Vorgestern","days-format-abbr":"So. Mo. Di. Mi. Do. Fr. Sa.".split(" "),"field-sun-relative+0":"Diesen Sonntag","dateFormatItem-MMdd":"dd.MM.","field-sun-relative+1":"N\u00e4chsten Sonntag","dateFormatItem-yMMMd":"d. MMM y","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-Gy":"y G","field-era":"Epoche"},"dijit/nls/loading":{_localized:{},loadingState:"Wird geladen...",errorState:"Es ist ein Fehler aufgetreten."},
|
||||
"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00b7",list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},"decimalFormat-short":"000\u00a0Bio","currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"#,##0.00\u00a0\u00a4","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",
|
||||
perMille:"\u2030",group:".",percentFormat:"#,##0\u00a0%","decimalFormat-long":"000 Billionen",decimalFormat:"#,##0.###",decimal:",","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"Vorherige Auswahl",_localized:{},nextMessage:"Weitere Auswahlm\u00f6glichkeiten"},"dijit/nls/common":{buttonOk:"OK",buttonCancel:"Abbrechen",_localized:{},buttonSave:"Speichern",itemClose:"Schlie\u00dfen"}});
|
||||
//# sourceMappingURL=dojo_de.js.map
|
||||
26
Server/www/spiderbasic/dojo/nls/dojo_el.js
Normal file
@ -0,0 +1,26 @@
|
||||
//>>built
|
||||
define("dojo/nls/dojo_el",{"dijit/form/nls/validate":{invalidMessage:"\u0397 \u03c4\u03b9\u03bc\u03ae \u03c0\u03bf\u03c5 \u03ba\u03b1\u03c4\u03b1\u03c7\u03c9\u03c1\u03ae\u03c3\u03b1\u03c4\u03b5 \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03ad\u03b3\u03ba\u03c5\u03c1\u03b7.",rangeMessage:"\u0397 \u03c4\u03b9\u03bc\u03ae \u03b1\u03c5\u03c4\u03ae \u03b4\u03b5\u03bd \u03b1\u03bd\u03ae\u03ba\u03b5\u03b9 \u03c3\u03c4\u03bf \u03b5\u03cd\u03c1\u03bf\u03c2 \u03ad\u03b3\u03ba\u03c5\u03c1\u03c9\u03bd \u03c4\u03b9\u03bc\u03ce\u03bd.",
|
||||
_localized:{},missingMessage:"\u0397 \u03c4\u03b9\u03bc\u03ae \u03b1\u03c5\u03c4\u03ae \u03c0\u03c1\u03ad\u03c0\u03b5\u03b9 \u03b1\u03c0\u03b1\u03c1\u03b1\u03af\u03c4\u03b7\u03c4\u03b1 \u03bd\u03b1 \u03ba\u03b1\u03b8\u03bf\u03c1\u03b9\u03c3\u03c4\u03b5\u03af."},"dojo/cldr/nls/gregorian":{"dateFormatItem-Ehm":"E h:mm a","days-standAlone-short":"\u039a\u03c5 \u0394\u03b5 \u03a4\u03c1 \u03a4\u03b5 \u03a0\u03ad \u03a0\u03b1 \u03a3\u03ac".split(" "),"months-format-narrow":"\u0399\u03a6\u039c\u0391\u039c\u0399\u0399\u0391\u03a3\u039f\u039d\u0394".split(""),
|
||||
"field-second-relative+0":"\u03c4\u03ce\u03c1\u03b1","quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"\u0397\u03bc\u03ad\u03c1\u03b1 \u03b5\u03b2\u03b4\u03bf\u03bc\u03ac\u03b4\u03b1\u03c2","dateFormatItem-yQQQ":"y QQQ","dateFormatItem-yMEd":"E, d/M/y","field-wed-relative+0":"\u03b1\u03c5\u03c4\u03ae\u03bd \u03c4\u03b7\u03bd \u03a4\u03b5\u03c4\u03ac\u03c1\u03c4\u03b7","field-wed-relative+1":"\u03b5\u03c0\u03cc\u03bc\u03b5\u03bd\u03b7 \u03a4\u03b5\u03c4\u03ac\u03c1\u03c4\u03b7","dateFormatItem-GyMMMEd":"E, d MMM y G",
|
||||
"dateFormatItem-MMMEd":"E, d MMM",eraNarrow:["\u03c0.\u03a7.","\u03bc.\u03a7."],"field-tue-relative+-1":"\u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03b7 \u03a4\u03c1\u03af\u03c4\u03b7","days-format-short":"\u039a\u03c5 \u0394\u03b5 \u03a4\u03c1 \u03a4\u03b5 \u03a0\u03ad \u03a0\u03b1 \u03a3\u03ac".split(" "),"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"d MMMM y","field-fri-relative+-1":"\u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03b7 \u03a0\u03b1\u03c1\u03b1\u03c3\u03ba\u03b5\u03c5\u03ae",
|
||||
"field-wed-relative+-1":"\u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03b7 \u03a4\u03b5\u03c4\u03ac\u03c1\u03c4\u03b7","months-format-wide":"\u0399\u03b1\u03bd\u03bf\u03c5\u03b1\u03c1\u03af\u03bf\u03c5 \u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03b1\u03c1\u03af\u03bf\u03c5 \u039c\u03b1\u03c1\u03c4\u03af\u03bf\u03c5 \u0391\u03c0\u03c1\u03b9\u03bb\u03af\u03bf\u03c5 \u039c\u03b1\u0390\u03bf\u03c5 \u0399\u03bf\u03c5\u03bd\u03af\u03bf\u03c5 \u0399\u03bf\u03c5\u03bb\u03af\u03bf\u03c5 \u0391\u03c5\u03b3\u03bf\u03cd\u03c3\u03c4\u03bf\u03c5 \u03a3\u03b5\u03c0\u03c4\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5 \u039f\u03ba\u03c4\u03c9\u03b2\u03c1\u03af\u03bf\u03c5 \u039d\u03bf\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5 \u0394\u03b5\u03ba\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5".split(" "),
|
||||
"dateTimeFormat-medium":"{1} - {0}","dayPeriods-format-wide-pm":"\u03bc.\u03bc.","dateFormat-full":"EEEE, d MMMM y","field-thu-relative+-1":"\u03b5\u03c0\u03cc\u03bc\u03b5\u03bd\u03b7 \u03a0\u03ad\u03bc\u03c0\u03c4\u03b7","dateFormatItem-Md":"d/M",_localized:{},"dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dayPeriods-format-wide-noon":"noon","dateFormatItem-yMd":"d/M/y","field-era":"\u03a0\u03b5\u03c1\u03af\u03bf\u03b4\u03bf\u03c2","dateFormatItem-yM":"M/y",
|
||||
"months-standAlone-wide":"\u0399\u03b1\u03bd\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2 \u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2 \u039c\u03ac\u03c1\u03c4\u03b9\u03bf\u03c2 \u0391\u03c0\u03c1\u03af\u03bb\u03b9\u03bf\u03c2 \u039c\u03ac\u03b9\u03bf\u03c2 \u0399\u03bf\u03cd\u03bd\u03b9\u03bf\u03c2 \u0399\u03bf\u03cd\u03bb\u03b9\u03bf\u03c2 \u0391\u03cd\u03b3\u03bf\u03c5\u03c3\u03c4\u03bf\u03c2 \u03a3\u03b5\u03c0\u03c4\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2 \u039f\u03ba\u03c4\u03ce\u03b2\u03c1\u03b9\u03bf\u03c2 \u039d\u03bf\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2 \u0394\u03b5\u03ba\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2".split(" "),
|
||||
"timeFormat-short":"h:mm a","quarters-format-wide":["1\u03bf \u03c4\u03c1\u03af\u03bc\u03b7\u03bd\u03bf","2\u03bf \u03c4\u03c1\u03af\u03bc\u03b7\u03bd\u03bf","3\u03bf \u03c4\u03c1\u03af\u03bc\u03b7\u03bd\u03bf","4\u03bf \u03c4\u03c1\u03af\u03bc\u03b7\u03bd\u03bf"],"dateFormatItem-yQQQQ":"y QQQQ","timeFormat-long":"h:mm:ss a z","field-year":"\u0388\u03c4\u03bf\u03c2","dateFormatItem-yMMM":"LLL y","dateTimeFormats-appendItem-Era":"{1} {0}","field-hour":"\u038f\u03c1\u03b1","months-format-abbr":"\u0399\u03b1\u03bd \u03a6\u03b5\u03b2 \u039c\u03b1\u03c1 \u0391\u03c0\u03c1 \u039c\u03b1\u0390 \u0399\u03bf\u03c5\u03bd \u0399\u03bf\u03c5\u03bb \u0391\u03c5\u03b3 \u03a3\u03b5\u03c0 \u039f\u03ba\u03c4 \u039d\u03bf\u03b5 \u0394\u03b5\u03ba".split(" "),
|
||||
"field-sat-relative+0":"\u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03a3\u03ac\u03b2\u03b2\u03b1\u03c4\u03bf","field-sat-relative+1":"\u03b5\u03c0\u03cc\u03bc\u03b5\u03bd\u03bf \u03a3\u03ac\u03b2\u03b2\u03b1\u03c4\u03bf","timeFormat-full":"h:mm:ss a zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-day-relative+0":"\u03c3\u03ae\u03bc\u03b5\u03c1\u03b1","field-thu-relative+0":"\u03b1\u03c5\u03c4\u03ae\u03bd \u03c4\u03b7\u03bd \u03a0\u03ad\u03bc\u03c0\u03c4\u03b7","field-day-relative+1":"\u03b1\u03cd\u03c1\u03b9\u03bf",
|
||||
"field-thu-relative+1":"\u03b5\u03c0\u03cc\u03bc\u03b5\u03bd\u03b7 \u03a0\u03ad\u03bc\u03c0\u03c4\u03b7","dateFormatItem-GyMMMd":"d MMM y G","field-day-relative+2":"\u03bc\u03b5\u03b8\u03b1\u03cd\u03c1\u03b9\u03bf","dateFormatItem-H":"HH","months-standAlone-abbr":"\u0399\u03b1\u03bd \u03a6\u03b5\u03b2 \u039c\u03ac\u03c1 \u0391\u03c0\u03c1 \u039c\u03ac\u03b9 \u0399\u03bf\u03cd\u03bd \u0399\u03bf\u03cd\u03bb \u0391\u03cd\u03b3 \u03a3\u03b5\u03c0 \u039f\u03ba\u03c4 \u039d\u03bf\u03ad \u0394\u03b5\u03ba".split(" "),
|
||||
"quarters-format-abbr":["\u03a41","\u03a42","\u03a43","\u03a44"],"quarters-standAlone-wide":["1\u03bf \u03c4\u03c1\u03af\u03bc\u03b7\u03bd\u03bf","2\u03bf \u03c4\u03c1\u03af\u03bc\u03b7\u03bd\u03bf","3\u03bf \u03c4\u03c1\u03af\u03bc\u03b7\u03bd\u03bf","4\u03bf \u03c4\u03c1\u03af\u03bc\u03b7\u03bd\u03bf"],"dateFormatItem-Gy":"y G","dateFormatItem-HHmmss":"HH:mm:ss","dateFormatItem-M":"L","days-standAlone-wide":"\u039a\u03c5\u03c1\u03b9\u03b1\u03ba\u03ae \u0394\u03b5\u03c5\u03c4\u03ad\u03c1\u03b1 \u03a4\u03c1\u03af\u03c4\u03b7 \u03a4\u03b5\u03c4\u03ac\u03c1\u03c4\u03b7 \u03a0\u03ad\u03bc\u03c0\u03c4\u03b7 \u03a0\u03b1\u03c1\u03b1\u03c3\u03ba\u03b5\u03c5\u03ae \u03a3\u03ac\u03b2\u03b2\u03b1\u03c4\u03bf".split(" "),
|
||||
"dateFormatItem-MMMMd":"d MMMM","dayPeriods-format-abbr-noon":"noon","timeFormat-medium":"h:mm:ss a","field-sun-relative+0":"\u03b1\u03c5\u03c4\u03ae\u03bd \u03c4\u03b7\u03bd \u039a\u03c5\u03c1\u03b9\u03b1\u03ba\u03ae","dateFormatItem-Hm":"HH:mm","field-sun-relative+1":"\u03b5\u03c0\u03cc\u03bc\u03b5\u03bd\u03b7 \u039a\u03c5\u03c1\u03b9\u03b1\u03ba\u03ae","quarters-standAlone-abbr":["\u03a41","\u03a42","\u03a43","\u03a44"],eraAbbr:["\u03c0.\u03a7.","\u03bc.\u03a7."],"field-minute":"\u039b\u03b5\u03c0\u03c4\u03cc",
|
||||
"field-dayperiod":"\u03c0.\u03bc./\u03bc.\u03bc.","days-standAlone-abbr":"\u039a\u03c5\u03c1 \u0394\u03b5\u03c5 \u03a4\u03c1\u03af \u03a4\u03b5\u03c4 \u03a0\u03ad\u03bc \u03a0\u03b1\u03c1 \u03a3\u03ac\u03b2".split(" "),"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"field-day-relative+-1":"\u03c7\u03b8\u03b5\u03c2","dateTimeFormat-long":"{1} - {0}","dayPeriods-format-narrow-am":"a","dateFormatItem-h":"h a","field-day-relative+-2":"\u03c0\u03c1\u03bf\u03c7\u03b8\u03ad\u03c2",
|
||||
"dateFormatItem-MMMd":"d MMM","dateFormatItem-MEd":"E, d/M","dateTimeFormat-full":"{1} - {0}","field-fri-relative+0":"\u03b1\u03c5\u03c4\u03ae\u03bd \u03c4\u03b7\u03bd \u03a0\u03b1\u03c1\u03b1\u03c3\u03ba\u03b5\u03c5\u03ae","field-fri-relative+1":"\u03b5\u03c0\u03cc\u03bc\u03b5\u03bd\u03b7 \u03a0\u03b1\u03c1\u03b1\u03c3\u03ba\u03b5\u03c5\u03ae","dateFormatItem-yMMMM":"LLLL y","field-day":"\u0397\u03bc\u03ad\u03c1\u03b1","days-format-wide":"\u039a\u03c5\u03c1\u03b9\u03b1\u03ba\u03ae \u0394\u03b5\u03c5\u03c4\u03ad\u03c1\u03b1 \u03a4\u03c1\u03af\u03c4\u03b7 \u03a4\u03b5\u03c4\u03ac\u03c1\u03c4\u03b7 \u03a0\u03ad\u03bc\u03c0\u03c4\u03b7 \u03a0\u03b1\u03c1\u03b1\u03c3\u03ba\u03b5\u03c5\u03ae \u03a3\u03ac\u03b2\u03b2\u03b1\u03c4\u03bf".split(" "),
|
||||
"field-zone":"\u0396\u03ce\u03bd\u03b7","months-standAlone-narrow":"\u0399\u03a6\u039c\u0391\u039c\u0399\u0399\u0391\u03a3\u039f\u039d\u0394".split(""),"dateFormatItem-y":"y","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-year-relative+-1":"\u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03bf \u03ad\u03c4\u03bf\u03c2","field-month-relative+-1":"\u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03bf\u03c2 \u03bc\u03ae\u03bd\u03b1\u03c2","dateTimeFormats-appendItem-Year":"{1} {0}",
|
||||
"dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-abbr":"\u039a\u03c5\u03c1 \u0394\u03b5\u03c5 \u03a4\u03c1\u03af \u03a4\u03b5\u03c4 \u03a0\u03ad\u03bc \u03a0\u03b1\u03c1 \u03a3\u03ac\u03b2".split(" "),eraNames:["\u03c0.\u03a7.","\u03bc.\u03a7."],"dateFormatItem-yMMMd":"d MMM y","days-format-narrow":"\u039a\u0394\u03a4\u03a4\u03a0\u03a0\u03a3".split(""),"field-month":"\u039c\u03ae\u03bd\u03b1\u03c2","days-standAlone-narrow":"\u039a\u0394\u03a4\u03a4\u03a0\u03a0\u03a3".split(""),
|
||||
"dateFormatItem-MMM":"LLL","dateFormatItem-HHmm":"HH:mm","field-tue-relative+0":"\u03b1\u03c5\u03c4\u03ae\u03bd \u03c4\u03b7\u03bd \u03a4\u03c1\u03af\u03c4\u03b7","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","field-tue-relative+1":"\u03b5\u03c0\u03cc\u03bc\u03b5\u03bd\u03b7 \u03a4\u03c1\u03af\u03c4\u03b7","dayPeriods-format-wide-am":"\u03c0.\u03bc.","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-MMMMEd":"E, d MMMM",
|
||||
"dateFormatItem-EHm":"E HH:mm","field-mon-relative+0":"\u03b1\u03c5\u03c4\u03ae\u03bd \u03c4\u03b7 \u0394\u03b5\u03c5\u03c4\u03ad\u03c1\u03b1","field-mon-relative+1":"\u03b5\u03c0\u03cc\u03bc\u03b5\u03bd\u03b7 \u0394\u03b5\u03c5\u03c4\u03ad\u03c1\u03b1","dateFormat-short":"d/M/yy","dateFormatItem-EHms":"E HH:mm:ss","dateFormatItem-Ehms":"E h:mm:ss a","dayPeriods-format-narrow-noon":"n","field-second":"\u0394\u03b5\u03c5\u03c4\u03b5\u03c1\u03cc\u03bb\u03b5\u03c0\u03c4\u03bf","field-sat-relative+-1":"\u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03bf \u03a3\u03ac\u03b2\u03b2\u03b1\u03c4\u03bf",
|
||||
"dateFormatItem-yMMMEd":"E, d MMM y","field-sun-relative+-1":"\u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03b7 \u039a\u03c5\u03c1\u03b9\u03b1\u03ba\u03ae","field-month-relative+0":"\u03c4\u03c1\u03ad\u03c7\u03c9\u03bd \u03bc\u03ae\u03bd\u03b1\u03c2","field-month-relative+1":"\u03b5\u03c0\u03cc\u03bc\u03b5\u03bd\u03bf\u03c2 \u03bc\u03ae\u03bd\u03b1\u03c2","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormatItem-Ed":"E d","field-week":"\u0395\u03b2\u03b4\u03bf\u03bc\u03ac\u03b4\u03b1",
|
||||
"dateFormat-medium":"d MMM y","field-week-relative+-1":"\u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03b7 \u03b5\u03b2\u03b4\u03bf\u03bc\u03ac\u03b4\u03b1","field-year-relative+0":"\u03c6\u03ad\u03c4\u03bf\u03c2","field-year-relative+1":"\u03b5\u03c0\u03cc\u03bc\u03b5\u03bd\u03bf \u03ad\u03c4\u03bf\u03c2","dayPeriods-format-narrow-pm":"p","dateTimeFormat-short":"{1} - {0}","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a","dateFormatItem-GyMMM":"LLL y G","field-mon-relative+-1":"\u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03b7 \u0394\u03b5\u03c5\u03c4\u03ad\u03c1\u03b1",
|
||||
"field-week-relative+0":"\u03b1\u03c5\u03c4\u03ae\u03bd \u03c4\u03b7\u03bd \u03b5\u03b2\u03b4\u03bf\u03bc\u03ac\u03b4\u03b1","field-week-relative+1":"\u03b5\u03c0\u03cc\u03bc\u03b5\u03bd\u03b7 \u03b5\u03b2\u03b4\u03bf\u03bc\u03ac\u03b4\u03b1"},"dijit/nls/loading":{_localized:{},loadingState:"\u03a6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7...",errorState:"\u03a3\u03b1\u03c2 \u03b6\u03b7\u03c4\u03bf\u03cd\u03bc\u03b5 \u03c3\u03c5\u03b3\u03bd\u03ce\u03bc\u03b7, \u03c0\u03b1\u03c1\u03bf\u03c5\u03c3\u03b9\u03ac\u03c3\u03c4\u03b7\u03ba\u03b5 \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1"},
|
||||
"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},"decimalFormat-short":"000\u00a0\u03c4\u03c1\u03b9\u03c3'.'","currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"#,##0.00\u00a0\u00a4",
|
||||
"currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:".",percentFormat:"#,##0%","decimalFormat-long":"000 \u03c4\u03c1\u03b9\u03c3\u03b5\u03ba\u03b1\u03c4\u03bf\u03bc\u03bc\u03cd\u03c1\u03b9\u03b1",decimalFormat:"#,##0.###",decimal:",","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"e"},"dijit/form/nls/ComboBox":{previousMessage:"\u03a0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03b5\u03c2 \u03b5\u03c0\u03b9\u03bb\u03bf\u03b3\u03ad\u03c2",
|
||||
_localized:{},nextMessage:"\u03a0\u03b5\u03c1\u03b9\u03c3\u03c3\u03cc\u03c4\u03b5\u03c1\u03b5\u03c2 \u03b5\u03c0\u03b9\u03bb\u03bf\u03b3\u03ad\u03c2"},"dijit/nls/common":{buttonOk:"\u039f\u039a",buttonCancel:"\u0391\u03ba\u03cd\u03c1\u03c9\u03c3\u03b7",_localized:{},buttonSave:"\u0391\u03c0\u03bf\u03b8\u03ae\u03ba\u03b5\u03c5\u03c3\u03b7",itemClose:"\u039a\u03bb\u03b5\u03af\u03c3\u03b9\u03bc\u03bf"}});
|
||||
//# sourceMappingURL=dojo_el.js.map
|
||||
15
Server/www/spiderbasic/dojo/nls/dojo_en-gb.js
Normal file
@ -0,0 +1,15 @@
|
||||
//>>built
|
||||
define("dojo/nls/dojo_en-gb",{"dijit/form/nls/validate":{invalidMessage:"The value entered is not valid.",rangeMessage:"This value is out of range.",_localized:{},missingMessage:"This value is required."},"dojo/cldr/nls/gregorian":{"dateFormatItem-Ehm":"E h:mm a","days-standAlone-short":"Su Mo Tu We Th Fr Sa".split(" "),"months-format-narrow":"JFMAMJJASOND".split(""),"field-second-relative+0":"now","quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"Day of the Week","dateFormatItem-yQQQ":"QQQ y",
|
||||
"dateFormatItem-yMEd":"E, dd/MM/y","field-wed-relative+0":"this Wednesday","field-wed-relative+1":"next Wednesday","dateFormatItem-GyMMMEd":"E, d MMM y G","dateFormatItem-MMMEd":"E d MMM",eraNarrow:["B","A"],"field-tue-relative+-1":"last Tuesday","days-format-short":"Su Mo Tu We Th Fr Sa".split(" "),"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"d MMMM y","field-fri-relative+-1":"last Friday","field-wed-relative+-1":"last Wednesday","months-format-wide":"January February March April May June July August September October November December".split(" "),
|
||||
"dateTimeFormat-medium":"{1} {0}","dayPeriods-format-wide-pm":"pm","dateFormat-full":"EEEE, d MMMM y","field-thu-relative+-1":"last Thursday","dateFormatItem-Md":"dd/MM",_localized:{},"dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dayPeriods-format-wide-noon":"noon","dateFormatItem-yMd":"dd/MM/y","field-era":"Era","dateFormatItem-yM":"MM/y","months-standAlone-wide":"January February March April May June July August September October November December".split(" "),
|
||||
"timeFormat-short":"HH:mm","quarters-format-wide":["1st quarter","2nd quarter","3rd quarter","4th quarter"],"dateFormatItem-yQQQQ":"QQQQ y","timeFormat-long":"HH:mm:ss z","field-year":"Year","dateFormatItem-yMMM":"MMM y","dateTimeFormats-appendItem-Era":"{0} {1}","field-hour":"Hour","dateFormatItem-MMdd":"dd/MM","months-format-abbr":"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),"field-sat-relative+0":"this Saturday","field-sat-relative+1":"next Saturday","timeFormat-full":"HH:mm:ss zzzz",
|
||||
"dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-day-relative+0":"today","field-thu-relative+0":"this Thursday","field-day-relative+1":"tomorrow","field-thu-relative+1":"next Thursday","dateFormatItem-GyMMMd":"d MMM y G","dateFormatItem-H":"HH","months-standAlone-abbr":"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),"quarters-format-abbr":["Q1","Q2","Q3","Q4"],"quarters-standAlone-wide":["1st quarter","2nd quarter","3rd quarter","4th quarter"],"dateFormatItem-Gy":"y G","dateFormatItem-M":"LL",
|
||||
"days-standAlone-wide":"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),"dateFormatItem-MMMMd":"d MMMM","dayPeriods-format-abbr-noon":"noon","timeFormat-medium":"HH:mm:ss","field-sun-relative+0":"this Sunday","dateFormatItem-Hm":"HH:mm","field-sun-relative+1":"next Sunday","quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],eraAbbr:["BC","AD"],"field-minute":"Minute","field-dayperiod":"am/pm","days-standAlone-abbr":"Sun Mon Tue Wed Thu Fri Sat".split(" "),"dateFormatItem-d":"d",
|
||||
"dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"field-day-relative+-1":"yesterday","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"a","dateFormatItem-h":"h a","dateFormatItem-MMMd":"d MMM","dateFormatItem-MEd":"E dd/MM","dateTimeFormat-full":"{1} {0}","field-fri-relative+0":"this Friday","field-fri-relative+1":"next Friday","dateFormatItem-yMMMM":"MMMM y","field-day":"Day","days-format-wide":"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),
|
||||
"field-zone":"Time Zone","months-standAlone-narrow":"JFMAMJJASOND".split(""),"dateFormatItem-y":"y","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-year-relative+-1":"last year","field-month-relative+-1":"last month","dateTimeFormats-appendItem-Year":"{0} {1}","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-abbr":"Sun Mon Tue Wed Thu Fri Sat".split(" "),eraNames:["Before Christ","Anno Domini"],"dateFormatItem-yMMMd":"d MMM y",
|
||||
"days-format-narrow":"SMTWTFS".split(""),"field-month":"Month","days-standAlone-narrow":"SMTWTFS".split(""),"dateFormatItem-MMM":"LLL","field-tue-relative+0":"this Tuesday","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","field-tue-relative+1":"next Tuesday","dayPeriods-format-wide-am":"am","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-EHm":"E HH:mm","field-mon-relative+0":"this Monday","field-mon-relative+1":"next Monday",
|
||||
"dateFormat-short":"dd/MM/y","dateFormatItem-EHms":"E HH:mm:ss","dateFormatItem-Ehms":"E h:mm:ss a","dayPeriods-format-narrow-noon":"n","field-second":"Second","field-sat-relative+-1":"last Saturday","dateFormatItem-yMMMEd":"E, d MMM y","field-sun-relative+-1":"last Sunday","field-month-relative+0":"this month","field-month-relative+1":"next month","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormatItem-Ed":"E d","field-week":"Week","dateFormat-medium":"d MMM y","field-week-relative+-1":"last week",
|
||||
"field-year-relative+0":"this year","field-year-relative+1":"next year","dayPeriods-format-narrow-pm":"p","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a","dateFormatItem-GyMMM":"MMM y G","field-mon-relative+-1":"last Monday","field-week-relative+0":"this week","field-week-relative+1":"next week"},"dijit/nls/loading":{_localized:{},loadingState:"Loading...",errorState:"Sorry, an error occurred"},"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",
|
||||
infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},"decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"\u00a4#,##0.00;(\u00a4#,##0.00)","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:",",percentFormat:"#,##0%","decimalFormat-long":"000 trillion",
|
||||
decimalFormat:"#,##0.###",decimal:".","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"Previous choices",_localized:{},nextMessage:"More choices"},"dijit/nls/common":{buttonOk:"OK",buttonCancel:"Cancel",_localized:{},buttonSave:"Save",itemClose:"Close"}});
|
||||
//# sourceMappingURL=dojo_en-gb.js.map
|
||||
15
Server/www/spiderbasic/dojo/nls/dojo_en-us.js
Normal file
@ -0,0 +1,15 @@
|
||||
//>>built
|
||||
define("dojo/nls/dojo_en-us",{"dijit/form/nls/validate":{invalidMessage:"The value entered is not valid.",rangeMessage:"This value is out of range.",_localized:{},missingMessage:"This value is required."},"dojo/cldr/nls/gregorian":{"dateFormatItem-Ehm":"E h:mm a","days-standAlone-short":"Su Mo Tu We Th Fr Sa".split(" "),"months-format-narrow":"JFMAMJJASOND".split(""),"field-second-relative+0":"now","quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"Day of the Week","dateFormatItem-yQQQ":"QQQ y",
|
||||
"dateFormatItem-yMEd":"E, M/d/y","field-wed-relative+0":"this Wednesday","field-wed-relative+1":"next Wednesday","dateFormatItem-GyMMMEd":"E, MMM d, y G","dateFormatItem-MMMEd":"E, MMM d",eraNarrow:["B","A"],"field-tue-relative+-1":"last Tuesday","days-format-short":"Su Mo Tu We Th Fr Sa".split(" "),"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"MMMM d, y","field-fri-relative+-1":"last Friday","field-wed-relative+-1":"last Wednesday","months-format-wide":"January February March April May June July August September October November December".split(" "),
|
||||
"dateTimeFormat-medium":"{1}, {0}","dayPeriods-format-wide-pm":"PM","dateFormat-full":"EEEE, MMMM d, y","field-thu-relative+-1":"last Thursday","dateFormatItem-Md":"M/d",_localized:{},"dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dayPeriods-format-wide-noon":"noon","dateFormatItem-yMd":"M/d/y","field-era":"Era","dateFormatItem-yM":"M/y","months-standAlone-wide":"January February March April May June July August September October November December".split(" "),
|
||||
"timeFormat-short":"h:mm a","quarters-format-wide":["1st quarter","2nd quarter","3rd quarter","4th quarter"],"dateFormatItem-yQQQQ":"QQQQ y","timeFormat-long":"h:mm:ss a z","field-year":"Year","dateFormatItem-yMMM":"MMM y","dateTimeFormats-appendItem-Era":"{0} {1}","field-hour":"Hour","months-format-abbr":"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),"field-sat-relative+0":"this Saturday","field-sat-relative+1":"next Saturday","timeFormat-full":"h:mm:ss a zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})",
|
||||
"field-day-relative+0":"today","field-thu-relative+0":"this Thursday","field-day-relative+1":"tomorrow","field-thu-relative+1":"next Thursday","dateFormatItem-GyMMMd":"MMM d, y G","dateFormatItem-H":"HH","months-standAlone-abbr":"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),"quarters-format-abbr":["Q1","Q2","Q3","Q4"],"quarters-standAlone-wide":["1st quarter","2nd quarter","3rd quarter","4th quarter"],"dateFormatItem-Gy":"y G","dateFormatItem-M":"L","days-standAlone-wide":"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),
|
||||
"dayPeriods-format-abbr-noon":"noon","timeFormat-medium":"h:mm:ss a","field-sun-relative+0":"this Sunday","dateFormatItem-Hm":"HH:mm","field-sun-relative+1":"next Sunday","quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],eraAbbr:["BC","AD"],"field-minute":"Minute","field-dayperiod":"AM/PM","days-standAlone-abbr":"Sun Mon Tue Wed Thu Fri Sat".split(" "),"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"field-day-relative+-1":"yesterday","dateTimeFormat-long":"{1} 'at' {0}",
|
||||
"dayPeriods-format-narrow-am":"a","dateFormatItem-h":"h a","dateFormatItem-MMMd":"MMM d","dateFormatItem-MEd":"E, M/d","dateTimeFormat-full":"{1} 'at' {0}","field-fri-relative+0":"this Friday","field-fri-relative+1":"next Friday","field-day":"Day","days-format-wide":"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),"field-zone":"Time Zone","months-standAlone-narrow":"JFMAMJJASOND".split(""),"dateFormatItem-y":"y","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-year-relative+-1":"last year",
|
||||
"field-month-relative+-1":"last month","dateTimeFormats-appendItem-Year":"{0} {1}","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-abbr":"Sun Mon Tue Wed Thu Fri Sat".split(" "),eraNames:["Before Christ","Anno Domini"],"dateFormatItem-yMMMd":"MMM d, y","days-format-narrow":"SMTWTFS".split(""),"field-month":"Month","days-standAlone-narrow":"SMTWTFS".split(""),"dateFormatItem-MMM":"LLL","field-tue-relative+0":"this Tuesday",
|
||||
"dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","field-tue-relative+1":"next Tuesday","dayPeriods-format-wide-am":"AM","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-EHm":"E HH:mm","field-mon-relative+0":"this Monday","field-mon-relative+1":"next Monday","dateFormat-short":"M/d/yy","dateFormatItem-EHms":"E HH:mm:ss","dateFormatItem-Ehms":"E h:mm:ss a","dayPeriods-format-narrow-noon":"n","field-second":"Second","field-sat-relative+-1":"last Saturday",
|
||||
"dateFormatItem-yMMMEd":"E, MMM d, y","field-sun-relative+-1":"last Sunday","field-month-relative+0":"this month","field-month-relative+1":"next month","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormatItem-Ed":"d E","field-week":"Week","dateFormat-medium":"MMM d, y","field-week-relative+-1":"last week","field-year-relative+0":"this year","field-year-relative+1":"next year","dayPeriods-format-narrow-pm":"p","dateTimeFormat-short":"{1}, {0}","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a",
|
||||
"dateFormatItem-GyMMM":"MMM y G","field-mon-relative+-1":"last Monday","field-week-relative+0":"this week","field-week-relative+1":"next week"},"dijit/nls/loading":{_localized:{},loadingState:"Loading...",errorState:"Sorry, an error occurred"},"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},
|
||||
"decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"\u00a4#,##0.00;(\u00a4#,##0.00)","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:",",percentFormat:"#,##0%","decimalFormat-long":"000 trillion",decimalFormat:"#,##0.###",decimal:".","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"Previous choices",
|
||||
_localized:{},nextMessage:"More choices"},"dijit/nls/common":{buttonOk:"OK",buttonCancel:"Cancel",_localized:{},buttonSave:"Save",itemClose:"Close"}});
|
||||
//# sourceMappingURL=dojo_en-us.js.map
|
||||
16
Server/www/spiderbasic/dojo/nls/dojo_es-es.js
Normal file
@ -0,0 +1,16 @@
|
||||
//>>built
|
||||
define("dojo/nls/dojo_es-es",{"dijit/form/nls/validate":{invalidMessage:"El valor especificado no es v\u00e1lido.",rangeMessage:"Este valor est\u00e1 fuera del intervalo.",_localized:{},missingMessage:"Este valor es necesario."},"dojo/cldr/nls/gregorian":{"dateFormatItem-Ehm":"E, h:mm a","days-standAlone-short":"DO LU MA MI JU VI SA".split(" "),"months-format-narrow":"EFMAMJJASOND".split(""),"field-second-relative+0":"ahora","quarters-standAlone-narrow":["1T","2T","3T","4T"],"field-weekday":"d\u00eda de la semana",
|
||||
"dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"EEE, d/M/y","field-wed-relative+0":"este mi\u00e9rcoles","field-wed-relative+1":"el pr\u00f3ximo mi\u00e9rcoles","dateFormatItem-GyMMMEd":"E, d 'de' MMMM 'de' y G","dateFormatItem-MMMEd":"E d 'de' MMM",eraNarrow:["a. C.","d. C."],"dateFormatItem-yMM":"M/y","field-tue-relative+-1":"el martes pasado","dateFormatItem-MMMdd":"dd-MMM","days-format-short":"DO LU MA MI JU VI SA".split(" "),"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"d 'de' MMMM 'de' y",
|
||||
"field-fri-relative+-1":"el viernes pasado","field-wed-relative+-1":"el mi\u00e9rcoles pasado","months-format-wide":"enero febrero marzo abril mayo junio julio agosto septiembre octubre noviembre diciembre".split(" "),"dateTimeFormat-medium":"{1} {0}","dayPeriods-format-wide-pm":"p. m.","dateFormat-full":"EEEE, d 'de' MMMM 'de' y","field-thu-relative+-1":"el jueves pasado","dateFormatItem-Md":"d/M",_localized:{},"dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})",
|
||||
"dayPeriods-format-wide-noon":"noon","dateFormatItem-yMd":"d/M/y","field-era":"era","dateFormatItem-yM":"M/y","months-standAlone-wide":"Enero Febrero Marzo Abril Mayo Junio Julio Agosto Septiembre Octubre Noviembre Diciembre".split(" "),"timeFormat-short":"H:mm","quarters-format-wide":["1.er trimestre","2.\u00ba trimestre","3.er trimestre","4.\u00ba trimestre"],"dateFormatItem-yQQQQ":"QQQQ 'de' y","timeFormat-long":"H:mm:ss z","field-year":"a\u00f1o","dateFormatItem-yMMM":"MMM 'de' y","dateTimeFormats-appendItem-Era":"{1} {0}",
|
||||
"field-hour":"hora","dateFormatItem-MMdd":"d/M","months-format-abbr":"ene. feb. mar. abr. may. jun. jul. ago. sept. oct. nov. dic.".split(" "),"field-sat-relative+0":"este s\u00e1bado","field-sat-relative+1":"el pr\u00f3ximo s\u00e1bado","timeFormat-full":"H:mm:ss (zzzz)","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-day-relative+0":"hoy","field-thu-relative+0":"este jueves","field-day-relative+1":"ma\u00f1ana","field-thu-relative+1":"el pr\u00f3ximo jueves","dateFormatItem-GyMMMd":"d MMM 'de' y G",
|
||||
"field-day-relative+2":"pasado ma\u00f1ana","dateFormatItem-H":"H","months-standAlone-abbr":"Ene. Feb. Mar. Abr. May. Jun. Jul. Ago. Sept. Oct. Nov. Dic.".split(" "),"quarters-format-abbr":["T1","T2","T3","T4"],"quarters-standAlone-wide":["1.er trimestre","2.\u00ba trimestre","3.er trimestre","4.\u00ba trimestre"],"dateFormatItem-Gy":"y G","dateFormatItem-M":"L","days-standAlone-wide":"Domingo Lunes Martes Mi\u00e9rcoles Jueves Viernes S\u00e1bado".split(" "),"dateFormatItem-MMMMd":"d 'de' MMMM",
|
||||
"dayPeriods-format-abbr-noon":"noon","timeFormat-medium":"H:mm:ss","field-sun-relative+0":"este domingo","dateFormatItem-Hm":"H:mm","field-sun-relative+1":"el pr\u00f3ximo domingo","quarters-standAlone-abbr":["T1","T2","T3","T4"],eraAbbr:["a. C.","d. C."],"field-minute":"minuto","field-dayperiod":"periodo del d\u00eda","days-standAlone-abbr":"Dom. Lun. Mar. Mi\u00e9. Jue. Vie. S\u00e1b.".split(" "),"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1T","2T","3T","4T"],"field-day-relative+-1":"ayer",
|
||||
"dateTimeFormat-long":"{1}, {0}","dayPeriods-format-narrow-am":"a.m.","dateFormatItem-h":"h a","field-day-relative+-2":"antes de ayer","dateFormatItem-MMMd":"d 'de' MMM","dateFormatItem-MEd":"E, d/M","dateTimeFormat-full":"{1}, {0}","field-fri-relative+0":"este viernes","field-fri-relative+1":"el pr\u00f3ximo viernes","dateFormatItem-yMMMM":"MMMM 'de' y","field-day":"d\u00eda","days-format-wide":"domingo lunes martes mi\u00e9rcoles jueves viernes s\u00e1bado".split(" "),"field-zone":"zona horaria",
|
||||
"months-standAlone-narrow":"EFMAMJJASOND".split(""),"dateFormatItem-y":"y","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-year-relative+-1":"el a\u00f1o pasado","field-month-relative+-1":"el mes pasado","dateTimeFormats-appendItem-Year":"{1} {0}","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-abbr":"dom. lun. mar. mi\u00e9. jue. vie. s\u00e1b.".split(" "),eraNames:["antes de Cristo","anno D\u00f3mini"],"dateFormatItem-yMMMd":"d 'de' MMM 'de' y",
|
||||
"days-format-narrow":"DLMXJVS".split(""),"field-month":"mes","days-standAlone-narrow":"DLMXJVS".split(""),"dateFormatItem-MMM":"LLL","field-tue-relative+0":"este martes","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","field-tue-relative+1":"el pr\u00f3ximo martes","dayPeriods-format-wide-am":"a. m.","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-EHm":"E, H:mm","field-mon-relative+0":"este lunes","field-mon-relative+1":"el pr\u00f3ximo lunes",
|
||||
"dateFormat-short":"d/M/yy","dateFormatItem-MMd":"d/M","dateFormatItem-EHms":"E, H:mm:ss","dateFormatItem-Ehms":"E, h:mm:ss a","dayPeriods-format-narrow-noon":"n","field-second":"segundo","field-sat-relative+-1":"el s\u00e1bado pasado","dateFormatItem-yMMMEd":"EEE, d 'de' MMMM 'de' y","field-sun-relative+-1":"el domingo pasado","field-month-relative+0":"este mes","field-month-relative+1":"el pr\u00f3ximo mes","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormatItem-Ed":"E d","field-week":"semana",
|
||||
"dateFormat-medium":"d/M/y","field-week-relative+-1":"la semana pasada","field-year-relative+0":"este a\u00f1o","field-year-relative+1":"el pr\u00f3ximo a\u00f1o","dayPeriods-format-narrow-pm":"p.m.","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"H:mm:ss","dateFormatItem-hms":"h:mm:ss a","dateFormatItem-GyMMM":"MMM 'de' y G","field-mon-relative+-1":"el lunes pasado","field-week-relative+0":"esta semana","field-week-relative+1":"la pr\u00f3xima semana"},"dijit/nls/loading":{_localized:{},loadingState:"Cargando...",
|
||||
errorState:"Lo siento, se ha producido un error"},"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},"decimalFormat-short":"000B","currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"#,##0.00\u00a0\u00a4",
|
||||
"currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:".",percentFormat:"#,##0%","decimalFormat-long":"000 billones",decimalFormat:"#,##0.###",decimal:",","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"Opciones anteriores",_localized:{},nextMessage:"M\u00e1s opciones"},"dijit/nls/common":{buttonOk:"Aceptar",buttonCancel:"Cancelar",_localized:{},buttonSave:"Guardar",itemClose:"Cerrar"}});
|
||||
//# sourceMappingURL=dojo_es-es.js.map
|
||||
17
Server/www/spiderbasic/dojo/nls/dojo_fi-fi.js
Normal file
@ -0,0 +1,17 @@
|
||||
//>>built
|
||||
define("dojo/nls/dojo_fi-fi",{"dijit/form/nls/validate":{invalidMessage:"Annettu arvo ei kelpaa.",rangeMessage:"T\u00e4m\u00e4 arvo on sallitun alueen ulkopuolella.",_localized:{},missingMessage:"T\u00e4m\u00e4 arvo on pakollinen."},"dojo/cldr/nls/gregorian":{"dateFormatItem-Ehm":"E h.mm a","days-standAlone-short":"su ma ti ke to pe la".split(" "),"months-format-narrow":"THMHTKHESLMJ".split(""),"field-second-relative+0":"nyt","quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"viikonp\u00e4iv\u00e4",
|
||||
"dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"E d.M.y","field-wed-relative+0":"t\u00e4n\u00e4 keskiviikkona","field-wed-relative+1":"ensi keskiviikkona","dateFormatItem-GyMMMEd":"E d. MMM y G","dateFormatItem-MMMEd":"ccc d. MMM",eraNarrow:["eK","jK"],"dateFormatItem-yMM":"M.y","field-tue-relative+-1":"viime tiistaina","days-format-short":"su ma ti ke to pe la".split(" "),"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"d. MMMM y","field-fri-relative+-1":"viime perjantaina",
|
||||
"field-wed-relative+-1":"viime keskiviikkona","months-format-wide":"tammikuuta helmikuuta maaliskuuta huhtikuuta toukokuuta kes\u00e4kuuta hein\u00e4kuuta elokuuta syyskuuta lokakuuta marraskuuta joulukuuta".split(" "),"dateTimeFormat-medium":"{1} {0}","dayPeriods-format-wide-pm":"ip.","dateFormat-full":"cccc d. MMMM y","field-thu-relative+-1":"viime torstaina","dateFormatItem-Md":"d.M.","dayPeriods-standAlone-wide-pm":"ip.",_localized:{},"dayPeriods-format-abbr-am":"ap.","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})",
|
||||
"dayPeriods-format-wide-noon":"noon","dateFormatItem-yMd":"d.M.y","field-era":"aikakausi","dateFormatItem-yM":"L.y","months-standAlone-wide":"tammikuu helmikuu maaliskuu huhtikuu toukokuu kes\u00e4kuu hein\u00e4kuu elokuu syyskuu lokakuu marraskuu joulukuu".split(" "),"timeFormat-short":"H.mm","quarters-format-wide":["1. nelj\u00e4nnes","2. nelj\u00e4nnes","3. nelj\u00e4nnes","4. nelj\u00e4nnes"],"dateFormatItem-yQQQQ":"QQQQ y","timeFormat-long":"H.mm.ss z","field-year":"vuosi","dateFormatItem-yMMM":"LLL y",
|
||||
"dateTimeFormats-appendItem-Era":"{1} {0}","field-hour":"tunti","months-format-abbr":"tammikuuta helmikuuta maaliskuuta huhtikuuta toukokuuta kes\u00e4kuuta hein\u00e4kuuta elokuuta syyskuuta lokakuuta marraskuuta joulukuuta".split(" "),"field-sat-relative+0":"t\u00e4n\u00e4 lauantaina","field-sat-relative+1":"ensi lauantaina","timeFormat-full":"H.mm.ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-day-relative+0":"t\u00e4n\u00e4\u00e4n","field-thu-relative+0":"t\u00e4n\u00e4 torstaina",
|
||||
"field-day-relative+1":"huomenna","field-thu-relative+1":"ensi torstaina","dateFormatItem-GyMMMd":"d. MMM y G","field-day-relative+2":"ylihuomenna","dateFormatItem-H":"H","months-standAlone-abbr":"tammi helmi maalis huhti touko kes\u00e4 hein\u00e4 elo syys loka marras joulu".split(" "),"quarters-format-abbr":["1. nelj.","2. nelj.","3. nelj.","4. nelj."],"quarters-standAlone-wide":["1. nelj\u00e4nnes","2. nelj\u00e4nnes","3. nelj\u00e4nnes","4. nelj\u00e4nnes"],"dateFormatItem-Gy":"y G","dateFormatItem-M":"L",
|
||||
"days-standAlone-wide":"sunnuntai maanantai tiistai keskiviikko torstai perjantai lauantai".split(" "),"dayPeriods-format-abbr-noon":"noon","timeFormat-medium":"H.mm.ss","field-sun-relative+0":"t\u00e4n\u00e4 sunnuntaina","dateFormatItem-Hm":"H.mm","field-sun-relative+1":"ensi sunnuntaina","quarters-standAlone-abbr":["1. nelj.","2. nelj.","3. nelj.","4. nelj."],eraAbbr:["eKr.","jKr."],"field-minute":"minuutti","field-dayperiod":"vuorokaudenaika","days-standAlone-abbr":"su ma ti ke to pe la".split(" "),
|
||||
"dateFormatItem-d":"d","dateFormatItem-ms":"m.ss","quarters-format-narrow":["1","2","3","4"],"field-day-relative+-1":"eilen","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"ap.","dateFormatItem-h":"h a","field-day-relative+-2":"toissap\u00e4iv\u00e4n\u00e4","dateFormatItem-MMMd":"d. MMM","dateFormatItem-MEd":"E d.M.","dateTimeFormat-full":"{1} {0}","field-fri-relative+0":"t\u00e4n\u00e4 perjantaina","field-fri-relative+1":"ensi perjantaina","dateFormatItem-yMMMM":"LLLL y","field-day":"p\u00e4iv\u00e4",
|
||||
"dateFormatItem-yMMMMccccd":"cccc d. MMMM y","days-format-wide":"sunnuntaina maanantaina tiistaina keskiviikkona torstaina perjantaina lauantaina".split(" "),"field-zone":"aikavy\u00f6hyke","months-standAlone-narrow":"THMHTKHESLMJ".split(""),"dateFormatItem-y":"y","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-year-relative+-1":"viime vuonna","field-month-relative+-1":"viime kuussa","dateTimeFormats-appendItem-Year":"{1} {0}","dateFormatItem-hm":"h.mm a","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})",
|
||||
"dayPeriods-format-abbr-pm":"ip.","days-format-abbr":"su ma ti ke to pe la".split(" "),eraNames:["ennen Kristuksen syntym\u00e4\u00e4","j\u00e4lkeen Kristuksen syntym\u00e4n"],"dateFormatItem-yMMMd":"d. MMM y","days-format-narrow":"SMTKTPL".split(""),"field-month":"kuukausi","days-standAlone-narrow":"SMTKTPL".split(""),"dateFormatItem-MMM":"LLL","field-tue-relative+0":"t\u00e4n\u00e4 tiistaina","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","field-tue-relative+1":"ensi tiistaina","dayPeriods-format-wide-am":"ap.",
|
||||
"dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dayPeriods-standAlone-wide-am":"ap.","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-EHm":"E H.mm","field-mon-relative+0":"t\u00e4n\u00e4 maanantaina","field-mon-relative+1":"ensi maanantaina","dateFormat-short":"d.M.y","dateFormatItem-EHms":"E H.mm.ss","dateFormatItem-Ehms":"E h.mm.ss a","dayPeriods-format-narrow-noon":"n","field-second":"sekunti","field-sat-relative+-1":"viime lauantaina","dateFormatItem-yMMMEd":"E d. MMM y",
|
||||
"field-sun-relative+-1":"viime sunnuntaina","field-month-relative+0":"t\u00e4ss\u00e4 kuussa","field-month-relative+1":"ensi kuussa","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormatItem-Ed":"E d.","field-week":"viikko","dateFormat-medium":"d.M.y","field-week-relative+-1":"viime viikolla","field-year-relative+0":"t\u00e4n\u00e4 vuonna","field-year-relative+1":"ensi vuonna","dayPeriods-format-narrow-pm":"ip.","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"H.mm.ss","dateFormatItem-hms":"h.mm.ss a",
|
||||
"dateFormatItem-GyMMM":"LLL y G","field-mon-relative+-1":"viime maanantaina","field-week-relative+0":"t\u00e4ll\u00e4 viikolla","field-week-relative+1":"ensi viikolla"},"dijit/nls/loading":{_localized:{},loadingState:"Lataus on meneill\u00e4\u00e4n...",errorState:"On ilmennyt virhe."},"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"\u2212","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",
|
||||
_localized:{},"decimalFormat-short":"000\u00a0bilj'.'","currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"ep\u00e4luku",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"#,##0.00\u00a0\u00a4","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:"\u00a0",percentFormat:"#,##0\u00a0%","decimalFormat-long":"000 biljoonaa",decimalFormat:"#,##0.###",decimal:",","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},
|
||||
"dijit/form/nls/ComboBox":{previousMessage:"Edelliset valinnat",_localized:{},nextMessage:"Lis\u00e4\u00e4 valintoja"},"dijit/nls/common":{buttonOk:"OK",buttonCancel:"Peruuta",_localized:{},buttonSave:"Tallenna",itemClose:"Sulje"}});
|
||||
//# sourceMappingURL=dojo_fi-fi.js.map
|
||||
16
Server/www/spiderbasic/dojo/nls/dojo_fr-fr.js
Normal file
@ -0,0 +1,16 @@
|
||||
//>>built
|
||||
define("dojo/nls/dojo_fr-fr",{"dijit/form/nls/validate":{invalidMessage:"La valeur indiqu\u00e9e n'est pas correcte.",rangeMessage:"Cette valeur n'est pas comprise dans la plage autoris\u00e9e.",_localized:{},missingMessage:"Cette valeur est requise."},"dojo/cldr/nls/gregorian":{"dateFormatItem-Ehm":"E h:mm a","days-standAlone-short":"dim. lun. mar. mer. jeu. ven. sam.".split(" "),"months-format-narrow":"JFMAMJJASOND".split(""),"field-second-relative+0":"maintenant","quarters-standAlone-narrow":["1",
|
||||
"2","3","4"],"field-weekday":"jour de la semaine","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"E d/M/y","field-wed-relative+0":"ce mercredi","field-wed-relative+1":"mercredi prochain","dateFormatItem-GyMMMEd":"E d MMM y G","dateFormatItem-MMMEd":"E d MMM",eraNarrow:["av. J.-C.","ap. J.-C."],"field-tue-relative+-1":"mardi dernier","dayPeriods-format-wide-morning":"matin","days-format-short":"di lu ma me je ve sa".split(" "),"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"d MMMM y",
|
||||
"field-fri-relative+-1":"vendredi dernier","field-wed-relative+-1":"mercredi dernier","months-format-wide":"janvier f\u00e9vrier mars avril mai juin juillet ao\u00fbt septembre octobre novembre d\u00e9cembre".split(" "),"dateTimeFormat-medium":"{1} {0}","dayPeriods-format-wide-pm":"PM","dateFormat-full":"EEEE d MMMM y","field-thu-relative+-1":"jeudi dernier","dateFormatItem-Md":"d/M",_localized:{},"dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dayPeriods-format-wide-noon":"midi",
|
||||
"dateFormatItem-yMd":"d/M/y","field-era":"\u00e8re","dateFormatItem-yM":"M/y","months-standAlone-wide":"janvier f\u00e9vrier mars avril mai juin juillet ao\u00fbt septembre octobre novembre d\u00e9cembre".split(" "),"timeFormat-short":"HH:mm","quarters-format-wide":["1er trimestre","2e trimestre","3e trimestre","4e trimestre"],"dateFormatItem-yQQQQ":"QQQQ y","timeFormat-long":"HH:mm:ss z","field-year":"ann\u00e9e","dateFormatItem-yMMM":"MMM y","dateTimeFormats-appendItem-Era":"{1} {0}","field-hour":"heure",
|
||||
"months-format-abbr":"janv. f\u00e9vr. mars avr. mai juin juil. ao\u00fbt sept. oct. nov. d\u00e9c.".split(" "),"field-sat-relative+0":"ce samedi","field-sat-relative+1":"samedi prochain","timeFormat-full":"HH:mm:ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-day-relative+0":"aujourd\u2019hui","dayPeriods-format-narrow-morning":"matin","field-thu-relative+0":"ce jeudi","field-day-relative+1":"demain","field-thu-relative+1":"jeudi prochain","dateFormatItem-GyMMMd":"d MMM y G","field-day-relative+2":"apr\u00e8s-demain",
|
||||
"dateFormatItem-H":"HH 'h'","months-standAlone-abbr":"janv. f\u00e9vr. mars avr. mai juin juil. ao\u00fbt sept. oct. nov. d\u00e9c.".split(" "),"quarters-format-abbr":["T1","T2","T3","T4"],"quarters-standAlone-wide":["1er trimestre","2e trimestre","3e trimestre","4e trimestre"],"dateFormatItem-Gy":"y G","dateFormatItem-M":"L","days-standAlone-wide":"dimanche lundi mardi mercredi jeudi vendredi samedi".split(" "),"dayPeriods-format-abbr-noon":"noon","timeFormat-medium":"HH:mm:ss","field-sun-relative+0":"ce dimanche",
|
||||
"dateFormatItem-Hm":"HH:mm","field-sun-relative+1":"dimanche prochain","quarters-standAlone-abbr":["T1","T2","T3","T4"],eraAbbr:["av. J.-C.","ap. J.-C."],"field-minute":"minute","field-dayperiod":"cadran","days-standAlone-abbr":"dim. lun. mar. mer. jeu. ven. sam.".split(" "),"dayPeriods-format-wide-night":"soir","dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"field-day-relative+-1":"hier","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"a",
|
||||
"dateFormatItem-h":"h a","field-day-relative+-2":"avant-hier","dateFormatItem-MMMd":"d MMM","dateFormatItem-MEd":"E d/M","dateTimeFormat-full":"{1} {0}","field-fri-relative+0":"ce vendredi","field-fri-relative+1":"vendredi prochain","dateFormatItem-yMMMM":"MMMM y","field-day":"jour","days-format-wide":"dimanche lundi mardi mercredi jeudi vendredi samedi".split(" "),"field-zone":"fuseau horaire","months-standAlone-narrow":"JFMAMJJASOND".split(""),"dateFormatItem-y":"y","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})",
|
||||
"field-year-relative+-1":"l\u2019ann\u00e9e derni\u00e8re","dayPeriods-format-narrow-night":"soir","field-month-relative+-1":"le mois dernier","dateTimeFormats-appendItem-Year":"{1} {0}","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-abbr":"dim. lun. mar. mer. jeu. ven. sam.".split(" "),eraNames:["avant J\u00e9sus-Christ","apr\u00e8s J\u00e9sus-Christ"],"dateFormatItem-yMMMd":"d MMM y","days-format-narrow":"DLMMJVS".split(""),
|
||||
"field-month":"mois","days-standAlone-narrow":"DLMMJVS".split(""),"dateFormatItem-MMM":"LLL","field-tue-relative+0":"ce mardi","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","field-tue-relative+1":"mardi prochain","dayPeriods-format-wide-am":"AM","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-EHm":"E HH:mm","field-mon-relative+0":"ce lundi","field-mon-relative+1":"lundi prochain","dateFormat-short":"dd/MM/y","dayPeriods-format-wide-afternoon":"apr\u00e8s-midi",
|
||||
"dateFormatItem-EHms":"E HH:mm:ss","dateFormatItem-Ehms":"E h:mm:ss a","dayPeriods-format-narrow-noon":"midi","field-second":"seconde","field-sat-relative+-1":"samedi dernier","dateFormatItem-yMMMEd":"E d MMM y","field-sun-relative+-1":"dimanche dernier","field-month-relative+0":"ce mois-ci","field-month-relative+1":"le mois prochain","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormatItem-Ed":"E d","field-week":"semaine","dateFormat-medium":"d MMM y","field-week-relative+-1":"la semaine derni\u00e8re",
|
||||
"field-year-relative+0":"cette ann\u00e9e","field-year-relative+1":"l\u2019ann\u00e9e prochaine","dayPeriods-format-narrow-pm":"p","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a","dateFormatItem-GyMMM":"MMM y G","field-mon-relative+-1":"lundi dernier","field-week-relative+0":"cette semaine","field-week-relative+1":"la semaine prochaine"},"dijit/nls/loading":{_localized:{},loadingState:"Chargement...",errorState:"Une erreur est survenue"},"dojo/cldr/nls/number":{scientificFormat:"#E0",
|
||||
"currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},"decimalFormat-short":"000\u00a0Bn","currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"#,##0.00\u00a0\u00a4;(#,##0.00\u00a0\u00a4)","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",
|
||||
perMille:"\u2030",group:"\u00a0",percentFormat:"#,##0\u00a0%","decimalFormat-long":"000 billions",decimalFormat:"#,##0.###",decimal:",","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"Choix pr\u00e9c\u00e9dents",_localized:{},nextMessage:"Plus de choix"},"dijit/nls/common":{buttonOk:"OK",buttonCancel:"Annuler",_localized:{},buttonSave:"Enregistrer",itemClose:"Fermer"}});
|
||||
//# sourceMappingURL=dojo_fr-fr.js.map
|
||||
25
Server/www/spiderbasic/dojo/nls/dojo_he-il.js
Normal file
@ -0,0 +1,25 @@
|
||||
//>>built
|
||||
define("dojo/nls/dojo_he-il",{"dijit/form/nls/validate":{invalidMessage:"\u05d4\u05e2\u05e8\u05da \u05e9\u05e6\u05d5\u05d9\u05df \u05d0\u05d9\u05e0\u05d5 \u05d7\u05d5\u05e7\u05d9.",rangeMessage:"\u05d4\u05e2\u05e8\u05da \u05de\u05d7\u05d5\u05e5 \u05dc\u05d8\u05d5\u05d5\u05d7.",_localized:{},missingMessage:"\u05d6\u05d4\u05d5 \u05e2\u05e8\u05da \u05d3\u05e8\u05d5\u05e9."},"dojo/cldr/nls/gregorian":{"dateFormatItem-Ehm":"E h:mm a","days-standAlone-short":"\u05d0\u05f3 \u05d1\u05f3 \u05d2\u05f3 \u05d3\u05f3 \u05d4\u05f3 \u05d5\u05f3 \u05e9\u05f3".split(" "),
|
||||
"months-format-narrow":"1 2 3 4 5 6 7 8 9 10 11 12".split(" "),"field-second-relative+0":"\u05e2\u05db\u05e9\u05d9\u05d5","quarters-standAlone-narrow":["\u05e81","\u05e82","\u05e83","\u05e84"],"field-weekday":"\u05d9\u05d5\u05dd \u05d1\u05e9\u05d1\u05d5\u05e2","dateFormatItem-yQQQ":"y QQQ","dateFormatItem-yMEd":"E, d/M/y","field-wed-relative+0":"\u05d9\u05d5\u05dd \u05e8\u05d1\u05d9\u05e2\u05d9","field-wed-relative+1":"\u05d9\u05d5\u05dd \u05e8\u05d1\u05d9\u05e2\u05d9 \u05d4\u05d1\u05d0","dateFormatItem-GyMMMEd":"E, d \u05d1MMM y G",
|
||||
"dateFormatItem-MMMEd":"E, d \u05d1MMM",eraNarrow:["\u05dc\u05e4\u05e0\u05d4\u05f4\u05e1","BCE","\u05dc\u05e1\u05d4\u05f4\u05e0","CE"],"dateFormatItem-yMM":"MM/y","field-tue-relative+-1":"\u05d9\u05d5\u05dd \u05e9\u05dc\u05d9\u05e9\u05d9 \u05e9\u05e2\u05d1\u05e8","days-format-short":"\u05d0\u05f3 \u05d1\u05f3 \u05d2\u05f3 \u05d3\u05f3 \u05d4\u05f3 \u05d5\u05f3 \u05e9\u05f3".split(" "),"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"d \u05d1MMMM y","field-fri-relative+-1":"\u05d9\u05d5\u05dd \u05e9\u05d9\u05e9\u05d9 \u05e9\u05e2\u05d1\u05e8",
|
||||
"field-wed-relative+-1":"\u05d9\u05d5\u05dd \u05e8\u05d1\u05d9\u05e2\u05d9 \u05e9\u05e2\u05d1\u05e8","months-format-wide":"\u05d9\u05e0\u05d5\u05d0\u05e8 \u05e4\u05d1\u05e8\u05d5\u05d0\u05e8 \u05de\u05e8\u05e5 \u05d0\u05e4\u05e8\u05d9\u05dc \u05de\u05d0\u05d9 \u05d9\u05d5\u05e0\u05d9 \u05d9\u05d5\u05dc\u05d9 \u05d0\u05d5\u05d2\u05d5\u05e1\u05d8 \u05e1\u05e4\u05d8\u05de\u05d1\u05e8 \u05d0\u05d5\u05e7\u05d8\u05d5\u05d1\u05e8 \u05e0\u05d5\u05d1\u05de\u05d1\u05e8 \u05d3\u05e6\u05de\u05d1\u05e8".split(" "),
|
||||
"dateTimeFormat-medium":"{1}, {0}","dayPeriods-format-wide-pm":"\u05d0\u05d7\u05d4\u05f4\u05e6","dateFormat-full":"EEEE, d \u05d1MMMM y","field-thu-relative+-1":"\u05d9\u05d5\u05dd \u05d7\u05de\u05d9\u05e9\u05d9 \u05e9\u05e2\u05d1\u05e8","dateFormatItem-Md":"d/M",_localized:{},"dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dayPeriods-format-wide-noon":"noon","dateFormatItem-yMd":"d.M.y","field-era":"\u05ea\u05e7\u05d5\u05e4\u05d4","dateFormatItem-yM":"M.y",
|
||||
"months-standAlone-wide":"\u05d9\u05e0\u05d5\u05d0\u05e8 \u05e4\u05d1\u05e8\u05d5\u05d0\u05e8 \u05de\u05e8\u05e5 \u05d0\u05e4\u05e8\u05d9\u05dc \u05de\u05d0\u05d9 \u05d9\u05d5\u05e0\u05d9 \u05d9\u05d5\u05dc\u05d9 \u05d0\u05d5\u05d2\u05d5\u05e1\u05d8 \u05e1\u05e4\u05d8\u05de\u05d1\u05e8 \u05d0\u05d5\u05e7\u05d8\u05d5\u05d1\u05e8 \u05e0\u05d5\u05d1\u05de\u05d1\u05e8 \u05d3\u05e6\u05de\u05d1\u05e8".split(" "),"timeFormat-short":"HH:mm","quarters-format-wide":["\u05e8\u05d1\u05e2\u05d5\u05df 1","\u05e8\u05d1\u05e2\u05d5\u05df 2",
|
||||
"\u05e8\u05d1\u05e2\u05d5\u05df 3","\u05e8\u05d1\u05e2\u05d5\u05df 4"],"dateFormatItem-yQQQQ":"y QQQQ","timeFormat-long":"HH:mm:ss z","field-year":"\u05e9\u05e0\u05d4","dateFormatItem-yMMM":"MMM y","dateTimeFormats-appendItem-Era":"{1} {0}","field-hour":"\u05e9\u05e2\u05d4","months-format-abbr":"\u05d9\u05e0\u05d5\u05f3 \u05e4\u05d1\u05e8\u05f3 \u05de\u05e8\u05e5 \u05d0\u05e4\u05e8\u05f3 \u05de\u05d0\u05d9 \u05d9\u05d5\u05e0\u05d9 \u05d9\u05d5\u05dc\u05d9 \u05d0\u05d5\u05d2\u05f3 \u05e1\u05e4\u05d8\u05f3 \u05d0\u05d5\u05e7\u05f3 \u05e0\u05d5\u05d1\u05f3 \u05d3\u05e6\u05de\u05f3".split(" "),
|
||||
"field-sat-relative+0":"\u05d4\u05e9\u05d1\u05ea \u05d4\u05d6\u05d0\u05ea","field-sat-relative+1":"\u05d4\u05e9\u05d1\u05ea \u05d4\u05d1\u05d0\u05d4","timeFormat-full":"HH:mm:ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-day-relative+0":"\u05d4\u05d9\u05d5\u05dd","field-thu-relative+0":"\u05d9\u05d5\u05dd \u05d7\u05de\u05d9\u05e9\u05d9","field-day-relative+1":"\u05de\u05d7\u05e8","field-thu-relative+1":"\u05d9\u05d5\u05dd \u05d7\u05de\u05d9\u05e9\u05d9 \u05d4\u05d1\u05d0","dateFormatItem-GyMMMd":"d \u05d1MMM y G",
|
||||
"field-day-relative+2":"\u05de\u05d7\u05e8\u05ea\u05d9\u05d9\u05dd","dateFormatItem-H":"HH","months-standAlone-abbr":"\u05d9\u05e0\u05d5\u05f3 \u05e4\u05d1\u05e8\u05f3 \u05de\u05e8\u05e5 \u05d0\u05e4\u05e8\u05f3 \u05de\u05d0\u05d9 \u05d9\u05d5\u05e0\u05d9 \u05d9\u05d5\u05dc\u05d9 \u05d0\u05d5\u05d2\u05f3 \u05e1\u05e4\u05d8\u05f3 \u05d0\u05d5\u05e7\u05f3 \u05e0\u05d5\u05d1\u05f3 \u05d3\u05e6\u05de\u05f3".split(" "),"quarters-format-abbr":["\u05e8\u05d1\u05e2\u05d5\u05df 1","\u05e8\u05d1\u05e2\u05d5\u05df 2",
|
||||
"\u05e8\u05d1\u05e2\u05d5\u05df 3","\u05e8\u05d1\u05e2\u05d5\u05df 4"],"quarters-standAlone-wide":["\u05e8\u05d1\u05e2\u05d5\u05df 1","\u05e8\u05d1\u05e2\u05d5\u05df 2","\u05e8\u05d1\u05e2\u05d5\u05df 3","\u05e8\u05d1\u05e2\u05d5\u05df 4"],"dateFormatItem-Gy":"y G","dateFormatItem-M":"L","days-standAlone-wide":"\u05d9\u05d5\u05dd \u05e8\u05d0\u05e9\u05d5\u05df;\u05d9\u05d5\u05dd \u05e9\u05e0\u05d9;\u05d9\u05d5\u05dd \u05e9\u05dc\u05d9\u05e9\u05d9;\u05d9\u05d5\u05dd \u05e8\u05d1\u05d9\u05e2\u05d9;\u05d9\u05d5\u05dd \u05d7\u05de\u05d9\u05e9\u05d9;\u05d9\u05d5\u05dd \u05e9\u05d9\u05e9\u05d9;\u05d9\u05d5\u05dd \u05e9\u05d1\u05ea".split(";"),
|
||||
"dayPeriods-format-abbr-noon":"noon","timeFormat-medium":"HH:mm:ss","field-sun-relative+0":"\u05d9\u05d5\u05dd \u05e8\u05d0\u05e9\u05d5\u05df","dateFormatItem-Hm":"HH:mm","field-sun-relative+1":"\u05d9\u05d5\u05dd \u05e8\u05d0\u05e9\u05d5\u05df \u05d4\u05d1\u05d0","quarters-standAlone-abbr":["\u05e8\u05d1\u05e2\u05d5\u05df 1","\u05e8\u05d1\u05e2\u05d5\u05df 2","\u05e8\u05d1\u05e2\u05d5\u05df 3","\u05e8\u05d1\u05e2\u05d5\u05df 4"],eraAbbr:["\u05dc\u05e4\u05e0\u05d4\u05f4\u05e1","BCE","\u05dc\u05e1\u05d4\u05f4\u05e0",
|
||||
"CE"],"field-minute":"\u05d3\u05e7\u05d4","field-dayperiod":"\u05dc\u05e4\u05e0\u05d4\u05f4\u05e6/\u05d0\u05d7\u05d4\u05f4\u05e6","days-standAlone-abbr":"\u05d9\u05d5\u05dd \u05d0\u05f3;\u05d9\u05d5\u05dd \u05d1\u05f3;\u05d9\u05d5\u05dd \u05d2\u05f3;\u05d9\u05d5\u05dd \u05d3\u05f3;\u05d9\u05d5\u05dd \u05d4\u05f3;\u05d9\u05d5\u05dd \u05d5\u05f3;\u05e9\u05d1\u05ea".split(";"),"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"field-day-relative+-1":"\u05d0\u05ea\u05de\u05d5\u05dc",
|
||||
"dateTimeFormat-long":"{1} \u05d1\u05e9\u05e2\u05d4 {0}","dayPeriods-format-narrow-am":"a","dateFormatItem-h":"h a","field-day-relative+-2":"\u05e9\u05dc\u05e9\u05d5\u05dd","dateFormatItem-MMMd":"d \u05d1MMM","dateFormatItem-MEd":"E, d/M","dateTimeFormat-full":"{1} \u05d1\u05e9\u05e2\u05d4 {0}","field-fri-relative+0":"\u05d9\u05d5\u05dd \u05e9\u05d9\u05e9\u05d9","field-fri-relative+1":"\u05d9\u05d5\u05dd \u05e9\u05d9\u05e9\u05d9 \u05d4\u05d1\u05d0","dateFormatItem-yMMMM":"MMMM y","field-day":"\u05d9\u05d5\u05dd",
|
||||
"days-format-wide":"\u05d9\u05d5\u05dd \u05e8\u05d0\u05e9\u05d5\u05df;\u05d9\u05d5\u05dd \u05e9\u05e0\u05d9;\u05d9\u05d5\u05dd \u05e9\u05dc\u05d9\u05e9\u05d9;\u05d9\u05d5\u05dd \u05e8\u05d1\u05d9\u05e2\u05d9;\u05d9\u05d5\u05dd \u05d7\u05de\u05d9\u05e9\u05d9;\u05d9\u05d5\u05dd \u05e9\u05d9\u05e9\u05d9;\u05d9\u05d5\u05dd \u05e9\u05d1\u05ea".split(";"),"field-zone":"\u05d0\u05d6\u05d5\u05e8","months-standAlone-narrow":"1 2 3 4 5 6 7 8 9 10 11 12".split(" "),"dateFormatItem-y":"y","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})",
|
||||
"field-year-relative+-1":"\u05d4\u05e9\u05e0\u05d4 \u05e9\u05e2\u05d1\u05e8\u05d4","field-month-relative+-1":"\u05d4\u05d7\u05d5\u05d3\u05e9 \u05e9\u05e2\u05d1\u05e8","dateTimeFormats-appendItem-Year":"{1} {0}","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-abbr":"\u05d9\u05d5\u05dd \u05d0\u05f3;\u05d9\u05d5\u05dd \u05d1\u05f3;\u05d9\u05d5\u05dd \u05d2\u05f3;\u05d9\u05d5\u05dd \u05d3\u05f3;\u05d9\u05d5\u05dd \u05d4\u05f3;\u05d9\u05d5\u05dd \u05d5\u05f3;\u05e9\u05d1\u05ea".split(";"),
|
||||
eraNames:["\u05dc\u05e4\u05e0\u05d9 \u05d4\u05e1\u05e4\u05d9\u05e8\u05d4","\u05dc\u05e1\u05e4\u05d9\u05e8\u05d4","\u05dc\u05e1\u05d4\u05f4\u05e0","CE"],"dateFormatItem-yMMMd":"d \u05d1MMM y","days-format-narrow":"\u05d0\u05f3 \u05d1\u05f3 \u05d2\u05f3 \u05d3\u05f3 \u05d4\u05f3 \u05d5\u05f3 \u05e9\u05f3".split(" "),"field-month":"\u05d7\u05d5\u05d3\u05e9","days-standAlone-narrow":"\u05d0\u05f3 \u05d1\u05f3 \u05d2\u05f3 \u05d3\u05f3 \u05d4\u05f3 \u05d5\u05f3 \u05e9\u05f3".split(" "),"dateFormatItem-MMM":"LLL",
|
||||
"field-tue-relative+0":"\u05d9\u05d5\u05dd \u05e9\u05dc\u05d9\u05e9\u05d9","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","field-tue-relative+1":"\u05d9\u05d5\u05dd \u05e9\u05dc\u05d9\u05e9\u05d9 \u05d4\u05d1\u05d0","dayPeriods-format-wide-am":"\u05dc\u05e4\u05e0\u05d4\u05f4\u05e6","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-EHm":"E H:mm","field-mon-relative+0":"\u05d9\u05d5\u05dd \u05e9\u05e0\u05d9 \u05d4\u05d6\u05d4",
|
||||
"field-mon-relative+1":"\u05d9\u05d5\u05dd \u05e9\u05e0\u05d9 \u05d4\u05d1\u05d0","dateFormat-short":"dd/MM/yy","dateFormatItem-EHms":"E H:mm:ss","dateFormatItem-Ehms":"E h:mm:ss a","dayPeriods-format-narrow-noon":"n","field-second":"\u05e9\u05e0\u05d9\u05d9\u05d4","field-sat-relative+-1":"\u05d4\u05e9\u05d1\u05ea \u05e9\u05e2\u05d1\u05e8\u05d4","dateFormatItem-yMMMEd":"E, d \u05d1MMM y","field-sun-relative+-1":"\u05d9\u05d5\u05dd \u05e8\u05d0\u05e9\u05d5\u05df \u05e9\u05e2\u05d1\u05e8","field-month-relative+0":"\u05d4\u05d7\u05d5\u05d3\u05e9",
|
||||
"field-month-relative+1":"\u05d4\u05d7\u05d5\u05d3\u05e9 \u05d4\u05d1\u05d0","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormatItem-Ed":"E \u05d4-d","field-week":"\u05e9\u05d1\u05d5\u05e2","dateFormat-medium":"d \u05d1MMM y","field-week-relative+-1":"\u05d4\u05e9\u05d1\u05d5\u05e2 \u05e9\u05e2\u05d1\u05e8","field-year-relative+0":"\u05d4\u05e9\u05e0\u05d4","field-year-relative+1":"\u05d4\u05e9\u05e0\u05d4 \u05d4\u05d1\u05d0\u05d4","dayPeriods-format-narrow-pm":"p","dateTimeFormat-short":"{1}, {0}",
|
||||
"dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a","dateFormatItem-GyMMM":"MMM y G","field-mon-relative+-1":"\u05d9\u05d5\u05dd \u05e9\u05e0\u05d9 \u05e9\u05e2\u05d1\u05e8","field-week-relative+0":"\u05d4\u05e9\u05d1\u05d5\u05e2","field-week-relative+1":"\u05d4\u05e9\u05d1\u05d5\u05e2 \u05d4\u05d1\u05d0"},"dijit/nls/loading":{_localized:{},loadingState:"\u05d8\u05e2\u05d9\u05e0\u05d4...",errorState:"\u05d0\u05d9\u05e8\u05e2\u05d4 \u05e9\u05d2\u05d9\u05d0\u05d4"},"dojo/cldr/nls/number":{scientificFormat:"#E0",
|
||||
"currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},"decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"#,##0.00\u00a0\u00a4","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:",",
|
||||
percentFormat:"#,##0%","decimalFormat-long":"000 \u05d8\u05e8\u05d9\u05dc\u05d9\u05d5\u05df",decimalFormat:"#,##0.###",decimal:".","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"\u05d4\u05d0\u05e4\u05e9\u05e8\u05d5\u05d9\u05d5\u05ea \u05d4\u05e7\u05d5\u05d3\u05de\u05d5\u05ea",_localized:{},nextMessage:"\u05d0\u05e4\u05e9\u05e8\u05d5\u05d9\u05d5\u05ea \u05e0\u05d5\u05e1\u05e4\u05d5\u05ea"},"dijit/nls/common":{buttonOk:"\u05d0\u05d9\u05e9\u05d5\u05e8",
|
||||
buttonCancel:"\u05d1\u05d9\u05d8\u05d5\u05dc",_localized:{},buttonSave:"\u05e9\u05de\u05d9\u05e8\u05d4",itemClose:"\u05e1\u05d2\u05d9\u05e8\u05d4"}});
|
||||
//# sourceMappingURL=dojo_he-il.js.map
|
||||
17
Server/www/spiderbasic/dojo/nls/dojo_hu.js
Normal file
@ -0,0 +1,17 @@
|
||||
//>>built
|
||||
define("dojo/nls/dojo_hu",{"dijit/form/nls/validate":{invalidMessage:"A megadott \u00e9rt\u00e9k \u00e9rv\u00e9nytelen.",rangeMessage:"Az \u00e9rt\u00e9k k\u00edv\u00fcl van a megengedett tartom\u00e1nyon.",_localized:{},missingMessage:"Meg kell adni egy \u00e9rt\u00e9ket."},"dojo/cldr/nls/gregorian":{"dateFormatItem-Ehm":"E h:mm a","days-standAlone-short":"V H K Sze Cs P Szo".split(" "),"months-format-narrow":"J F M \u00c1 M J J A Sz O N D".split(" "),"field-second-relative+0":"most","quarters-standAlone-narrow":["1.",
|
||||
"2.","3.","4."],"field-weekday":"h\u00e9t napja","dateFormatItem-yQQQ":"y. QQQ","dateFormatItem-yMEd":"y. MM. dd., E","field-wed-relative+0":"ez a szerda","field-wed-relative+1":"k\u00f6vetkez\u0151 szerda","dateFormatItem-GyMMMEd":"G y. MMM d., E","dateFormatItem-MMMEd":"MMM d., E",eraNarrow:["ie.","isz."],"field-tue-relative+-1":"el\u0151z\u0151 kedd","days-format-short":"V H K Sze Cs P Szo".split(" "),"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"y. MMMM d.","field-fri-relative+-1":"el\u0151z\u0151 p\u00e9ntek",
|
||||
"field-wed-relative+-1":"el\u0151z\u0151 szerda","months-format-wide":"janu\u00e1r febru\u00e1r m\u00e1rcius \u00e1prilis m\u00e1jus j\u00fanius j\u00falius augusztus szeptember okt\u00f3ber november december".split(" "),"dateTimeFormat-medium":"{1} {0}","dayPeriods-format-wide-pm":"du.","dateFormat-full":"y. MMMM d., EEEE","field-thu-relative+-1":"el\u0151z\u0151 cs\u00fct\u00f6rt\u00f6k","dateFormatItem-Md":"M. d.",_localized:{},"dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})",
|
||||
"dayPeriods-format-wide-noon":"noon","dateFormatItem-yMd":"y. MM. dd.","field-era":"\u00e9ra","dateFormatItem-yM":"y. M.","months-standAlone-wide":"janu\u00e1r febru\u00e1r m\u00e1rcius \u00e1prilis m\u00e1jus j\u00fanius j\u00falius augusztus szeptember okt\u00f3ber november december".split(" "),"timeFormat-short":"H:mm","quarters-format-wide":["I. negyed\u00e9v","II. negyed\u00e9v","III. negyed\u00e9v","IV. negyed\u00e9v"],"dateFormatItem-yQQQQ":"y. QQQQ","timeFormat-long":"H:mm:ss z","field-year":"\u00e9v",
|
||||
"dateFormatItem-yMMM":"y. MMM","dateTimeFormats-appendItem-Era":"{1} {0}","field-hour":"\u00f3ra","months-format-abbr":"jan. febr. m\u00e1rc. \u00e1pr. m\u00e1j. j\u00fan. j\u00fal. aug. szept. okt. nov. dec.".split(" "),"field-sat-relative+0":"ez a szombat","field-sat-relative+1":"k\u00f6vetkez\u0151 szombat","timeFormat-full":"H:mm:ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-day-relative+0":"ma","field-thu-relative+0":"ez a cs\u00fct\u00f6rt\u00f6k","field-day-relative+1":"holnap",
|
||||
"field-thu-relative+1":"k\u00f6vetkez\u0151 cs\u00fct\u00f6rt\u00f6k","dateFormatItem-GyMMMd":"G y. MMM d.","field-day-relative+2":"holnaput\u00e1n","dateFormatItem-H":"H","months-standAlone-abbr":"jan. febr. m\u00e1rc. \u00e1pr. m\u00e1j. j\u00fan. j\u00fal. aug. szept. okt. nov. dec.".split(" "),"quarters-format-abbr":["N1","N2","N3","N4"],"quarters-standAlone-wide":["1. negyed\u00e9v","2. negyed\u00e9v","3. negyed\u00e9v","4. negyed\u00e9v"],"dateFormatItem-Gy":"G y.","dateFormatItem-M":"L","days-standAlone-wide":"vas\u00e1rnap h\u00e9tf\u0151 kedd szerda cs\u00fct\u00f6rt\u00f6k p\u00e9ntek szombat".split(" "),
|
||||
"dateFormatItem-MMMMd":"MMMM d.","dayPeriods-format-abbr-noon":"noon","timeFormat-medium":"H:mm:ss","field-sun-relative+0":"ez a vas\u00e1rnap","dateFormatItem-Hm":"H:mm","field-sun-relative+1":"k\u00f6vetkez\u0151 vas\u00e1rnap","quarters-standAlone-abbr":["N1","N2","N3","N4"],eraAbbr:["i. e.","i. sz."],"field-minute":"perc","field-dayperiod":"napszak","days-standAlone-abbr":"V H K Sze Cs P Szo".split(" "),"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1.","2.","3.",
|
||||
"4."],"field-day-relative+-1":"tegnap","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"de.","dateFormatItem-h":"a h","field-day-relative+-2":"tegnapel\u0151tt","dateFormatItem-MMMd":"MMM d.","dateFormatItem-MEd":"M. d., E","dateTimeFormat-full":"{1} {0}","field-fri-relative+0":"ez a p\u00e9ntek","field-fri-relative+1":"k\u00f6vetkez\u0151 p\u00e9ntek","dateFormatItem-yMMMM":"y. MMMM","field-day":"nap","days-format-wide":"vas\u00e1rnap h\u00e9tf\u0151 kedd szerda cs\u00fct\u00f6rt\u00f6k p\u00e9ntek szombat".split(" "),
|
||||
"field-zone":"id\u0151z\u00f3na","months-standAlone-narrow":"J F M \u00c1 M J J A Sz O N D".split(" "),"dateFormatItem-y":"y.","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-year-relative+-1":"el\u0151z\u0151 \u00e9v","field-month-relative+-1":"el\u0151z\u0151 h\u00f3nap","dateTimeFormats-appendItem-Year":"{1} {0}","dateFormatItem-hm":"a h:mm","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-abbr":"V H K Sze Cs P Szo".split(" "),eraNames:["id\u0151sz\u00e1m\u00edt\u00e1sunk el\u0151tt",
|
||||
"id\u0151sz\u00e1m\u00edt\u00e1sunk szerint"],"dateFormatItem-yMMMd":"y. MMM d.","days-format-narrow":"V H K Sz Cs P Sz".split(" "),"field-month":"h\u00f3nap","days-standAlone-narrow":"V H K Sz Cs P Sz".split(" "),"dateFormatItem-MMM":"LLL","field-tue-relative+0":"ez a kedd","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","field-tue-relative+1":"k\u00f6vetkez\u0151 kedd","dayPeriods-format-wide-am":"de.","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})",
|
||||
"dateFormatItem-EHm":"E HH:mm","field-mon-relative+0":"ez a h\u00e9tf\u0151","field-mon-relative+1":"k\u00f6vetkez\u0151 h\u00e9tf\u0151","dateFormat-short":"y. MM. dd.","dateFormatItem-EHms":"E HH:mm:ss","dateFormatItem-Ehms":"E h:mm:ss a","dayPeriods-format-narrow-noon":"n","field-second":"m\u00e1sodperc","field-sat-relative+-1":"el\u0151z\u0151 szombat","dateFormatItem-yMMMEd":"y. MMM d., E","field-sun-relative+-1":"el\u0151z\u0151 vas\u00e1rnap","field-month-relative+0":"ez a h\u00f3nap","field-month-relative+1":"k\u00f6vetkez\u0151 h\u00f3nap",
|
||||
"dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormatItem-Ed":"d., E","field-week":"h\u00e9t","dateFormat-medium":"y. MMM d.","field-week-relative+-1":"el\u0151z\u0151 h\u00e9t","field-year-relative+0":"ez az \u00e9v","field-year-relative+1":"k\u00f6vetkez\u0151 \u00e9v","dayPeriods-format-narrow-pm":"du.","dateFormatItem-mmss":"mm:ss","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"H:mm:ss","dateFormatItem-hms":"a h:mm:ss","dateFormatItem-GyMMM":"G y. MMM","field-mon-relative+-1":"el\u0151z\u0151 h\u00e9tf\u0151",
|
||||
"field-week-relative+0":"ez a h\u00e9t","field-week-relative+1":"k\u00f6vetkez\u0151 h\u00e9t"},"dijit/nls/loading":{_localized:{},loadingState:"Bet\u00f6lt\u00e9s...",errorState:"Sajn\u00e1lom, hiba t\u00f6rt\u00e9nt"},"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},"decimalFormat-short":"000\u00a0B",
|
||||
"currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"#,##0.00\u00a0\u00a4","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:"\u00a0",percentFormat:"#,##0%","decimalFormat-long":"000 billi\u00f3",decimalFormat:"#,##0.###",decimal:",","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"El\u0151z\u0151 men\u00fcpontok",
|
||||
_localized:{},nextMessage:"Tov\u00e1bbi men\u00fcpontok"},"dijit/nls/common":{buttonOk:"OK",buttonCancel:"M\u00e9gse",_localized:{},buttonSave:"Ment\u00e9s",itemClose:"Bez\u00e1r\u00e1s"}});
|
||||
//# sourceMappingURL=dojo_hu.js.map
|
||||
16
Server/www/spiderbasic/dojo/nls/dojo_it-it.js
Normal file
@ -0,0 +1,16 @@
|
||||
//>>built
|
||||
define("dojo/nls/dojo_it-it",{"dijit/form/nls/validate":{invalidMessage:"Il valore immesso non \u00e8 valido.",rangeMessage:"Questo valore \u00e8 fuori dall'intervallo consentito.",_localized:{},missingMessage:"Questo valore \u00e8 obbligatorio."},"dojo/cldr/nls/gregorian":{"dateFormatItem-Ehm":"E h.mm a","days-standAlone-short":"dom lun mar mer gio ven sab".split(" "),"months-format-narrow":"GFMAMGLASOND".split(""),"field-second-relative+0":"ora","quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"giorno della settimana",
|
||||
"dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"E d/M/y","field-wed-relative+0":"questo mercoled\u00ec","field-wed-relative+1":"mercoled\u00ec prossimo","dateFormatItem-GyMMMEd":"E d MMM y G","dateFormatItem-MMMEd":"E d MMM",eraNarrow:["aC","BCE","dC","CE"],"field-tue-relative+-1":"marted\u00ec scorso","days-format-short":"dom lun mar mer gio ven sab".split(" "),"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"dd MMMM y","field-fri-relative+-1":"venerd\u00ec scorso","field-wed-relative+-1":"mercoled\u00ec scorso",
|
||||
"months-format-wide":"gennaio febbraio marzo aprile maggio giugno luglio agosto settembre ottobre novembre dicembre".split(" "),"dateTimeFormat-medium":"{1} {0}","dayPeriods-format-wide-pm":"PM","dateFormat-full":"EEEE d MMMM y","field-thu-relative+-1":"gioved\u00ec scorso","dateFormatItem-Md":"d/M",_localized:{},"dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dayPeriods-format-wide-noon":"noon","dateFormatItem-yMd":"d/M/y","field-era":"era","dateFormatItem-yM":"M/y",
|
||||
"months-standAlone-wide":"Gennaio Febbraio Marzo Aprile Maggio Giugno Luglio Agosto Settembre Ottobre Novembre Dicembre".split(" "),"timeFormat-short":"HH:mm","quarters-format-wide":["1\u00ba trimestre","2\u00ba trimestre","3\u00ba trimestre","4\u00ba trimestre"],"dateFormatItem-yQQQQ":"QQQQ y","timeFormat-long":"HH:mm:ss z","field-year":"anno","dateFormatItem-yMMM":"MMM y","dateTimeFormats-appendItem-Era":"{1} {0}","field-hour":"ora","months-format-abbr":"gen feb mar apr mag giu lug ago set ott nov dic".split(" "),
|
||||
"field-sat-relative+0":"questo sabato","field-sat-relative+1":"sabato prossimo","timeFormat-full":"HH:mm:ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-day-relative+0":"oggi","field-thu-relative+0":"questo gioved\u00ec","field-day-relative+1":"domani","field-thu-relative+1":"gioved\u00ec prossimo","dateFormatItem-GyMMMd":"d MMM y G","field-day-relative+2":"dopodomani","dateFormatItem-H":"HH","months-standAlone-abbr":"gen feb mar apr mag giu lug ago set ott nov dic".split(" "),
|
||||
"quarters-format-abbr":["T1","T2","T3","T4"],"quarters-standAlone-wide":["Primo trimestre","Secondo trimestre","Terzo trimestre","Quarto trimestre"],"dateFormatItem-Gy":"y G","dateFormatItem-M":"L","days-standAlone-wide":"Domenica Luned\u00ec Marted\u00ec Mercoled\u00ec Gioved\u00ec Venerd\u00ec Sabato".split(" "),"dayPeriods-format-abbr-noon":"noon","timeFormat-medium":"HH:mm:ss","field-sun-relative+0":"questa domenica","dateFormatItem-Hm":"HH:mm","field-sun-relative+1":"domenica prossima","quarters-standAlone-abbr":["T1",
|
||||
"T2","T3","T4"],eraAbbr:["aC","BCE","dC","CE"],"field-minute":"minuto","field-dayperiod":"periodo del giorno","days-standAlone-abbr":"dom lun mar mer gio ven sab".split(" "),"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"field-day-relative+-1":"ieri","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"m.","dateFormatItem-h":"hh a","field-day-relative+-2":"l'altro ieri","dateFormatItem-MMMd":"d MMM","dateFormatItem-MEd":"E d/M","dateTimeFormat-full":"{1} {0}",
|
||||
"field-fri-relative+0":"questo venerd\u00ec","field-fri-relative+1":"venerd\u00ec prossimo","dateFormatItem-yMMMM":"MMMM y","field-day":"giorno","days-format-wide":"domenica luned\u00ec marted\u00ec mercoled\u00ec gioved\u00ec venerd\u00ec sabato".split(" "),"field-zone":"fuso orario","months-standAlone-narrow":"GFMAMGLASOND".split(""),"dateFormatItem-y":"y","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-year-relative+-1":"anno scorso","field-month-relative+-1":"mese scorso","dateTimeFormats-appendItem-Year":"{1} {0}",
|
||||
"dateFormatItem-hm":"hh:mm a","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-abbr":"dom lun mar mer gio ven sab".split(" "),eraNames:["a.C.","BCE","d.C.","CE"],"dateFormatItem-yMMMd":"d MMM y","days-format-narrow":"DLMMGVS".split(""),"field-month":"mese","days-standAlone-narrow":"DLMMGVS".split(""),"dateFormatItem-MMM":"LLL","field-tue-relative+0":"questo marted\u00ec","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","field-tue-relative+1":"marted\u00ec prossimo",
|
||||
"dayPeriods-format-wide-am":"AM","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-EHm":"E HH.mm","field-mon-relative+0":"questo luned\u00ec","field-mon-relative+1":"luned\u00ec prossimo","dateFormat-short":"dd/MM/yy","dateFormatItem-EHms":"E HH:mm:ss","dateFormatItem-Ehms":"E h:mm:ss a","dayPeriods-format-narrow-noon":"n","field-second":"secondo","field-sat-relative+-1":"sabato scorso","dateFormatItem-yMMMEd":"E d MMM y","field-sun-relative+-1":"domenica scorsa",
|
||||
"field-month-relative+0":"questo mese","field-month-relative+1":"mese prossimo","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormatItem-Ed":"E d","field-week":"settimana","dateFormat-medium":"dd/MMM/y","field-week-relative+-1":"settimana scorsa","field-year-relative+0":"quest'anno","field-year-relative+1":"anno prossimo","dayPeriods-format-narrow-pm":"p.","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"hh:mm:ss a","dateFormatItem-GyMMM":"MMM y G","field-mon-relative+-1":"luned\u00ec scorso",
|
||||
"field-week-relative+0":"questa settimana","field-week-relative+1":"settimana prossima"},"dijit/nls/loading":{_localized:{},loadingState:"Caricamento in corso...",errorState:"Si \u00e8 verificato un errore"},"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},"decimalFormat-short":"000\u00a0Bln",
|
||||
"currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"#,##0.00\u00a0\u00a4","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:".",percentFormat:"#,##0%","decimalFormat-long":"000 bilioni",decimalFormat:"#,##0.###",decimal:",","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"Scelte precedenti",_localized:{},
|
||||
nextMessage:"Scelte successive"},"dijit/nls/common":{buttonOk:"Ok",buttonCancel:"Annulla",_localized:{},buttonSave:"Salva",itemClose:"Chiudi"}});
|
||||
//# sourceMappingURL=dojo_it-it.js.map
|
||||
19
Server/www/spiderbasic/dojo/nls/dojo_ja-jp.js
Normal file
@ -0,0 +1,19 @@
|
||||
//>>built
|
||||
define("dojo/nls/dojo_ja-jp",{"dijit/form/nls/validate":{invalidMessage:"\u5165\u529b\u3057\u305f\u5024\u306f\u7121\u52b9\u3067\u3059\u3002",rangeMessage:"\u3053\u306e\u5024\u306f\u7bc4\u56f2\u5916\u3067\u3059\u3002",_localized:{},missingMessage:"\u3053\u306e\u5024\u306f\u5fc5\u9808\u3067\u3059\u3002"},"dojo/cldr/nls/gregorian":{"dateFormatItem-Ehm":"a K \u6642 mm \u5206 (E)","days-standAlone-short":"\u65e5\u6708\u706b\u6c34\u6728\u91d1\u571f".split(""),"months-format-narrow":"1 2 3 4 5 6 7 8 9 10 11 12".split(" "),
|
||||
"field-second-relative+0":"\u4eca\u3059\u3050","quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"\u66dc\u65e5","dateFormatItem-yQQQ":"y/QQQ","dateFormatItem-yMEd":"y/M/d(E)","field-wed-relative+0":"\u4eca\u9031\u306e\u6c34\u66dc\u65e5","field-wed-relative+1":"\u6765\u9031\u306e\u6c34\u66dc\u65e5","dateFormatItem-GyMMMEd":"Gy\u5e74M\u6708d\u65e5(E)","dateFormatItem-MMMEd":"M\u6708d\u65e5(E)",eraNarrow:["BC","BCE","AD","CE"],"dateFormatItem-yMM":"y/MM","field-tue-relative+-1":"\u5148\u9031\u306e\u706b\u66dc\u65e5",
|
||||
"days-format-short":"\u65e5\u6708\u706b\u6c34\u6728\u91d1\u571f".split(""),"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"y\u5e74M\u6708d\u65e5","field-fri-relative+-1":"\u5148\u9031\u306e\u91d1\u66dc\u65e5","field-wed-relative+-1":"\u5148\u9031\u306e\u6c34\u66dc\u65e5","months-format-wide":"1\u6708 2\u6708 3\u6708 4\u6708 5\u6708 6\u6708 7\u6708 8\u6708 9\u6708 10\u6708 11\u6708 12\u6708".split(" "),"dateTimeFormat-medium":"{1} {0}","dayPeriods-format-wide-pm":"\u5348\u5f8c",
|
||||
"dateFormat-full":"y\u5e74M\u6708d\u65e5EEEE","field-thu-relative+-1":"\u5148\u9031\u306e\u6728\u66dc\u65e5","dateFormatItem-Md":"M/d",_localized:{},"dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dayPeriods-format-wide-noon":"\u6b63\u5348","dateFormatItem-yMd":"y/M/d","field-era":"\u6642\u4ee3","dateFormatItem-yM":"y/M","months-standAlone-wide":"1\u6708 2\u6708 3\u6708 4\u6708 5\u6708 6\u6708 7\u6708 8\u6708 9\u6708 10\u6708 11\u6708 12\u6708".split(" "),"timeFormat-short":"H:mm",
|
||||
"quarters-format-wide":["\u7b2c1\u56db\u534a\u671f","\u7b2c2\u56db\u534a\u671f","\u7b2c3\u56db\u534a\u671f","\u7b2c4\u56db\u534a\u671f"],"dateFormatItem-MEEEEd":"M/dEEEE","dateFormatItem-yQQQQ":"yQQQQ","timeFormat-long":"H:mm:ss z","field-year":"\u5e74","dateFormatItem-yMMM":"y\u5e74M\u6708","dateTimeFormats-appendItem-Era":"{1} {0}","field-hour":"\u6642","months-format-abbr":"1\u6708 2\u6708 3\u6708 4\u6708 5\u6708 6\u6708 7\u6708 8\u6708 9\u6708 10\u6708 11\u6708 12\u6708".split(" "),"field-sat-relative+0":"\u4eca\u9031\u306e\u571f\u66dc\u65e5",
|
||||
"field-sat-relative+1":"\u6765\u9031\u306e\u571f\u66dc\u65e5","timeFormat-full":"H\u6642mm\u5206ss\u79d2 zzzz","dateFormatItem-yMEEEEd":"y/M/dEEEE","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-day-relative+0":"\u4eca\u65e5","field-thu-relative+0":"\u4eca\u9031\u306e\u6728\u66dc\u65e5","field-day-relative+1":"\u660e\u65e5","field-thu-relative+1":"\u6765\u9031\u306e\u6728\u66dc\u65e5","dateFormatItem-GyMMMd":"Gy\u5e74M\u6708d\u65e5","field-day-relative+2":"\u660e\u5f8c\u65e5","dateFormatItem-H":"H\u6642",
|
||||
"months-standAlone-abbr":"1\u6708 2\u6708 3\u6708 4\u6708 5\u6708 6\u6708 7\u6708 8\u6708 9\u6708 10\u6708 11\u6708 12\u6708".split(" "),"quarters-format-abbr":["Q1","Q2","Q3","Q4"],"quarters-standAlone-wide":["\u7b2c1\u56db\u534a\u671f","\u7b2c2\u56db\u534a\u671f","\u7b2c3\u56db\u534a\u671f","\u7b2c4\u56db\u534a\u671f"],"dateFormatItem-Gy":"Gy\u5e74","dateFormatItem-M":"M\u6708","days-standAlone-wide":"\u65e5\u66dc\u65e5 \u6708\u66dc\u65e5 \u706b\u66dc\u65e5 \u6c34\u66dc\u65e5 \u6728\u66dc\u65e5 \u91d1\u66dc\u65e5 \u571f\u66dc\u65e5".split(" "),
|
||||
"dateFormatItem-yMMMEEEEd":"y\u5e74M\u6708d\u65e5EEEE","dayPeriods-format-abbr-noon":"noon","timeFormat-medium":"H:mm:ss","field-sun-relative+0":"\u4eca\u9031\u306e\u65e5\u66dc\u65e5","dateFormatItem-Hm":"H:mm","field-sun-relative+1":"\u6765\u9031\u306e\u65e5\u66dc\u65e5","quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],eraAbbr:["\u7d00\u5143\u524d","\u897f\u66a6"],"field-minute":"\u5206","field-dayperiod":"\u5348\u524d/\u5348\u5f8c","days-standAlone-abbr":"\u65e5\u6708\u706b\u6c34\u6728\u91d1\u571f".split(""),
|
||||
"dateFormatItem-d":"d\u65e5","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"field-day-relative+-1":"\u6628\u65e5","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"\u5348\u524d","dateFormatItem-h":"aK\u6642","field-day-relative+-2":"\u4e00\u6628\u65e5","dateFormatItem-MMMd":"M\u6708d\u65e5","dateFormatItem-EEEEd":"d\u65e5EEEE","dateFormatItem-MEd":"M/d(E)","dateTimeFormat-full":"{1} {0}","field-fri-relative+0":"\u4eca\u9031\u306e\u91d1\u66dc\u65e5","field-fri-relative+1":"\u6765\u9031\u306e\u91d1\u66dc\u65e5",
|
||||
"field-day":"\u65e5","days-format-wide":"\u65e5\u66dc\u65e5 \u6708\u66dc\u65e5 \u706b\u66dc\u65e5 \u6c34\u66dc\u65e5 \u6728\u66dc\u65e5 \u91d1\u66dc\u65e5 \u571f\u66dc\u65e5".split(" "),"field-zone":"\u30bf\u30a4\u30e0\u30be\u30fc\u30f3","months-standAlone-narrow":"1 2 3 4 5 6 7 8 9 10 11 12".split(" "),"dateFormatItem-y":"y\u5e74","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-year-relative+-1":"\u6628\u5e74","field-month-relative+-1":"\u5148\u6708","dateTimeFormats-appendItem-Year":"{1} {0}",
|
||||
"dateFormatItem-hm":"aK:mm","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dateFormatItem-GyMMMEEEEd":"Gy\u5e74M\u6708d\u65e5EEEE","dayPeriods-format-abbr-pm":"PM","days-format-abbr":"\u65e5\u6708\u706b\u6c34\u6728\u91d1\u571f".split(""),eraNames:["\u7d00\u5143\u524d","\u897f\u66a6\u7d00\u5143\u524d","\u897f\u66a6"],"dateFormatItem-yMMMd":"y\u5e74M\u6708d\u65e5","days-format-narrow":"\u65e5\u6708\u706b\u6c34\u6728\u91d1\u571f".split(""),"dateFormatItem-MMMEEEEd":"M\u6708d\u65e5EEEE","field-month":"\u6708",
|
||||
"days-standAlone-narrow":"\u65e5\u6708\u706b\u6c34\u6728\u91d1\u571f".split(""),"dateFormatItem-MMM":"M\u6708","field-tue-relative+0":"\u4eca\u9031\u306e\u706b\u66dc\u65e5","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","field-tue-relative+1":"\u6765\u9031\u306e\u706b\u66dc\u65e5","dayPeriods-format-wide-am":"\u5348\u524d","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-EHm":"HH \u6642 mm \u5206 (E)","field-mon-relative+0":"\u4eca\u9031\u306e\u6708\u66dc\u65e5",
|
||||
"field-mon-relative+1":"\u6765\u9031\u306e\u6708\u66dc\u65e5","dateFormat-short":"y/MM/dd","dateFormatItem-EHms":"HH \u6642 mm \u5206 ss \u79d2 (E)","dateFormatItem-Ehms":"a K \u6642 mm \u5206 ss \u79d2 (E)","dayPeriods-format-narrow-noon":"\u6b63\u5348","field-second":"\u79d2","field-sat-relative+-1":"\u5148\u9031\u306e\u571f\u66dc\u65e5","dateFormatItem-yMMMEd":"y\u5e74M\u6708d\u65e5(E)","field-sun-relative+-1":"\u5148\u9031\u306e\u65e5\u66dc\u65e5","field-month-relative+0":"\u4eca\u6708","field-month-relative+1":"\u7fcc\u6708",
|
||||
"dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormatItem-Ed":"d\u65e5(E)","field-week":"\u9031","dateFormat-medium":"y/MM/dd","field-week-relative+-1":"\u5148\u9031","field-year-relative+0":"\u4eca\u5e74","field-year-relative+1":"\u7fcc\u5e74","dayPeriods-format-narrow-pm":"\u5348\u5f8c","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"H:mm:ss","dateFormatItem-hms":"aK:mm:ss","dateFormatItem-GyMMM":"Gy\u5e74M\u6708","field-mon-relative+-1":"\u5148\u9031\u306e\u6708\u66dc\u65e5","field-week-relative+0":"\u4eca\u9031",
|
||||
"field-week-relative+1":"\u7fcc\u9031"},"dijit/nls/loading":{_localized:{},loadingState:"\u30ed\u30fc\u30c9\u4e2d...",errorState:"\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002"},"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},"decimalFormat-short":"000\u5146","currencySpacing-afterCurrency-insertBetween":"\u00a0",
|
||||
nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"\u00a4#,##0.00;(\u00a4#,##0.00)","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:",",percentFormat:"#,##0%","decimalFormat-long":"000\u5146",decimalFormat:"#,##0.###",decimal:".","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"\u4ee5\u524d\u306e\u9078\u629e\u9805\u76ee",_localized:{},nextMessage:"\u8ffd\u52a0\u306e\u9078\u629e\u9805\u76ee"},
|
||||
"dijit/nls/common":{buttonOk:"OK",buttonCancel:"\u30ad\u30e3\u30f3\u30bb\u30eb",_localized:{},buttonSave:"\u4fdd\u5b58",itemClose:"\u9589\u3058\u308b"}});
|
||||
//# sourceMappingURL=dojo_ja-jp.js.map
|
||||
19
Server/www/spiderbasic/dojo/nls/dojo_ko-kr.js
Normal file
@ -0,0 +1,19 @@
|
||||
//>>built
|
||||
define("dojo/nls/dojo_ko-kr",{"dijit/form/nls/validate":{invalidMessage:"\uc785\ub825\ub41c \uac12\uc774 \uc62c\ubc14\ub974\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.",rangeMessage:"\uc774 \uac12\uc740 \ubc94\uc704\ub97c \ubc97\uc5b4\ub0a9\ub2c8\ub2e4.",_localized:{},missingMessage:"\uc774 \uac12\uc740 \ud544\uc218\uc785\ub2c8\ub2e4."},"dojo/cldr/nls/gregorian":{"dateTimeFormats-appendItem-Year":"{1} {0}","field-tue-relative+-1":"\uc9c0\ub09c \ud654\uc694\uc77c","field-year":"\ub144","dateFormatItem-MEEEEd":"M. d. EEEE",
|
||||
"dateFormatItem-Hm":"HH:mm","field-wed-relative+0":"\uc774\ubc88 \uc218\uc694\uc77c","field-wed-relative+1":"\ub2e4\uc74c \uc218\uc694\uc77c","dateFormatItem-ms":"mm:ss","timeFormat-short":"a h:mm","field-minute":"\ubd84","dateTimeFormat-short":"{1} {0}","field-day-relative+0":"\uc624\ub298","field-day-relative+1":"\ub0b4\uc77c","field-day-relative+2":"\ubaa8\ub808","field-tue-relative+0":"\uc774\ubc88 \ud654\uc694\uc77c","field-tue-relative+1":"\ub2e4\uc74c \ud654\uc694\uc77c","dayPeriods-format-narrow-am":"a",
|
||||
"dateFormatItem-MMMd":"MMM d\uc77c","dayPeriods-format-abbr-am":"AM","field-week-relative+0":"\uc774\ubc88 \uc8fc","field-month-relative+0":"\uc774\ubc88 \ub2ec","field-week-relative+1":"\ub2e4\uc74c \uc8fc","field-month-relative+1":"\ub2e4\uc74c \ub2ec","timeFormat-medium":"a h:mm:ss","field-second-relative+0":"\uc9c0\uae08","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","months-standAlone-narrow":"1\uc6d4 2\uc6d4 3\uc6d4 4\uc6d4 5\uc6d4 6\uc6d4 7\uc6d4 8\uc6d4 9\uc6d4 10\uc6d4 11\uc6d4 12\uc6d4".split(" "),
|
||||
eraNames:["\uc11c\ub825\uae30\uc6d0\uc804","\uc11c\ub825\uae30\uc6d0"],"dateFormatItem-GyMMMEd":"G y\ub144 MMM d\uc77c (E)","field-day":"\uc77c","field-year-relative+-1":"\uc9c0\ub09c\ud574","dayPeriods-format-wide-am":"\uc624\uc804","field-wed-relative+-1":"\uc9c0\ub09c \uc218\uc694\uc77c","dateTimeFormat-medium":"{1} {0}","field-second":"\ucd08","days-standAlone-narrow":"\uc77c\uc6d4\ud654\uc218\ubaa9\uae08\ud1a0".split(""),"dateFormatItem-Ehms":"(E) a h:mm:ss","dateFormat-long":"y\ub144 M\uc6d4 d\uc77c",
|
||||
"dateFormatItem-GyMMMd":"G y\ub144 MMM d\uc77c","dateFormatItem-yMMMEd":"y\ub144 MMM d\uc77c (E)","dateFormatItem-MMMEEEEd":"MMM d\uc77c EEEE","quarters-standAlone-wide":["\uc81c 1/4\ubd84\uae30","\uc81c 2/4\ubd84\uae30","\uc81c 3/4\ubd84\uae30","\uc81c 4/4\ubd84\uae30"],"days-format-narrow":"\uc77c\uc6d4\ud654\uc218\ubaa9\uae08\ud1a0".split(""),"dateTimeFormats-appendItem-Timezone":"{0} {1}","field-mon-relative+-1":"\uc9c0\ub09c \uc6d4\uc694\uc77c","dateFormatItem-GyMMM":"G y\ub144 MMM","field-month":"\uc6d4",
|
||||
"dateFormatItem-MMM":"LLL","field-dayperiod":"\uc624\uc804/\uc624\ud6c4","dayPeriods-format-narrow-pm":"p","dateFormat-medium":"y. M. d.","dateFormatItem-EEEEd":"d\uc77c EEEE",eraAbbr:["\uae30\uc6d0\uc804","\uc11c\uae30"],"quarters-standAlone-abbr":["1\ubd84\uae30","2\ubd84\uae30","3\ubd84\uae30","4\ubd84\uae30"],"dayPeriods-format-abbr-pm":"PM","field-mon-relative+0":"\uc774\ubc88 \uc6d4\uc694\uc77c","field-mon-relative+1":"\ub2e4\uc74c \uc6d4\uc694\uc77c","months-format-narrow":"1\uc6d4 2\uc6d4 3\uc6d4 4\uc6d4 5\uc6d4 6\uc6d4 7\uc6d4 8\uc6d4 9\uc6d4 10\uc6d4 11\uc6d4 12\uc6d4".split(" "),
|
||||
"days-format-short":"\uc77c\uc6d4\ud654\uc218\ubaa9\uae08\ud1a0".split(""),"quarters-format-narrow":["1","2","3","4"],"dayPeriods-format-wide-pm":"\uc624\ud6c4","field-sat-relative+-1":"\uc9c0\ub09c \ud1a0\uc694\uc77c","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dateTimeFormat-long":"{1} {0}","dateFormatItem-Md":"M. d.","field-hour":"\uc2dc","dateFormatItem-yQQQQ":"y\ub144 QQQQ","months-format-wide":"1\uc6d4 2\uc6d4 3\uc6d4 4\uc6d4 5\uc6d4 6\uc6d4 7\uc6d4 8\uc6d4 9\uc6d4 10\uc6d4 11\uc6d4 12\uc6d4".split(" "),
|
||||
"dateFormat-full":"y\ub144 M\uc6d4 d\uc77c EEEE","field-month-relative+-1":"\uc9c0\ub09c\ub2ec","dateFormatItem-Hms":"H\uc2dc m\ubd84 s\ucd08","field-fri-relative+0":"\uc774\ubc88 \uae08\uc694\uc77c","field-fri-relative+1":"\ub2e4\uc74c \uae08\uc694\uc77c","dayPeriods-format-narrow-noon":"n","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})",_localized:{},"field-week-relative+-1":"\uc9c0\ub09c\uc8fc","dateFormatItem-Ehm":"(E) a h:mm","months-format-abbr":"1\uc6d4 2\uc6d4 3\uc6d4 4\uc6d4 5\uc6d4 6\uc6d4 7\uc6d4 8\uc6d4 9\uc6d4 10\uc6d4 11\uc6d4 12\uc6d4".split(" "),
|
||||
"timeFormat-long":"a h\uc2dc m\ubd84 s\ucd08 z","dateFormatItem-yMMM":"y\ub144 MMM","dateFormat-short":"yy. M. d.","days-standAlone-wide":"\uc77c\uc694\uc77c \uc6d4\uc694\uc77c \ud654\uc694\uc77c \uc218\uc694\uc77c \ubaa9\uc694\uc77c \uae08\uc694\uc77c \ud1a0\uc694\uc77c".split(" "),"dateFormatItem-yMMMEEEEd":"y\ub144 MMM d\uc77c EEEE","dateTimeFormats-appendItem-Era":"{1} {0}","dateFormatItem-mmss":"mm:ss","dateFormatItem-H":"H\uc2dc","dateFormatItem-M":"M\uc6d4","months-standAlone-wide":"1\uc6d4 2\uc6d4 3\uc6d4 4\uc6d4 5\uc6d4 6\uc6d4 7\uc6d4 8\uc6d4 9\uc6d4 10\uc6d4 11\uc6d4 12\uc6d4".split(" "),
|
||||
"field-sun-relative+-1":"\uc9c0\ub09c \uc77c\uc694\uc77c","days-standAlone-abbr":"\uc77c\uc6d4\ud654\uc218\ubaa9\uae08\ud1a0".split(""),"dateTimeFormat-full":"{1} {0}","dateFormatItem-HHmmss":"HH:mm:ss","dateFormatItem-hm":"a h:mm","dateFormatItem-d":"d\uc77c","field-weekday":"\uc694\uc77c","field-sat-relative+0":"\uc774\ubc88 \ud1a0\uc694\uc77c","dateFormatItem-h":"a h\uc2dc","field-sat-relative+1":"\ub2e4\uc74c \ud1a0\uc694\uc77c","months-standAlone-abbr":"1\uc6d4 2\uc6d4 3\uc6d4 4\uc6d4 5\uc6d4 6\uc6d4 7\uc6d4 8\uc6d4 9\uc6d4 10\uc6d4 11\uc6d4 12\uc6d4".split(" "),
|
||||
"dateFormatItem-yMM":"y. M.","timeFormat-full":"a h\uc2dc m\ubd84 s\ucd08 zzzz","dateFormatItem-MEd":"M. d. (E)","dateFormatItem-y":"y\ub144","field-thu-relative+0":"\uc774\ubc88 \ubaa9\uc694\uc77c","field-thu-relative+1":"\ub2e4\uc74c \ubaa9\uc694\uc77c","dateFormatItem-hms":"a h:mm:ss","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dayPeriods-format-abbr-noon":"noon","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-thu-relative+-1":"\uc9c0\ub09c \ubaa9\uc694\uc77c","dateFormatItem-yMd":"y. M. d.",
|
||||
"field-week":"\uc8fc","quarters-standAlone-narrow":["1","2","3","4"],"quarters-format-wide":["\uc81c 1/4\ubd84\uae30","\uc81c 2/4\ubd84\uae30","\uc81c 3/4\ubd84\uae30","\uc81c 4/4\ubd84\uae30"],"dateFormatItem-Ed":"d\uc77c (E)","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","days-standAlone-short":"\uc77c\uc6d4\ud654\uc218\ubaa9\uae08\ud1a0".split(""),"quarters-format-abbr":["1\ubd84\uae30","2\ubd84\uae30","3\ubd84\uae30","4\ubd84\uae30"],"field-year-relative+0":"\uc62c\ud574","field-year-relative+1":"\ub0b4\ub144",
|
||||
"field-fri-relative+-1":"\uc9c0\ub09c \uae08\uc694\uc77c",eraNarrow:["\uae30\uc6d0\uc804","\uc11c\uae30"],"dayPeriods-format-wide-noon":"noon","dateFormatItem-yQQQ":"y\ub144 QQQ","days-format-wide":"\uc77c\uc694\uc77c \uc6d4\uc694\uc77c \ud654\uc694\uc77c \uc218\uc694\uc77c \ubaa9\uc694\uc77c \uae08\uc694\uc77c \ud1a0\uc694\uc77c".split(" "),"dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateFormatItem-EHm":"(E) HH:mm","dateFormatItem-GyMMMEEEEd":"G y\ub144 MMM d\uc77c EEEE","field-zone":"\uc2dc\uac04\ub300",
|
||||
"dateFormatItem-yM":"y. M.","dateFormatItem-MMMEd":"MMM d\uc77c (E)","dateFormatItem-EHms":"(E) HH:mm:ss","dateFormatItem-yMEd":"y. M. d. (E)","field-day-relative+-1":"\uc5b4\uc81c","field-day-relative+-2":"\uadf8\uc800\uaed8","days-format-abbr":"\uc77c\uc6d4\ud654\uc218\ubaa9\uae08\ud1a0".split(""),"field-sun-relative+0":"\uc774\ubc88 \uc77c\uc694\uc77c","field-sun-relative+1":"\ub2e4\uc74c \uc77c\uc694\uc77c","dateFormatItem-yMMMd":"y\ub144 MMM d\uc77c","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})",
|
||||
"dateFormatItem-Gy":"G y\ub144","field-era":"\uc5f0\ud638","dateFormatItem-yMEEEEd":"y. M. d. EEEE"},"dijit/nls/loading":{_localized:{},loadingState:"\ub85c\ub4dc \uc911...",errorState:"\uc8c4\uc1a1\ud569\ub2c8\ub2e4. \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4."},"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",
|
||||
_localized:{},"decimalFormat-short":"000\uc870","currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"\u00a4#,##0.00;(\u00a4#,##0.00)","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:",",percentFormat:"#,##0%","decimalFormat-long":"000\uc870",decimalFormat:"#,##0.###",decimal:".","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"\uc774\uc804 \uc120\ud0dd\uc0ac\ud56d",
|
||||
_localized:{},nextMessage:"\uae30\ud0c0 \uc120\ud0dd\uc0ac\ud56d"},"dijit/nls/common":{buttonOk:"\ud655\uc778",buttonCancel:"\ucde8\uc18c",_localized:{},buttonSave:"\uc800\uc7a5",itemClose:"\ub2eb\uae30"}});
|
||||
//# sourceMappingURL=dojo_ko-kr.js.map
|
||||
16
Server/www/spiderbasic/dojo/nls/dojo_nb.js
Normal file
@ -0,0 +1,16 @@
|
||||
//>>built
|
||||
define("dojo/nls/dojo_nb",{"dijit/form/nls/validate":{invalidMessage:"Den angitte verdien er ikke gyldig.",rangeMessage:"Denne verdien er utenfor gyldig omr\u00e5de.",_localized:{},missingMessage:"Denne verdien er obligatorisk."},"dojo/cldr/nls/gregorian":{"dateFormatItem-Ehm":"E h.mm a","days-standAlone-short":"s\u00f8. ma. ti. on. to. fr. l\u00f8.".split(" "),"months-format-narrow":"JFMAMJJASOND".split(""),"field-second-relative+0":"n\u00e5","quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"Ukedag",
|
||||
"dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"E d.MM.y","field-wed-relative+0":"onsdag denne uken","field-wed-relative+1":"onsdag neste uke","dateFormatItem-GyMMMEd":"E d. MMM y G","dateFormatItem-MMMEd":"E d. MMM",eraNarrow:["f.Kr.","fvt.","e.Kr.","vt"],"dateFormatItem-yMM":"MM.y","field-tue-relative+-1":"tirsdag sist uke","days-format-short":"s\u00f8. ma. ti. on. to. fr. l\u00f8.".split(" "),"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"d. MMMM y","field-fri-relative+-1":"fredag sist uke",
|
||||
"field-wed-relative+-1":"onsdag sist uke","months-format-wide":"januar februar mars april mai juni juli august september oktober november desember".split(" "),"dateTimeFormat-medium":"{1}, {0}","dayPeriods-format-wide-pm":"p.m.","dateFormat-full":"EEEE d. MMMM y","field-thu-relative+-1":"torsdag sist uke","dateFormatItem-Md":"d.M.",_localized:{},"dayPeriods-format-abbr-am":"a.m.","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dayPeriods-format-wide-noon":"noon","dateFormatItem-yMd":"d.M.y",
|
||||
"field-era":"Tidsalder","dateFormatItem-yM":"M.y","months-standAlone-wide":"januar februar mars april mai juni juli august september oktober november desember".split(" "),"timeFormat-short":"HH.mm","quarters-format-wide":["1. kvartal","2. kvartal","3. kvartal","4. kvartal"],"dateFormatItem-yQQQQ":"QQQQ y","timeFormat-long":"HH.mm.ss z","field-year":"\u00c5r","dateFormatItem-yMMM":"MMM y","dateTimeFormats-appendItem-Era":"{1} {0}","field-hour":"Time","dateFormatItem-MMdd":"d.M.","months-format-abbr":"jan. feb. mar. apr. mai jun. jul. aug. sep. okt. nov. des.".split(" "),
|
||||
"field-sat-relative+0":"l\u00f8rdag denne uken","field-sat-relative+1":"l\u00f8rdag neste uke","timeFormat-full":"HH.mm.ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-day-relative+0":"i dag","field-thu-relative+0":"torsdag denne uken","field-day-relative+1":"i morgen","field-thu-relative+1":"torsdag neste uke","dateFormatItem-GyMMMd":"d. MMM y G","field-day-relative+2":"i overmorgen","dateFormatItem-H":"HH","months-standAlone-abbr":"jan feb mar apr mai jun jul aug sep okt nov des".split(" "),
|
||||
"quarters-format-abbr":["K1","K2","K3","K4"],"quarters-standAlone-wide":["1. kvartal","2. kvartal","3. kvartal","4. kvartal"],"dateFormatItem-Gy":"y G","dateFormatItem-M":"L.","days-standAlone-wide":"s\u00f8ndag mandag tirsdag onsdag torsdag fredag l\u00f8rdag".split(" "),"dayPeriods-format-abbr-noon":"noon","timeFormat-medium":"HH.mm.ss","field-sun-relative+0":"s\u00f8ndag denne uken","dateFormatItem-Hm":"HH.mm","field-sun-relative+1":"s\u00f8ndag neste uke","quarters-standAlone-abbr":["K1","K2",
|
||||
"K3","K4"],eraAbbr:["f.Kr.","e.Kr."],"field-minute":"Minutt","field-dayperiod":"AM/PM","days-standAlone-abbr":"s\u00f8. ma. ti. on. to. fr. l\u00f8.".split(" "),"dateFormatItem-d":"d.","dateFormatItem-ms":"mm.ss","quarters-format-narrow":["1","2","3","4"],"field-day-relative+-1":"i g\u00e5r","dateTimeFormat-long":"{1} 'kl.' {0}","dayPeriods-format-narrow-am":"a","dateFormatItem-h":"h a","field-day-relative+-2":"i forg\u00e5rs","dateFormatItem-MMMd":"d. MMM","dateFormatItem-MEd":"E d.M","dateTimeFormat-full":"{1} {0}",
|
||||
"field-fri-relative+0":"fredag denne uken","field-fri-relative+1":"fredag neste uke","dateFormatItem-yMMMM":"MMMM y","field-day":"Dag","days-format-wide":"s\u00f8ndag mandag tirsdag onsdag torsdag fredag l\u00f8rdag".split(" "),"field-zone":"Tidssone","months-standAlone-narrow":"JFMAMJJASOND".split(""),"dateFormatItem-y":"y","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-year-relative+-1":"I fjor","field-month-relative+-1":"Sist m\u00e5ned","dateTimeFormats-appendItem-Year":"{1} {0}","dateFormatItem-hm":"h.mm a",
|
||||
"dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"p.m.","days-format-abbr":"s\u00f8n. man. tir. ons. tor. fre. l\u00f8r.".split(" "),eraNames:["f.Kr.","e.Kr."],"dateFormatItem-yMMMd":"d. MMM y","days-format-narrow":"SMTOTFL".split(""),"field-month":"M\u00e5ned","days-standAlone-narrow":"SMTOTFL".split(""),"dateFormatItem-MMM":"LLL","field-tue-relative+0":"tirsdag denne uken","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","field-tue-relative+1":"tirsdag neste uke",
|
||||
"dayPeriods-format-wide-am":"a.m.","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-EHm":"E HH.mm","field-mon-relative+0":"mandag denne uken","field-mon-relative+1":"mandag neste uke","dateFormat-short":"dd.MM.yy","dateFormatItem-EHms":"E HH.mm.ss","dateFormatItem-Ehms":"E h.mm.ss a","dayPeriods-format-narrow-noon":"n","field-second":"Sekund","field-sat-relative+-1":"l\u00f8rdag sist uke","dateFormatItem-yMMMEd":"E d. MMM y",
|
||||
"field-sun-relative+-1":"s\u00f8ndag sist uke","field-month-relative+0":"Denne m\u00e5neden","field-month-relative+1":"Neste m\u00e5ned","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormatItem-Ed":"E d.","field-week":"Uke","dateFormat-medium":"d. MMM y","field-week-relative+-1":"Sist uke","field-year-relative+0":"Dette \u00e5ret","field-year-relative+1":"Neste \u00e5r","dayPeriods-format-narrow-pm":"p","dateTimeFormat-short":"{1}, {0}","dateFormatItem-Hms":"HH.mm.ss","dateFormatItem-hms":"h.mm.ss a",
|
||||
"dateFormatItem-GyMMM":"MMM y G","field-mon-relative+-1":"mandag sist uke","field-week-relative+0":"Denne uken","field-week-relative+1":"Neste uke"},"dijit/nls/loading":{_localized:{},loadingState:"Laster inn...",errorState:"Det oppsto en feil"},"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"\u2212","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",
|
||||
_localized:{},"decimalFormat-short":"000\u00a0bill","currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"\u00a4\u00a0#,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:"\u00a0",percentFormat:"#,##0\u00a0%","decimalFormat-long":"000 billioner",decimalFormat:"#,##0.###",decimal:",","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"Tidligere valg",
|
||||
_localized:{},nextMessage:"Flere valg"},"dijit/nls/common":{buttonOk:"OK",buttonCancel:"Avbryt",_localized:{},buttonSave:"Lagre",itemClose:"Lukk"}});
|
||||
//# sourceMappingURL=dojo_nb.js.map
|
||||
15
Server/www/spiderbasic/dojo/nls/dojo_nl-nl.js
Normal file
@ -0,0 +1,15 @@
|
||||
//>>built
|
||||
define("dojo/nls/dojo_nl-nl",{"dijit/form/nls/validate":{invalidMessage:"De opgegeven waarde is ongeldig.",rangeMessage:"Deze waarde is niet toegestaan.",_localized:{},missingMessage:"Deze waarde is verplicht."},"dojo/cldr/nls/gregorian":{"dateFormatItem-Ehm":"E h:mm a","days-standAlone-short":"zo ma di wo do vr za".split(" "),"months-format-narrow":"JFMAMJJASOND".split(""),"field-second-relative+0":"nu","quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"Dag van de week","dateFormatItem-yQQQ":"QQQ y",
|
||||
"dateFormatItem-yMEd":"E d-M-y","field-wed-relative+0":"deze woensdag","field-wed-relative+1":"volgende week woensdag","dateFormatItem-GyMMMEd":"E d MMM y G","dateFormatItem-MMMEd":"E d MMM",eraNarrow:["v.C.","vgj","n.C.","gj"],"field-tue-relative+-1":"afgelopen dinsdag","days-format-short":"zo ma di wo do vr za".split(" "),"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"d MMMM y","field-fri-relative+-1":"afgelopen vrijdag","field-wed-relative+-1":"afgelopen woensdag","months-format-wide":"januari februari maart april mei juni juli augustus september oktober november december".split(" "),
|
||||
"dateTimeFormat-medium":"{1} {0}","dayPeriods-format-wide-pm":"PM","dateFormat-full":"EEEE d MMMM y","field-thu-relative+-1":"afgelopen donderdag","dateFormatItem-Md":"d-M",_localized:{},"dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dayPeriods-format-wide-noon":"12 uur 's middags","dateFormatItem-yMd":"d-M-y","field-era":"Tijdperk","dateFormatItem-yM":"M-y","months-standAlone-wide":"januari februari maart april mei juni juli augustus september oktober november december".split(" "),
|
||||
"timeFormat-short":"HH:mm","quarters-format-wide":["1e kwartaal","2e kwartaal","3e kwartaal","4e kwartaal"],"dateFormatItem-yQQQQ":"QQQQ y","timeFormat-long":"HH:mm:ss z","field-year":"Jaar","dateFormatItem-yMMM":"MMM y","dateTimeFormats-appendItem-Era":"{1} {0}","field-hour":"Uur","months-format-abbr":"jan. feb. mrt. apr. mei jun. jul. aug. sep. okt. nov. dec.".split(" "),"field-sat-relative+0":"deze zaterdag","field-sat-relative+1":"volgende week zaterdag","timeFormat-full":"HH:mm:ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})",
|
||||
"field-day-relative+0":"vandaag","field-thu-relative+0":"deze donderdag","field-day-relative+1":"morgen","field-thu-relative+1":"volgende week donderdag","dateFormatItem-GyMMMd":"d MMM y G","field-day-relative+2":"overmorgen","dateFormatItem-H":"HH","months-standAlone-abbr":"jan feb mrt apr mei jun jul aug sep okt nov dec".split(" "),"quarters-format-abbr":["K1","K2","K3","K4"],"quarters-standAlone-wide":["1e kwartaal","2e kwartaal","3e kwartaal","4e kwartaal"],"dateFormatItem-Gy":"y G","dateFormatItem-M":"L",
|
||||
"days-standAlone-wide":"zondag maandag dinsdag woensdag donderdag vrijdag zaterdag".split(" "),"dateFormatItem-MMMMd":"d MMMM","dayPeriods-format-abbr-noon":"12 uur 's middags","timeFormat-medium":"HH:mm:ss","field-sun-relative+0":"deze zondag","dateFormatItem-Hm":"HH:mm","field-sun-relative+1":"volgende week zondag","quarters-standAlone-abbr":["K1","K2","K3","K4"],eraAbbr:["v.Chr.","n.Chr."],"field-minute":"Minuut","field-dayperiod":"AM/PM","days-standAlone-abbr":"zo ma di wo do vr za".split(" "),
|
||||
"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"field-day-relative+-1":"gisteren","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateFormatItem-h":"h a","field-day-relative+-2":"eergisteren","dateFormatItem-MMMd":"d MMM","dateFormatItem-MEd":"E d-M","dateTimeFormat-full":"{1} {0}","field-fri-relative+0":"deze vrijdag","field-fri-relative+1":"volgende week vrijdag","dateFormatItem-yMMMM":"MMMM y","field-day":"Dag","days-format-wide":"zondag maandag dinsdag woensdag donderdag vrijdag zaterdag".split(" "),
|
||||
"field-zone":"Zone","months-standAlone-narrow":"JFMAMJJASOND".split(""),"dateFormatItem-y":"y","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-year-relative+-1":"vorig jaar","field-month-relative+-1":"vorige maand","dateTimeFormats-appendItem-Year":"{1} {0}","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-abbr":"zo ma di wo do vr za".split(" "),eraNames:["Voor Christus","v\u00f3\u00f3r gewone jaartelling","na Christus",
|
||||
"gewone jaartelling"],"dateFormatItem-yMMMd":"d MMM y","days-format-narrow":"ZMDWDVZ".split(""),"field-month":"Maand","days-standAlone-narrow":"ZMDWDVZ".split(""),"dateFormatItem-MMM":"LLL","field-tue-relative+0":"deze dinsdag","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","field-tue-relative+1":"volgende week dinsdag","dayPeriods-format-wide-am":"AM","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-EHm":"E HH:mm","field-mon-relative+0":"deze maandag",
|
||||
"field-mon-relative+1":"volgende week maandag","dateFormat-short":"dd-MM-yy","dateFormatItem-EHms":"E HH:mm:ss","dateFormatItem-Ehms":"E h:mm:ss a","dayPeriods-format-narrow-noon":"n","field-second":"Seconde","field-sat-relative+-1":"afgelopen zaterdag","dateFormatItem-yMMMEd":"E d MMM y","field-sun-relative+-1":"afgelopen zondag","field-month-relative+0":"deze maand","field-month-relative+1":"volgende maand","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormatItem-Ed":"E d","field-week":"Week",
|
||||
"dateFormat-medium":"d MMM y","field-week-relative+-1":"vorige week","field-year-relative+0":"dit jaar","field-year-relative+1":"volgend jaar","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a","dateFormatItem-GyMMM":"MMM y G","field-mon-relative+-1":"afgelopen maandag","field-week-relative+0":"deze week","field-week-relative+1":"volgende week"},"dijit/nls/loading":{_localized:{},loadingState:"Bezig met laden...",errorState:"Er is een fout opgetreden"},
|
||||
"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},"decimalFormat-short":"000\u00a0bln'.'","currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"\u00a4\u00a0#,##0.00;(\u00a4\u00a0#,##0.00)",
|
||||
"currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:".",percentFormat:"#,##0%","decimalFormat-long":"000 biljoen",decimalFormat:"#,##0.###",decimal:",","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"Eerdere opties",_localized:{},nextMessage:"Meer opties"},"dijit/nls/common":{buttonOk:"OK",buttonCancel:"Annuleren",_localized:{},buttonSave:"Opslaan",itemClose:"Sluiten"}});
|
||||
//# sourceMappingURL=dojo_nl-nl.js.map
|
||||
17
Server/www/spiderbasic/dojo/nls/dojo_pl.js
Normal file
@ -0,0 +1,17 @@
|
||||
//>>built
|
||||
define("dojo/nls/dojo_pl",{"dijit/form/nls/validate":{invalidMessage:"Wprowadzona warto\u015b\u0107 jest nieprawid\u0142owa.",rangeMessage:"Ta warto\u015b\u0107 jest spoza zakresu.",_localized:{},missingMessage:"Ta warto\u015b\u0107 jest wymagana."},"dojo/cldr/nls/gregorian":{"dateTimeFormats-appendItem-Year":"{1} {0}","field-tue-relative+-1":"w zesz\u0142y wtorek","field-year":"rok","dateFormatItem-Hm":"HH:mm","field-wed-relative+0":"w t\u0119 \u015brod\u0119","field-wed-relative+1":"w przysz\u0142\u0105 \u015brod\u0119",
|
||||
"dayPeriods-format-wide-night":"w nocy","dateFormatItem-ms":"mm:ss","timeFormat-short":"HH:mm","field-minute":"minuta","dateTimeFormat-short":"{1}, {0}","field-day-relative+0":"dzisiaj","field-day-relative+1":"jutro","field-day-relative+2":"pojutrze","field-tue-relative+0":"w ten wtorek","field-tue-relative+1":"w przysz\u0142y wtorek","dayPeriods-format-narrow-am":"a","dateFormatItem-MMMd":"d MMM","dayPeriods-format-abbr-am":"AM","field-week-relative+0":"w tym tygodniu","field-month-relative+0":"w tym miesi\u0105cu",
|
||||
"field-week-relative+1":"w przysz\u0142ym tygodniu","field-month-relative+1":"w przysz\u0142ym miesi\u0105cu","timeFormat-medium":"HH:mm:ss","field-second-relative+0":"teraz","dayPeriods-format-wide-afternoon":"po po\u0142udniu","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","months-standAlone-narrow":"slmkmclswplg".split(""),eraNames:["p.n.e.","n.e."],"dateFormatItem-GyMMMEd":"E, d MMM y G","field-day":"dzie\u0144","field-year-relative+-1":"w zesz\u0142ym roku","dayPeriods-format-wide-am":"AM",
|
||||
"field-wed-relative+-1":"w zesz\u0142\u0105 \u015brod\u0119","dateTimeFormat-medium":"{1}, {0}","field-second":"sekunda","days-standAlone-narrow":"NPW\u015aCPS".split(""),"dateFormatItem-Ehms":"E, h:mm:ss a","dateFormat-long":"d MMMM y","dateFormatItem-GyMMMd":"d MMM y G","dateFormatItem-yMMMEd":"E, d MMM y","quarters-standAlone-wide":["I kwarta\u0142","II kwarta\u0142","III kwarta\u0142","IV kwarta\u0142"],"days-format-narrow":"NPW\u015aCPS".split(""),"dateTimeFormats-appendItem-Timezone":"{0} {1}",
|
||||
"field-mon-relative+-1":"w zesz\u0142y poniedzia\u0142ek","dateFormatItem-GyMMM":"MMM y G","field-month":"miesi\u0105c","dateFormatItem-MMM":"LLL","field-dayperiod":"rano / po po\u0142udniu / wieczorem","dayPeriods-format-narrow-pm":"p","dateFormat-medium":"d MMM y",eraAbbr:["p.n.e.","n.e."],"quarters-standAlone-abbr":["1 kw.","2 kw.","3 kw.","4 kw."],"dayPeriods-format-abbr-pm":"PM","field-mon-relative+0":"w ten poniedzia\u0142ek","field-mon-relative+1":"w przysz\u0142y poniedzia\u0142ek","months-format-narrow":"slmkmclswplg".split(""),
|
||||
"days-format-short":"niedz. pon. wt. \u015br. czw. pt. sob.".split(" "),"quarters-format-narrow":["1","2","3","4"],"dayPeriods-format-wide-pm":"PM","field-sat-relative+-1":"w zesz\u0142\u0105 sobot\u0119","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dateTimeFormat-long":"{1} {0}","dateFormatItem-Md":"d.MM","field-hour":"godzina","dateFormatItem-yQQQQ":"QQQQ y","months-format-wide":"stycznia lutego marca kwietnia maja czerwca lipca sierpnia wrze\u015bnia pa\u017adziernika listopada grudnia".split(" "),
|
||||
"dateFormat-full":"EEEE, d MMMM y","field-month-relative+-1":"w zesz\u0142ym miesi\u0105cu","dayPeriods-format-wide-earlyMorning":"nad ranem","dateFormatItem-Hms":"HH:mm:ss","field-fri-relative+0":"w ten pi\u0105tek","field-fri-relative+1":"w przysz\u0142y pi\u0105tek","dayPeriods-format-narrow-noon":"n","dayPeriods-format-wide-morning":"rano","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})",_localized:{},"field-week-relative+-1":"Zesz\u0142y tydzie\u0144","dateFormatItem-Ehm":"E, h:mm a","months-format-abbr":"sty lut mar kwi maj cze lip sie wrz pa\u017a lis gru".split(" "),
|
||||
"timeFormat-long":"HH:mm:ss z","dateFormatItem-yMMM":"LLL y","dateFormat-short":"dd.MM.y","days-standAlone-wide":"niedziela poniedzia\u0142ek wtorek \u015broda czwartek pi\u0105tek sobota".split(" "),"dateTimeFormats-appendItem-Era":"{1} {0}","dateFormatItem-MMMMd":"d MMMM","dateFormatItem-H":"HH","dateFormatItem-M":"L","months-standAlone-wide":"stycze\u0144 luty marzec kwiecie\u0144 maj czerwiec lipiec sierpie\u0144 wrzesie\u0144 pa\u017adziernik listopad grudzie\u0144".split(" "),"field-sun-relative+-1":"w zesz\u0142\u0105 niedziel\u0119",
|
||||
"days-standAlone-abbr":"niedz. pon. wt. \u015br. czw. pt. sob.".split(" "),"dateTimeFormat-full":"{1} {0}","dateFormatItem-hm":"h:mm a","dateFormatItem-d":"d","field-weekday":"dzie\u0144 tygodnia","field-sat-relative+0":"w t\u0119 sobot\u0119","dateFormatItem-h":"h a","field-sat-relative+1":"w przysz\u0142\u0105 sobot\u0119","dayPeriods-format-wide-lateMorning":"przed po\u0142udniem","months-standAlone-abbr":"sty lut mar kwi maj cze lip sie wrz pa\u017a lis gru".split(" "),"dateFormatItem-yMM":"MM.y",
|
||||
"timeFormat-full":"HH:mm:ss zzzz","dateFormatItem-MEd":"E, d.MM","dateFormatItem-y":"y","field-thu-relative+0":"w ten czwartek","field-thu-relative+1":"w przysz\u0142y czwartek","dateFormatItem-hms":"h:mm:ss a","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dayPeriods-format-abbr-noon":"noon","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-thu-relative+-1":"w zesz\u0142y czwartek","dateFormatItem-yMd":"d.MM.y","field-week":"tydzie\u0144","quarters-standAlone-narrow":["1","2","3","4"],
|
||||
"quarters-format-wide":["I kwarta\u0142","II kwarta\u0142","III kwarta\u0142","IV kwarta\u0142"],"dateFormatItem-Ed":"E, d","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","days-standAlone-short":"niedz. pon. wt. \u015br. czw. pt. sob.".split(" "),"dayPeriods-format-wide-evening":"wieczorem","quarters-format-abbr":["K1","K2","K3","K4"],"field-year-relative+0":"w tym roku","field-year-relative+1":"w przysz\u0142ym roku","field-fri-relative+-1":"w zesz\u0142y pi\u0105tek",eraNarrow:["p.n.e.","n.e."],
|
||||
"dayPeriods-format-wide-noon":"w po\u0142udnie","dateFormatItem-yQQQ":"QQQ y","days-format-wide":"niedziela poniedzia\u0142ek wtorek \u015broda czwartek pi\u0105tek sobota".split(" "),"dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateFormatItem-EHm":"E, HH:mm","field-zone":"strefa czasowa","dateFormatItem-yM":"MM.y","dateFormatItem-yMMMM":"LLLL y","dateFormatItem-MMMEd":"E, d MMM","dateFormatItem-EHms":"E, HH:mm:ss","dateFormatItem-yMEd":"E, d.MM.y","field-day-relative+-1":"wczoraj","field-day-relative+-2":"przedwczoraj",
|
||||
"days-format-abbr":"niedz. pon. wt. \u015br. czw. pt. sob.".split(" "),"field-sun-relative+0":"w t\u0119 niedziel\u0119","dateFormatItem-MMdd":"d.MM","field-sun-relative+1":"w przysz\u0142\u0105 niedziel\u0119","dateFormatItem-yMMMd":"d MMM y","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-Gy":"y G","field-era":"era"},"dijit/nls/loading":{_localized:{},loadingState:"\u0141adowanie...",errorState:"Niestety, wyst\u0105pi\u0142 b\u0142\u0105d"},"dojo/cldr/nls/number":{scientificFormat:"#E0",
|
||||
"currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},"decimalFormat-short":"000\u00a0bln","currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"#,##0.00\u00a0\u00a4;(#,##0.00\u00a0\u00a4)","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",
|
||||
perMille:"\u2030",group:"\u00a0",percentFormat:"#,##0%","decimalFormat-long":"000 biliona",decimalFormat:"#,##0.###",decimal:",","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"Poprzednie wybory",_localized:{},nextMessage:"Wi\u0119cej wybor\u00f3w"},"dijit/nls/common":{buttonOk:"OK",buttonCancel:"Anuluj",_localized:{},buttonSave:"Zapisz",itemClose:"Zamknij"}});
|
||||
//# sourceMappingURL=dojo_pl.js.map
|
||||
17
Server/www/spiderbasic/dojo/nls/dojo_pt-br.js
Normal file
@ -0,0 +1,17 @@
|
||||
//>>built
|
||||
define("dojo/nls/dojo_pt-br",{"dijit/form/nls/validate":{invalidMessage:"O valor inserido n\u00e3o \u00e9 v\u00e1lido.",rangeMessage:"Este valor est\u00e1 fora do intervalo. ",_localized:{},missingMessage:"Este valor \u00e9 necess\u00e1rio."},"dojo/cldr/nls/gregorian":{"dateFormatItem-Ehm":"E, h:mm a","days-standAlone-short":"dom seg ter qua qui sex s\u00e1b".split(" "),"months-format-narrow":"JFMAMJJASOND".split(""),"field-second-relative+0":"agora","quarters-standAlone-narrow":["1","2","3","4"],
|
||||
"field-weekday":"Dia da semana","dateFormatItem-yQQQ":"y QQQ","dateFormatItem-yMEd":"E, dd/MM/y","field-wed-relative+0":"esta quarta-feira","field-wed-relative+1":"pr\u00f3xima quarta-feira","dateFormatItem-GyMMMEd":"E, d 'de' MMM 'de' y G","dateFormatItem-MMMEd":"E, d 'de' MMM",eraNarrow:["a.C.","d.C."],"dateFormatItem-yMM":"MM/y","field-tue-relative+-1":"ter\u00e7a-feira passada","dayPeriods-format-wide-morning":"manh\u00e3","days-format-short":"dom seg ter qua qui sex s\u00e1b".split(" "),"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}",
|
||||
"dateFormat-long":"d 'de' MMMM 'de' y","field-fri-relative+-1":"sexta-feira passada","field-wed-relative+-1":"quarta-feira passada","months-format-wide":"janeiro fevereiro mar\u00e7o abril maio junho julho agosto setembro outubro novembro dezembro".split(" "),"dateTimeFormat-medium":"{1} {0}","dayPeriods-format-wide-pm":"PM","dateFormat-full":"EEEE, d 'de' MMMM 'de' y","field-thu-relative+-1":"quinta-feira passada","dateFormatItem-Md":"d/M",_localized:{},"dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})",
|
||||
"dayPeriods-format-wide-noon":"meio-dia","dateFormatItem-yMd":"dd/MM/y","field-era":"Era","dateFormatItem-yM":"MM/y","months-standAlone-wide":"janeiro fevereiro mar\u00e7o abril maio junho julho agosto setembro outubro novembro dezembro".split(" "),"timeFormat-short":"HH:mm","quarters-format-wide":["1\u00ba trimestre","2\u00ba trimestre","3\u00ba trimestre","4\u00ba trimestre"],"dateFormatItem-yQQQQ":"y QQQQ","timeFormat-long":"HH:mm:ss z","field-year":"Ano","dateFormatItem-yMMM":"MMM 'de' y","dateTimeFormats-appendItem-Era":"{1} {0}",
|
||||
"field-hour":"Hora","dateFormatItem-MMdd":"dd/MM","months-format-abbr":"jan fev mar abr mai jun jul ago set out nov dez".split(" "),"field-sat-relative+0":"este s\u00e1bado","field-sat-relative+1":"pr\u00f3ximo s\u00e1bado","timeFormat-full":"HH:mm:ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-day-relative+0":"hoje","field-thu-relative+0":"esta quinta-feira","field-day-relative+1":"amanh\u00e3","field-thu-relative+1":"pr\u00f3xima quinta-feira","dateFormatItem-GyMMMd":"d 'de' MMM 'de' y G",
|
||||
"field-day-relative+2":"depois de amanh\u00e3","dateFormatItem-H":"HH","months-standAlone-abbr":"jan fev mar abr mai jun jul ago set out nov dez".split(" "),"quarters-format-abbr":["T1","T2","T3","T4"],"quarters-standAlone-wide":["1\u00ba trimestre","2\u00ba trimestre","3\u00ba trimestre","4\u00ba trimestre"],"dateFormatItem-Gy":"y G","dateFormatItem-HHmmss":"HH:mm:ss","dateFormatItem-M":"L","days-standAlone-wide":"domingo segunda-feira ter\u00e7a-feira quarta-feira quinta-feira sexta-feira s\u00e1bado".split(" "),
|
||||
"dayPeriods-format-abbr-noon":"noon","timeFormat-medium":"HH:mm:ss","field-sun-relative+0":"este domingo","dateFormatItem-Hm":"HH:mm","field-sun-relative+1":"pr\u00f3ximo domingo","quarters-standAlone-abbr":["T1","T2","T3","T4"],eraAbbr:["a.C.","d.C."],"field-minute":"Minuto","field-dayperiod":"Per\u00edodo do dia","days-standAlone-abbr":"dom seg ter qua qui sex s\u00e1b".split(" "),"dayPeriods-format-wide-night":"noite","dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1",
|
||||
"2","3","4"],"field-day-relative+-1":"ontem","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"a","dateFormatItem-h":"h a","field-day-relative+-2":"anteontem","dateFormatItem-MMMd":"d 'de' MMM","dateFormatItem-MEd":"E, dd/MM","dateTimeFormat-full":"{1} {0}","field-fri-relative+0":"esta sexta-feira","field-fri-relative+1":"pr\u00f3xima sexta-feira","field-day":"Dia","days-format-wide":"domingo segunda-feira ter\u00e7a-feira quarta-feira quinta-feira sexta-feira s\u00e1bado".split(" "),
|
||||
"field-zone":"Fuso","months-standAlone-narrow":"JFMAMJJASOND".split(""),"dateFormatItem-y":"y","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-year-relative+-1":"ano passado","field-month-relative+-1":"m\u00eas passado","dateTimeFormats-appendItem-Year":"{1} {0}","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-abbr":"dom seg ter qua qui sex s\u00e1b".split(" "),eraNames:["Antes de Cristo","Ano do Senhor"],"dateFormatItem-yMMMd":"d 'de' MMM 'de' y",
|
||||
"days-format-narrow":"DSTQQSS".split(""),"field-month":"M\u00eas","days-standAlone-narrow":"DSTQQSS".split(""),"dateFormatItem-MMM":"LLL","dateFormatItem-HHmm":"HH:mm","field-tue-relative+0":"esta ter\u00e7a-feira","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","field-tue-relative+1":"pr\u00f3xima ter\u00e7a-feira","dayPeriods-format-wide-am":"AM","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-EHm":"E, HH:mm","field-mon-relative+0":"esta segunda-feira",
|
||||
"field-mon-relative+1":"pr\u00f3xima segunda-feira","dateFormat-short":"dd/MM/yy","dayPeriods-format-wide-afternoon":"tarde","dateFormatItem-EHms":"E, HH:mm:ss","dateFormatItem-Ehms":"E, h:mm:ss a","dayPeriods-format-narrow-noon":"n","field-second":"Segundo","field-sat-relative+-1":"s\u00e1bado passado","dateFormatItem-yMMMEd":"E, d 'de' MMM 'de' y","field-sun-relative+-1":"domingo passado","field-month-relative+0":"este m\u00eas","field-month-relative+1":"pr\u00f3ximo m\u00eas","dateTimeFormats-appendItem-Timezone":"{0} {1}",
|
||||
"dateFormatItem-Ed":"E, d","field-week":"Semana","dateFormat-medium":"dd/MM/y","field-week-relative+-1":"semana passada","field-year-relative+0":"este ano","field-year-relative+1":"pr\u00f3ximo ano","dayPeriods-format-narrow-pm":"p","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a","dateFormatItem-GyMMM":"MMM 'de' y G","field-mon-relative+-1":"segunda-feira passada","field-week-relative+0":"esta semana","field-week-relative+1":"pr\u00f3xima semana"},
|
||||
"dijit/nls/loading":{_localized:{},loadingState:"Carregando...",errorState:"Desculpe, ocorreu um erro"},"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},"decimalFormat-short":"000\u00a0tri","currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",
|
||||
currencyFormat:"\u00a4#,##0.00;(\u00a4#,##0.00)","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:".",percentFormat:"#,##0%","decimalFormat-long":"000 trilh\u00f5es",decimalFormat:"#,##0.###",decimal:",","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"Op\u00e7\u00f5es anteriores",_localized:{},nextMessage:"Mais op\u00e7\u00f5es"},"dijit/nls/common":{buttonOk:"OK",buttonCancel:"Cancelar",_localized:{},
|
||||
buttonSave:"Salvar",itemClose:"Fechar"}});
|
||||
//# sourceMappingURL=dojo_pt-br.js.map
|
||||
17
Server/www/spiderbasic/dojo/nls/dojo_pt-pt.js
Normal file
@ -0,0 +1,17 @@
|
||||
//>>built
|
||||
define("dojo/nls/dojo_pt-pt",{"dijit/form/nls/validate":{invalidMessage:"O valor introduzido n\u00e3o \u00e9 v\u00e1lido.",rangeMessage:"Este valor encontra-se fora do intervalo.",_localized:{},missingMessage:"Este valor \u00e9 requerido."},"dojo/cldr/nls/gregorian":{"dateTimeFormats-appendItem-Year":"{1} {0}","field-tue-relative+-1":"ter\u00e7a-feira passada","field-year":"Ano","dateFormatItem-Hm":"HH:mm","field-wed-relative+0":"esta quarta-feira","field-wed-relative+1":"pr\u00f3xima quarta-feira",
|
||||
"dayPeriods-format-wide-night":"noite","dateFormatItem-ms":"mm:ss","timeFormat-short":"HH:mm","field-minute":"Minuto","dateTimeFormat-short":"{1}, {0}","field-day-relative+0":"hoje","field-day-relative+1":"amanh\u00e3","field-day-relative+2":"depois de amanh\u00e3","field-tue-relative+0":"esta ter\u00e7a-feira","field-tue-relative+1":"pr\u00f3xima ter\u00e7a-feira","dayPeriods-format-narrow-am":"a.m.","dateFormatItem-MMMd":"d/MM","dayPeriods-format-abbr-am":"a.m.","field-week-relative+0":"esta semana",
|
||||
"field-month-relative+0":"este m\u00eas","field-week-relative+1":"pr\u00f3xima semana","field-month-relative+1":"pr\u00f3ximo m\u00eas","timeFormat-medium":"HH:mm:ss","field-second-relative+0":"agora","dayPeriods-format-wide-afternoon":"tarde","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","months-standAlone-narrow":"JFMAMJJASOND".split(""),eraNames:["a.C.","d.C."],"dayPeriods-standAlone-abbr-pm":"p.m.","dateFormatItem-GyMMMEd":"E, d 'de' MMM 'de' y G","field-day":"Dia","field-year-relative+-1":"ano passado",
|
||||
"dayPeriods-format-wide-am":"da manh\u00e3","field-wed-relative+-1":"quarta-feira passada","dateTimeFormat-medium":"{1}, {0}","field-second":"Segundo","days-standAlone-narrow":"DSTQQSS".split(""),"dayPeriods-standAlone-wide-pm":"p.m.","dateFormatItem-Ehms":"E, h:mm:ss a","dateFormat-long":"d 'de' MMMM 'de' y","dateFormatItem-GyMMMd":"d 'de' MMM 'de' y G","dateFormatItem-yMMMEd":"E, d/MM/y","quarters-standAlone-wide":["1.\u00ba trimestre","2.\u00ba trimestre","3.\u00ba trimestre","4.\u00ba trimestre"],
|
||||
"days-format-narrow":"DSTQQSS".split(""),"dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormatItem-HHmm":"HH:mm","field-mon-relative+-1":"segunda-feira passada","dateFormatItem-GyMMM":"MMM 'de' y G","field-month":"M\u00eas","dateFormatItem-MMM":"LLL","field-dayperiod":"Da manh\u00e3/da tarde","dayPeriods-format-narrow-pm":"p.m.","dateFormat-medium":"dd/MM/y",eraAbbr:["a.C.","d.C."],"quarters-standAlone-abbr":["T1","T2","T3","T4"],"dayPeriods-format-abbr-pm":"p.m.","field-mon-relative+0":"esta segunda-feira",
|
||||
"field-mon-relative+1":"pr\u00f3xima segunda-feira","months-format-narrow":"JFMAMJJASOND".split(""),"days-format-short":"do sg te qu qi sx sb".split(" "),"quarters-format-narrow":["1","2","3","4"],"dayPeriods-format-wide-pm":"da tarde","field-sat-relative+-1":"s\u00e1bado passado","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dateTimeFormat-long":"{1} '\u00e0s' {0}","dateFormatItem-Md":"d/M","field-hour":"Hora","dateFormatItem-yQQQQ":"QQQQ 'de' y","months-format-wide":"Janeiro Fevereiro Mar\u00e7o Abril Maio Junho Julho Agosto Setembro Outubro Novembro Dezembro".split(" "),
|
||||
"dateFormat-full":"EEEE, d 'de' MMMM 'de' y","field-month-relative+-1":"m\u00eas passado","dateFormatItem-Hms":"HH:mm:ss","field-fri-relative+0":"esta sexta-feira","field-fri-relative+1":"pr\u00f3xima sexta-feira","dayPeriods-format-narrow-noon":"n","dayPeriods-format-wide-morning":"manh\u00e3","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})",_localized:{},"field-week-relative+-1":"semana passada","dateFormatItem-Ehm":"E, h:mm a","months-format-abbr":"Jan Fev Mar Abr Mai Jun Jul Ago Set Out Nov Dez".split(" "),
|
||||
"timeFormat-long":"HH:mm:ss z","dateFormatItem-yMMM":"MM/y","dateFormat-short":"dd/MM/yy","days-standAlone-wide":"domingo segunda-feira ter\u00e7a-feira quarta-feira quinta-feira sexta-feira s\u00e1bado".split(" "),"dateTimeFormats-appendItem-Era":"{1} {0}","dateFormatItem-yMMMEEEEd":"EEEE, d/MM/y","dateFormatItem-MMMMd":"d 'de' MMMM","dateFormatItem-H":"HH","dateFormatItem-M":"L","months-standAlone-wide":"Janeiro Fevereiro Mar\u00e7o Abril Maio Junho Julho Agosto Setembro Outubro Novembro Dezembro".split(" "),
|
||||
"dateFormatItem-yMMMMEd":"E, d 'de' MMMM 'de' y","field-sun-relative+-1":"domingo passado","days-standAlone-abbr":"dom seg ter qua qui sex s\u00e1b".split(" "),"dateFormatItem-MMMMEd":"E, d 'de' MMMM","dateTimeFormat-full":"{1} '\u00e0s' {0}","dateFormatItem-HHmmss":"HH:mm:ss","dateFormatItem-hm":"h:mm a","dateFormatItem-d":"d","field-weekday":"Dia da semana","field-sat-relative+0":"este s\u00e1bado","dateFormatItem-h":"h a","field-sat-relative+1":"pr\u00f3ximo s\u00e1bado","months-standAlone-abbr":"Jan Fev Mar Abr Mai Jun Jul Ago Set Out Nov Dez".split(" "),
|
||||
"dateFormatItem-yMM":"MM/y","timeFormat-full":"HH:mm:ss zzzz","dateFormatItem-MEd":"E, dd/MM","dateFormatItem-y":"y","field-thu-relative+0":"esta quinta-feira","field-thu-relative+1":"pr\u00f3xima quinta-feira","dateFormatItem-hms":"h:mm:ss a","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dayPeriods-format-abbr-noon":"noon","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-thu-relative+-1":"quinta-feira passada","dateFormatItem-yMd":"dd/MM/y","field-week":"Semana","quarters-standAlone-narrow":["1",
|
||||
"2","3","4"],"quarters-format-wide":["1.\u00ba trimestre","2.\u00ba trimestre","3.\u00ba trimestre","4.\u00ba trimestre"],"dateFormatItem-Ed":"E, d","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","days-standAlone-short":"do sg te qu qi sx sb".split(" "),"quarters-format-abbr":["T1","T2","T3","T4"],"field-year-relative+0":"este ano","field-year-relative+1":"pr\u00f3ximo ano","field-fri-relative+-1":"sexta-feira passada",eraNarrow:["a.C.","d.C."],"dayPeriods-format-wide-noon":"meio-dia","dateFormatItem-yQQQ":"QQQQ 'de' y",
|
||||
"days-format-wide":"domingo segunda-feira ter\u00e7a-feira quarta-feira quinta-feira sexta-feira s\u00e1bado".split(" "),"dateFormatItem-yMMMMd":"d 'de' MMMM 'de' y","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateFormatItem-EHm":"E, HH:mm","field-zone":"Fuso hor\u00e1rio","dateFormatItem-yM":"MM/y","dateFormatItem-yMMMM":"MMMM 'de' y","dateFormatItem-MMMEd":"E, d/MM","dateFormatItem-EHms":"E, HH:mm:ss","dateFormatItem-yMEd":"E, dd/MM/y","field-day-relative+-1":"ontem","dayPeriods-standAlone-abbr-am":"a.m.",
|
||||
"field-day-relative+-2":"anteontem","days-format-abbr":"dom seg ter qua qui sex s\u00e1b".split(" "),"field-sun-relative+0":"este domingo","dateFormatItem-MMdd":"dd/MM","field-sun-relative+1":"pr\u00f3ximo domingo","dateFormatItem-yMMMd":"d/MM/y","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-Gy":"y G","field-era":"Era","dayPeriods-standAlone-wide-am":"a.m."},"dijit/nls/loading":{_localized:{},loadingState:"A carregar...",errorState:"Lamentamos, mas ocorreu um erro"},"dojo/cldr/nls/number":{scientificFormat:"#E0",
|
||||
"currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},"decimalFormat-short":"000\u00a0Bi","currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"#,##0.00\u00a0\u00a4;(#,##0.00\u00a0\u00a4)","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",
|
||||
perMille:"\u2030",group:"\u00a0",percentFormat:"#,##0%","decimalFormat-long":"000 bili\u00f5es",decimalFormat:"#,##0.###",decimal:",","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"Op\u00e7\u00f5es anteriores",_localized:{},nextMessage:"Mais op\u00e7\u00f5es"},"dijit/nls/common":{buttonOk:"OK",buttonCancel:"Cancelar",_localized:{},buttonSave:"Guardar",itemClose:"Fechar"}});
|
||||
//# sourceMappingURL=dojo_pt-pt.js.map
|
||||
26
Server/www/spiderbasic/dojo/nls/dojo_ru.js
Normal file
@ -0,0 +1,26 @@
|
||||
//>>built
|
||||
define("dojo/nls/dojo_ru",{"dijit/form/nls/validate":{invalidMessage:"\u0423\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.",rangeMessage:"\u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u043d\u0435 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430.",_localized:{},missingMessage:"\u042d\u0442\u043e \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435."},
|
||||
"dojo/cldr/nls/gregorian":{"dateFormatItem-Ehm":"E h:mm a","days-standAlone-short":"\u0432\u0441 \u043f\u043d \u0432\u0442 \u0441\u0440 \u0447\u0442 \u043f\u0442 \u0441\u0431".split(" "),"months-format-narrow":"\u042f\u0424\u041c\u0410\u041c\u0418\u0418\u0410\u0421\u041e\u041d\u0414".split(""),"field-second-relative+0":"\u0441\u0435\u0439\u0447\u0430\u0441","quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"\u0414\u0435\u043d\u044c \u043d\u0435\u0434\u0435\u043b\u0438","dateFormatItem-yQQQ":"QQQ y '\u0433'.",
|
||||
"dateFormatItem-yMEd":"ccc, d.MM.y '\u0433'.","field-wed-relative+0":"\u0432 \u044d\u0442\u0443 \u0441\u0440\u0435\u0434\u0443","field-wed-relative+1":"\u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0440\u0435\u0434\u0443","dateFormatItem-GyMMMEd":"E, d MMM y G","dateFormatItem-MMMEd":"ccc, d MMM",eraNarrow:["\u0434\u043e \u043d.\u044d.","\u043d.\u044d."],"dateFormatItem-yMM":"MM.y","field-tue-relative+-1":"\u0432 \u043f\u0440\u043e\u0448\u043b\u044b\u0439 \u0432\u0442\u043e\u0440\u043d\u0438\u043a",
|
||||
"days-format-short":"\u0432\u0441 \u043f\u043d \u0432\u0442 \u0441\u0440 \u0447\u0442 \u043f\u0442 \u0441\u0431".split(" "),"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"d MMMM y '\u0433'.","field-fri-relative+-1":"\u0432 \u043f\u0440\u043e\u0448\u043b\u0443\u044e \u043f\u044f\u0442\u043d\u0438\u0446\u0443","field-wed-relative+-1":"\u0432 \u043f\u0440\u043e\u0448\u043b\u0443\u044e \u0441\u0440\u0435\u0434\u0443","months-format-wide":"\u044f\u043d\u0432\u0430\u0440\u044f \u0444\u0435\u0432\u0440\u0430\u043b\u044f \u043c\u0430\u0440\u0442\u0430 \u0430\u043f\u0440\u0435\u043b\u044f \u043c\u0430\u044f \u0438\u044e\u043d\u044f \u0438\u044e\u043b\u044f \u0430\u0432\u0433\u0443\u0441\u0442\u0430 \u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044f \u043e\u043a\u0442\u044f\u0431\u0440\u044f \u043d\u043e\u044f\u0431\u0440\u044f \u0434\u0435\u043a\u0430\u0431\u0440\u044f".split(" "),
|
||||
"dateTimeFormat-medium":"{1}, {0}","dayPeriods-format-wide-pm":"PM","dateFormat-full":"EEEE, d MMMM y '\u0433'.","field-thu-relative+-1":"\u0432 \u043f\u0440\u043e\u0448\u043b\u044b\u0439 \u0447\u0435\u0442\u0432\u0435\u0440\u0433","dateFormatItem-Md":"dd.MM",_localized:{},"dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dayPeriods-format-wide-noon":"noon","dateFormatItem-yMd":"dd.MM.y","field-era":"\u042d\u0440\u0430","dateFormatItem-yM":"MM.y","months-standAlone-wide":"\u042f\u043d\u0432\u0430\u0440\u044c \u0424\u0435\u0432\u0440\u0430\u043b\u044c \u041c\u0430\u0440\u0442 \u0410\u043f\u0440\u0435\u043b\u044c \u041c\u0430\u0439 \u0418\u044e\u043d\u044c \u0418\u044e\u043b\u044c \u0410\u0432\u0433\u0443\u0441\u0442 \u0421\u0435\u043d\u0442\u044f\u0431\u0440\u044c \u041e\u043a\u0442\u044f\u0431\u0440\u044c \u041d\u043e\u044f\u0431\u0440\u044c \u0414\u0435\u043a\u0430\u0431\u0440\u044c".split(" "),
|
||||
"timeFormat-short":"H:mm","quarters-format-wide":["1-\u0439 \u043a\u0432\u0430\u0440\u0442\u0430\u043b","2-\u0439 \u043a\u0432\u0430\u0440\u0442\u0430\u043b","3-\u0439 \u043a\u0432\u0430\u0440\u0442\u0430\u043b","4-\u0439 \u043a\u0432\u0430\u0440\u0442\u0430\u043b"],"dateFormatItem-yQQQQ":"QQQQ y '\u0433'.","timeFormat-long":"H:mm:ss z","field-year":"\u0413\u043e\u0434","dateFormatItem-yMMM":"LLL y","dateTimeFormats-appendItem-Era":"{1} {0}","field-hour":"\u0427\u0430\u0441","dateFormatItem-MMdd":"dd.MM",
|
||||
"months-format-abbr":"\u044f\u043d\u0432. \u0444\u0435\u0432\u0440. \u043c\u0430\u0440\u0442\u0430 \u0430\u043f\u0440. \u043c\u0430\u044f \u0438\u044e\u043d\u044f \u0438\u044e\u043b\u044f \u0430\u0432\u0433. \u0441\u0435\u043d\u0442. \u043e\u043a\u0442. \u043d\u043e\u044f\u0431. \u0434\u0435\u043a.".split(" "),"field-sat-relative+0":"\u0432 \u044d\u0442\u0443 \u0441\u0443\u0431\u0431\u043e\u0442\u0443","field-sat-relative+1":"\u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0443\u0431\u0431\u043e\u0442\u0443",
|
||||
"timeFormat-full":"H:mm:ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-day-relative+0":"\u0441\u0435\u0433\u043e\u0434\u043d\u044f","dateFormatItem-E":"ccc","field-thu-relative+0":"\u0432 \u044d\u0442\u043e\u0442 \u0447\u0435\u0442\u0432\u0435\u0440\u0433","field-day-relative+1":"\u0437\u0430\u0432\u0442\u0440\u0430","field-thu-relative+1":"\u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0447\u0435\u0442\u0432\u0435\u0440\u0433","dateFormatItem-GyMMMd":"d MMM y '\u0433'. G",
|
||||
"field-day-relative+2":"\u043f\u043e\u0441\u043b\u0435\u0437\u0430\u0432\u0442\u0440\u0430","dateFormatItem-H":"H","months-standAlone-abbr":"\u042f\u043d\u0432. \u0424\u0435\u0432\u0440. \u041c\u0430\u0440\u0442 \u0410\u043f\u0440. \u041c\u0430\u0439 \u0418\u044e\u043d\u044c \u0418\u044e\u043b\u044c \u0410\u0432\u0433. \u0421\u0435\u043d\u0442. \u041e\u043a\u0442. \u041d\u043e\u044f\u0431. \u0414\u0435\u043a.".split(" "),"quarters-format-abbr":["1-\u0439 \u043a\u0432.","2-\u0439 \u043a\u0432.","3-\u0439 \u043a\u0432.",
|
||||
"4-\u0439 \u043a\u0432."],"quarters-standAlone-wide":["1-\u0439 \u043a\u0432\u0430\u0440\u0442\u0430\u043b","2-\u0439 \u043a\u0432\u0430\u0440\u0442\u0430\u043b","3-\u0439 \u043a\u0432\u0430\u0440\u0442\u0430\u043b","4-\u0439 \u043a\u0432\u0430\u0440\u0442\u0430\u043b"],"dateFormatItem-Gy":"y G","dateFormatItem-M":"L","days-standAlone-wide":"\u0412\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435 \u041f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a \u0412\u0442\u043e\u0440\u043d\u0438\u043a \u0421\u0440\u0435\u0434\u0430 \u0427\u0435\u0442\u0432\u0435\u0440\u0433 \u041f\u044f\u0442\u043d\u0438\u0446\u0430 \u0421\u0443\u0431\u0431\u043e\u0442\u0430".split(" "),
|
||||
"dateFormatItem-yLLLL":"LLLL y","dayPeriods-format-abbr-noon":"noon","timeFormat-medium":"H:mm:ss","field-sun-relative+0":"\u0432 \u044d\u0442\u043e \u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435","dateFormatItem-Hm":"H:mm","field-sun-relative+1":"\u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435","quarters-standAlone-abbr":["1-\u0439 \u043a\u0432.","2-\u0439 \u043a\u0432.","3-\u0439 \u043a\u0432.",
|
||||
"4-\u0439 \u043a\u0432."],eraAbbr:["\u0434\u043e \u043d. \u044d.","\u043d. \u044d."],"field-minute":"\u041c\u0438\u043d\u0443\u0442\u0430","field-dayperiod":"\u0414\u041f/\u041f\u041f","days-standAlone-abbr":"\u0412\u0441 \u041f\u043d \u0412\u0442 \u0421\u0440 \u0427\u0442 \u041f\u0442 \u0421\u0431".split(" "),"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"field-day-relative+-1":"\u0432\u0447\u0435\u0440\u0430","dateTimeFormat-long":"{1}, {0}","dayPeriods-format-narrow-am":"AM",
|
||||
"dateFormatItem-h":"h a","field-day-relative+-2":"\u043f\u043e\u0437\u0430\u0432\u0447\u0435\u0440\u0430","dateFormatItem-MMMd":"d MMM","dateFormatItem-MEd":"E, dd.MM","dateTimeFormat-full":"{1}, {0}","field-fri-relative+0":"\u0432 \u044d\u0442\u0443 \u043f\u044f\u0442\u043d\u0438\u0446\u0443","field-fri-relative+1":"\u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043f\u044f\u0442\u043d\u0438\u0446\u0443","dateFormatItem-yMMMM":"LLLL y","field-day":"\u0414\u0435\u043d\u044c","days-format-wide":"\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435 \u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a \u0432\u0442\u043e\u0440\u043d\u0438\u043a \u0441\u0440\u0435\u0434\u0430 \u0447\u0435\u0442\u0432\u0435\u0440\u0433 \u043f\u044f\u0442\u043d\u0438\u0446\u0430 \u0441\u0443\u0431\u0431\u043e\u0442\u0430".split(" "),
|
||||
"field-zone":"\u0427\u0430\u0441\u043e\u0432\u043e\u0439 \u043f\u043e\u044f\u0441","months-standAlone-narrow":"\u042f\u0424\u041c\u0410\u041c\u0418\u0418\u0410\u0421\u041e\u041d\u0414".split(""),"dateFormatItem-y":"y","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-year-relative+-1":"\u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u043c \u0433\u043e\u0434\u0443","field-month-relative+-1":"\u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u043c \u043c\u0435\u0441\u044f\u0446\u0435","dateTimeFormats-appendItem-Year":"{1} {0}",
|
||||
"dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-abbr":"\u0432\u0441 \u043f\u043d \u0432\u0442 \u0441\u0440 \u0447\u0442 \u043f\u0442 \u0441\u0431".split(" "),eraNames:["\u0434\u043e \u043d.\u044d.","\u043d.\u044d."],"dateFormatItem-yMMMd":"d MMM y '\u0433'.","days-format-narrow":"\u0432\u0441 \u043f\u043d \u0432\u0442 \u0441\u0440 \u0447\u0442 \u043f\u0442 \u0441\u0431".split(" "),"field-month":"\u041c\u0435\u0441\u044f\u0446",
|
||||
"days-standAlone-narrow":"\u0412\u041f\u0412\u0421\u0427\u041f\u0421".split(""),"dateFormatItem-MMM":"LLL","field-tue-relative+0":"\u0432 \u044d\u0442\u043e\u0442 \u0432\u0442\u043e\u0440\u043d\u0438\u043a","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","field-tue-relative+1":"\u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0432\u0442\u043e\u0440\u043d\u0438\u043a","dayPeriods-format-wide-am":"AM","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})",
|
||||
"dateFormatItem-EHm":"E HH:mm","field-mon-relative+0":"\u0432 \u044d\u0442\u043e\u0442 \u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a","field-mon-relative+1":"\u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a","dateFormat-short":"dd.MM.yy","dateFormatItem-EHms":"E HH:mm:ss","dateFormatItem-Ehms":"E h:mm:ss a","dayPeriods-format-narrow-noon":"n","field-second":"\u0421\u0435\u043a\u0443\u043d\u0434\u0430",
|
||||
"field-sat-relative+-1":"\u0432 \u043f\u0440\u043e\u0448\u043b\u0443\u044e \u0441\u0443\u0431\u0431\u043e\u0442\u0443","dateFormatItem-yMMMEd":"E, d MMM y","field-sun-relative+-1":"\u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u0435 \u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435","field-month-relative+0":"\u0432 \u044d\u0442\u043e\u043c \u043c\u0435\u0441\u044f\u0446\u0435","field-month-relative+1":"\u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043c\u0435\u0441\u044f\u0446\u0435",
|
||||
"dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormatItem-Ed":"ccc, d","field-week":"\u041d\u0435\u0434\u0435\u043b\u044f","dateFormat-medium":"d MMM y '\u0433'.","field-week-relative+-1":"\u043d\u0430 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u043d\u0435\u0434\u0435\u043b\u0435","field-year-relative+0":"\u0432 \u044d\u0442\u043e\u043c\u0443 \u0433\u043e\u0434\u0443","field-year-relative+1":"\u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0433\u043e\u0434\u0443","dayPeriods-format-narrow-pm":"PM",
|
||||
"dateTimeFormat-short":"{1}, {0}","dateFormatItem-Hms":"H:mm:ss","dateFormatItem-hms":"h:mm:ss a","dateFormatItem-GyMMM":"LLL y G","field-mon-relative+-1":"\u0432 \u043f\u0440\u043e\u0448\u043b\u044b\u0439 \u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a","field-week-relative+0":"\u043d\u0430 \u044d\u0442\u043e\u0439 \u043d\u0435\u0434\u0435\u043b\u0435","field-week-relative+1":"\u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043d\u0435\u0434\u0435\u043b\u0435"},
|
||||
"dijit/nls/loading":{_localized:{},loadingState:"\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430...",errorState:"\u0418\u0437\u0432\u0438\u043d\u0438\u0442\u0435, \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430"},"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",
|
||||
_localized:{},"decimalFormat-short":"000\u00a0\u0442\u0440\u043b\u043d","currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"\u043d\u0435\u00a0\u0447\u0438\u0441\u043b\u043e",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"#,##0.00\u00a0\u00a4","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:"\u00a0",percentFormat:"#,##0\u00a0%","decimalFormat-long":"000 \u0442\u0440\u0438\u043b\u043b\u0438\u043e\u043d\u0430",decimalFormat:"#,##0.###",
|
||||
decimal:",","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b",_localized:{},nextMessage:"\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b"},"dijit/nls/common":{buttonOk:"OK",buttonCancel:"\u041e\u0442\u043c\u0435\u043d\u0430",_localized:{},buttonSave:"\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c",
|
||||
itemClose:"\u0417\u0430\u043a\u0440\u044b\u0442\u044c"}});
|
||||
//# sourceMappingURL=dojo_ru.js.map
|
||||
17
Server/www/spiderbasic/dojo/nls/dojo_sk.js
Normal file
@ -0,0 +1,17 @@
|
||||
//>>built
|
||||
define("dojo/nls/dojo_sk",{"dijit/form/nls/validate":{invalidMessage:"Zadan\u00e1 hodnota nie je platn\u00e1.",rangeMessage:"T\u00e1to hodnota je mimo rozsah.",_localized:{},missingMessage:"T\u00e1to hodnota je povinn\u00e1."},"dojo/cldr/nls/gregorian":{"dateFormatItem-Ehm":"E h:mm","days-standAlone-short":"Ne Po Ut St \u0160t Pi So".split(" "),"months-format-narrow":"jfmamjjasond".split(""),"field-second-relative+0":"teraz","quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"De\u0148 v t\u00fd\u017edni",
|
||||
"dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"E d. M. y","field-wed-relative+0":"T\u00fato stredu","field-wed-relative+1":"Bud\u00facu stredu","dateFormatItem-GyMMMEd":"E, d. MMM y G","dateFormatItem-MMMEd":"E, d. MMM.",eraNarrow:["pred n.l.","n.l."],"field-tue-relative+-1":"Minul\u00fd utorok","days-format-short":"Ne Po Ut St \u0160t Pi So".split(" "),"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"d. MMMM y","field-fri-relative+-1":"Minul\u00fd piatok","field-wed-relative+-1":"Minul\u00fa stredu",
|
||||
"months-format-wide":"janu\u00e1ra febru\u00e1ra marca apr\u00edla m\u00e1ja j\u00fana j\u00fala augusta septembra okt\u00f3bra novembra decembra".split(" "),"dateTimeFormat-medium":"{1} {0}","dateFormatItem-yMMMMd":"d. MMMM y","dayPeriods-format-wide-pm":"PM","dateFormat-full":"EEEE, d. MMMM y","field-thu-relative+-1":"Minul\u00fd \u0161tvrtok","dateFormatItem-Md":"d.M.",_localized:{},"dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dayPeriods-format-wide-noon":"noon",
|
||||
"dateFormatItem-yMd":"d.M.y","field-era":"\u00c9ra","dateFormatItem-yM":"M.y","months-standAlone-wide":"janu\u00e1r febru\u00e1r marec apr\u00edl m\u00e1j j\u00fan j\u00fal august september okt\u00f3ber november december".split(" "),"timeFormat-short":"H:mm","quarters-format-wide":["1. \u0161tvr\u0165rok","2. \u0161tvr\u0165rok","3. \u0161tvr\u0165rok","4. \u0161tvr\u0165rok"],"dateFormatItem-yQQQQ":"QQQQ y","timeFormat-long":"H:mm:ss z","field-year":"Rok","dateFormatItem-yMMM":"LLL y","dateTimeFormats-appendItem-Era":"{1} {0}",
|
||||
"field-hour":"Hodina","months-format-abbr":"jan feb mar apr m\u00e1j j\u00fan j\u00fal aug sep okt nov dec".split(" "),"field-sat-relative+0":"T\u00fato sobotu","field-sat-relative+1":"Bud\u00facu sobotu","timeFormat-full":"H:mm:ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-day-relative+0":"Dnes","field-thu-relative+0":"Tento \u0161tvrtok","field-day-relative+1":"Zajtra","field-thu-relative+1":"Bud\u00faci \u0161tvrtok","dateFormatItem-GyMMMd":"d.M.y G","field-day-relative+2":"Pozajtra",
|
||||
"dateFormatItem-H":"H","months-standAlone-abbr":"jan feb mar apr m\u00e1j j\u00fan j\u00fal aug sep okt nov dec".split(" "),"quarters-format-abbr":["Q1","Q2","Q3","Q4"],"quarters-standAlone-wide":["1. \u0161tvr\u0165rok","2. \u0161tvr\u0165rok","3. \u0161tvr\u0165rok","4. \u0161tvr\u0165rok"],"dateFormatItem-Gy":"y G","dateFormatItem-M":"L.","days-standAlone-wide":"nede\u013ea pondelok utorok streda \u0161tvrtok piatok sobota".split(" "),"dateFormatItem-MMMMd":"d. MMMM","dateFormatItem-GyMMMMd":"d. MMMM y G",
|
||||
"dayPeriods-format-abbr-noon":"noon","timeFormat-medium":"H:mm:ss","field-sun-relative+0":"T\u00fato nede\u013eu","dateFormatItem-Hm":"H:mm","field-sun-relative+1":"Bud\u00facu nede\u013eu","quarters-standAlone-abbr":["1Q","2Q","3Q","4Q"],eraAbbr:["pred n.l.","n.l."],"field-minute":"Min\u00fata","field-dayperiod":"\u010cas\u0165 d\u0148a","days-standAlone-abbr":"ne po ut st \u0161t pi so".split(" "),"dateFormatItem-d":"d.","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"field-day-relative+-1":"V\u010dera",
|
||||
"dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"a","dateFormatItem-h":"h a","field-day-relative+-2":"Predv\u010derom","dateFormatItem-MMMd":"d. MMM.","dateFormatItem-MEd":"E, d.M.","dateTimeFormat-full":"{1} {0}","field-fri-relative+0":"Tento piatok","field-fri-relative+1":"Bud\u00faci piatok","dateFormatItem-yMMMM":"LLLL y","field-day":"De\u0148","days-format-wide":"nede\u013ea pondelok utorok streda \u0161tvrtok piatok sobota".split(" "),"field-zone":"\u010casov\u00e9 p\u00e1smo",
|
||||
"months-standAlone-narrow":"jfmamjjasond".split(""),"dateFormatItem-y":"y","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-year-relative+-1":"Minul\u00fd rok","field-month-relative+-1":"Posledn\u00fd mesiac","dateTimeFormats-appendItem-Year":"{1} {0}","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-abbr":"ne po ut st \u0161t pi so".split(" "),eraNames:["pred n.l.","n.l."],"dateFormatItem-yMMMd":"d.M.y","days-format-narrow":"NPUS\u0160PS".split(""),
|
||||
"field-month":"Mesiac","days-standAlone-narrow":"NPUS\u0160PS".split(""),"dateFormatItem-MMM":"LLL","field-tue-relative+0":"Tento utorok","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","field-tue-relative+1":"Bud\u00faci utorok","dayPeriods-format-wide-am":"AM","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-MMMMEd":"E, d. MMMM","dateFormatItem-EHm":"E HH:mm","field-mon-relative+0":"Tento pondelok","field-mon-relative+1":"Bud\u00faci pondelok",
|
||||
"dateFormat-short":"d.M.y","dateFormatItem-EHms":"E HH:mm:ss","dateFormatItem-Ehms":"E h:mm:ss","dayPeriods-format-narrow-noon":"n","field-second":"Sekunda","field-sat-relative+-1":"Minul\u00fa sobotu","dateFormatItem-yMMMEd":"E, d. MMM y","field-sun-relative+-1":"Minul\u00fa nede\u013eu","field-month-relative+0":"Tento mesiac","field-month-relative+1":"Bud\u00faci mesiac","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormatItem-Ed":"E d.","field-week":"T\u00fd\u017ede\u0148","dateFormat-medium":"d.M.y",
|
||||
"field-week-relative+-1":"Minul\u00fd t\u00fd\u017ede\u0148","field-year-relative+0":"Tento rok","field-year-relative+1":"Bud\u00faci rok","dayPeriods-format-narrow-pm":"p","dateFormatItem-mmss":"mm:ss","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"H:mm:ss","dateFormatItem-hms":"h:mm:ss a","dateFormatItem-GyMMM":"LLL y G","field-mon-relative+-1":"Minul\u00fd pondelok","field-week-relative+0":"Tento t\u00fd\u017ede\u0148","field-week-relative+1":"Bud\u00faci t\u00fd\u017ede\u0148"},"dijit/nls/loading":{_localized:{},
|
||||
loadingState:"Zav\u00e1dza sa...",errorState:"\u013dutujeme, ale vyskytla sa chyba"},"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},"decimalFormat-short":"000\u00a0bil'.'","currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",
|
||||
currencyFormat:"#,##0.00\u00a0\u00a4;(#,##0.00\u00a0\u00a4)","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:"\u00a0",percentFormat:"#,##0\u00a0%","decimalFormat-long":"000 bili\u00f3nov",decimalFormat:"#,##0.###",decimal:",","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"Predch\u00e1dzaj\u00face mo\u017enosti",_localized:{},nextMessage:"Viac mo\u017enost\u00ed"},"dijit/nls/common":{buttonOk:"OK",
|
||||
buttonCancel:"Zru\u0161i\u0165",_localized:{},buttonSave:"Ulo\u017ei\u0165",itemClose:"Zatvori\u0165"}});
|
||||
//# sourceMappingURL=dojo_sk.js.map
|
||||
16
Server/www/spiderbasic/dojo/nls/dojo_sl.js
Normal file
@ -0,0 +1,16 @@
|
||||
//>>built
|
||||
define("dojo/nls/dojo_sl",{"dijit/form/nls/validate":{invalidMessage:"Vnesena vrednost ni veljavna.",rangeMessage:"Ta vrednost je izven obmo\u010dja.",_localized:{},missingMessage:"Ta vrednost je zahtevana."},"dojo/cldr/nls/gregorian":{"dateFormatItem-Ehm":"E h.mm a","days-standAlone-short":"ned. pon. tor. sre. \u010det. pet. sob.".split(" "),"months-format-narrow":"jfmamjjasond".split(""),"field-second-relative+0":"zdaj","quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"Dan v tednu",
|
||||
"dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"E, d. M. y","field-wed-relative+0":"To sredo","field-wed-relative+1":"Naslednjo sredo","dateFormatItem-GyMMMEd":"E, d. MMM y G","dateFormatItem-MMMEd":"E, d. MMM",eraNarrow:["pr. n. \u0161t.","po Kr.","po n. \u0161t."],"field-tue-relative+-1":"Prej\u0161nji torek","days-format-short":"ned. pon. tor. sre. \u010det. pet. sob.".split(" "),"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"dd. MMMM y","field-fri-relative+-1":"Prej\u0161nji petek",
|
||||
"field-wed-relative+-1":"Prej\u0161njo sredo","months-format-wide":"januar februar marec april maj junij julij avgust september oktober november december".split(" "),"dateTimeFormat-medium":"{1} {0}","dayPeriods-format-wide-pm":"pop.","dateFormat-full":"EEEE, dd. MMMM y","field-thu-relative+-1":"Prej\u0161nji \u010detrtek","dateFormatItem-Md":"d. M.",_localized:{},"dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dayPeriods-format-wide-noon":"noon","dateFormatItem-yMd":"d. M. y",
|
||||
"field-era":"Doba","dateFormatItem-yM":"M/y","months-standAlone-wide":"januar februar marec april maj junij julij avgust september oktober november december".split(" "),"timeFormat-short":"HH.mm","quarters-format-wide":["1. \u010detrtletje","2. \u010detrtletje","3. \u010detrtletje","4. \u010detrtletje"],"dateFormatItem-yQQQQ":"QQQQ y","timeFormat-long":"HH.mm.ss z","field-year":"Leto","dateFormatItem-yMMM":"MMM y","dateTimeFormats-appendItem-Era":"{1} {0}","field-hour":"Ura","months-format-abbr":"jan. feb. mar. apr. maj jun. jul. avg. sep. okt. nov. dec.".split(" "),
|
||||
"field-sat-relative+0":"To soboto","field-sat-relative+1":"Naslednjo soboto","timeFormat-full":"HH.mm.ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-day-relative+0":"Danes","field-thu-relative+0":"Ta \u010detrtek","field-day-relative+1":"Jutri","field-thu-relative+1":"Naslednji \u010detrtek","dateFormatItem-GyMMMd":"d. MMM y G","field-day-relative+2":"Pojutri\u0161njem","dateFormatItem-H":"HH","months-standAlone-abbr":"jan feb mar apr maj jun jul avg sep okt nov dec".split(" "),
|
||||
"quarters-format-abbr":["Q1","Q2","Q3","Q4"],"quarters-standAlone-wide":["1. \u010detrtletje","2. \u010detrtletje","3. \u010detrtletje","4. \u010detrtletje"],"dateFormatItem-Gy":"y G","dateFormatItem-M":"L","days-standAlone-wide":"nedelja ponedeljek torek sreda \u010detrtek petek sobota".split(" "),"dayPeriods-format-abbr-noon":"noon","timeFormat-medium":"HH.mm.ss","field-sun-relative+0":"To nedeljo","dateFormatItem-Hm":"HH.mm","field-sun-relative+1":"Naslednjo nedeljo","quarters-standAlone-abbr":["Q1",
|
||||
"Q2","Q3","Q4"],eraAbbr:["pr. n. \u0161t.","po Kr.","po n. \u0161t."],"field-minute":"Minuta","field-dayperiod":"\u010cas dneva","days-standAlone-abbr":"ned pon tor sre \u010det pet sob".split(" "),"dateFormatItem-d":"d","dateFormatItem-ms":"mm.ss","quarters-format-narrow":["1","2","3","4"],"field-day-relative+-1":"V\u010deraj","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"a","dateFormatItem-h":"h a","field-day-relative+-2":"Predv\u010deraj\u0161njim","dateFormatItem-MMMd":"d. MMM",
|
||||
"dateFormatItem-MEd":"E, d. MM.","dateTimeFormat-full":"{1} {0}","field-fri-relative+0":"Ta petek","field-fri-relative+1":"Naslednji petek","dateFormatItem-yMMMM":"MMMM y","field-day":"Dan","days-format-wide":"nedelja ponedeljek torek sreda \u010detrtek petek sobota".split(" "),"field-zone":"Obmo\u010dje","months-standAlone-narrow":"jfmamjjasond".split(""),"dateFormatItem-y":"y","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-year-relative+-1":"Lani","field-month-relative+-1":"Prej\u0161nji mesec",
|
||||
"dateTimeFormats-appendItem-Year":"{1} {0}","dateFormatItem-hm":"h.mm a","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-abbr":"ned. pon. tor. sre. \u010det. pet. sob.".split(" "),"dateFormatItem-GyM":"M/y G",eraNames:["pred na\u0161im \u0161tetjem","na\u0161e \u0161tetje","po n. \u0161t."],"dateFormatItem-yMMMd":"d. MMM y","days-format-narrow":"npts\u010dps".split(""),"field-month":"Mesec","days-standAlone-narrow":"npts\u010dps".split(""),"dateFormatItem-MMM":"LLL",
|
||||
"field-tue-relative+0":"Ta torek","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","field-tue-relative+1":"Naslednji torek","dayPeriods-format-wide-am":"dop.","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-EHm":"E HH.mm","field-mon-relative+0":"Ta ponedeljek","field-mon-relative+1":"Naslednji ponedeljek","dateFormat-short":"d. MM. yy","dateFormatItem-EHms":"E HH.mm.ss","dateFormatItem-Ehms":"E h.mm.ss a","dayPeriods-format-narrow-noon":"n",
|
||||
"field-second":"Sekunda","field-sat-relative+-1":"Prej\u0161njo soboto","dateFormatItem-yMMMEd":"E, d. MMM y","field-sun-relative+-1":"Prej\u0161njo nedeljo","field-month-relative+0":"Ta mesec","field-month-relative+1":"Naslednji mesec","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormatItem-Ed":"E, d.","field-week":"Teden","dateFormat-medium":"d. MMM y","field-week-relative+-1":"Prej\u0161nji teden","field-year-relative+0":"Letos","field-year-relative+1":"Naslednje leto","dayPeriods-format-narrow-pm":"p",
|
||||
"dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH.mm.ss","dateFormatItem-hms":"h.mm.ss a","dateFormatItem-GyMMM":"MMM y G","field-mon-relative+-1":"Prej\u0161nji ponedeljek","field-week-relative+0":"Ta teden","field-week-relative+1":"Naslednji teden"},"dijit/nls/loading":{_localized:{},loadingState:"Nalaganje ...",errorState:"Oprostite, pri\u0161lo je do napake."},"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",
|
||||
list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},"decimalFormat-short":"000\u00a0bil'.'","currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"#,##0.00\u00a0\u00a4;(#,##0.00\u00a0\u00a4)","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:".",percentFormat:"#,##0%","decimalFormat-long":"000 bilijonov",decimalFormat:"#,##0.###",
|
||||
decimal:",","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"e"},"dijit/form/nls/ComboBox":{previousMessage:"Prej\u0161nje izbire",_localized:{},nextMessage:"Dodatne izbire"},"dijit/nls/common":{buttonOk:"V redu",buttonCancel:"Prekli\u010di",_localized:{},buttonSave:"Shrani",itemClose:"Zapri"}});
|
||||
//# sourceMappingURL=dojo_sl.js.map
|
||||
16
Server/www/spiderbasic/dojo/nls/dojo_sv.js
Normal file
@ -0,0 +1,16 @@
|
||||
//>>built
|
||||
define("dojo/nls/dojo_sv",{"dijit/form/nls/validate":{invalidMessage:"Angivet v\u00e4rde \u00e4r inte giltigt.",rangeMessage:"V\u00e4rdet ligger utanf\u00f6r intervallet.",_localized:{},missingMessage:"V\u00e4rdet kr\u00e4vs."},"dojo/cldr/nls/gregorian":{"dateFormatItem-Ehm":"E h:mm a","days-standAlone-short":"S\u00f6 M\u00e5 Ti On To Fr L\u00f6".split(" "),"months-format-narrow":"JFMAMJJASOND".split(""),"field-second-relative+0":"nu","quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"Veckodag",
|
||||
"dateFormatItem-yQQQ":"y QQQ","dateFormatItem-yMEd":"E, y-MM-dd","field-wed-relative+0":"onsdag denna vecka","field-wed-relative+1":"onsdag n\u00e4sta vecka","dateFormatItem-GyMMMEd":"E d MMM y G","dateFormatItem-MMMEd":"E d MMM",eraNarrow:["f.Kr.","fvt","e.Kr.","vt"],"dateFormatItem-yMM":"y-MM","field-tue-relative+-1":"tisdag f\u00f6rra veckan","days-format-short":"s\u00f6 m\u00e5 ti on to fr l\u00f6".split(" "),"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"d MMMM y","field-fri-relative+-1":"fredag f\u00f6rra veckan",
|
||||
"field-wed-relative+-1":"onsdag f\u00f6rra veckan","months-format-wide":"januari februari mars april maj juni juli augusti september oktober november december".split(" "),"dateTimeFormat-medium":"{1} {0}","dayPeriods-format-wide-pm":"em","dateFormat-full":"EEEE d MMMM y","field-thu-relative+-1":"torsdag f\u00f6rra veckan","dateFormatItem-Md":"d/M",_localized:{},"dayPeriods-format-abbr-am":"FM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dayPeriods-format-wide-noon":"noon","dateFormatItem-yMd":"y-MM-dd",
|
||||
"field-era":"Era","dateFormatItem-yM":"y-MM","months-standAlone-wide":"Januari Februari Mars April Maj Juni Juli Augusti September Oktober November December".split(" "),"timeFormat-short":"HH:mm","quarters-format-wide":["1:a kvartalet","2:a kvartalet","3:e kvartalet","4:e kvartalet"],"dateFormatItem-yQQQQ":"y QQQQ","timeFormat-long":"HH:mm:ss z","field-year":"\u00c5r","dateFormatItem-yMMM":"MMM y","dateTimeFormats-appendItem-Era":"{1} {0}","field-hour":"timme","dateFormatItem-MMdd":"dd/MM","months-format-abbr":"jan feb mar apr maj jun jul aug sep okt nov dec".split(" "),
|
||||
"field-sat-relative+0":"l\u00f6rdag denna vecka","field-sat-relative+1":"l\u00f6rdag n\u00e4sta vecka","timeFormat-full":"'kl'. HH:mm:ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-day-relative+0":"i dag","field-thu-relative+0":"torsdag denna vecka","field-day-relative+1":"i morgon","field-thu-relative+1":"torsdag n\u00e4sta vecka","dateFormatItem-GyMMMd":"d MMM y G","field-day-relative+2":"i \u00f6vermorgon","dateFormatItem-H":"HH","months-standAlone-abbr":"Jan Feb Mar Apr Maj Jun Jul Aug Sep Okt Nov Dec".split(" "),
|
||||
"quarters-format-abbr":["K1","K2","K3","K4"],"quarters-standAlone-wide":["1:a kvartalet","2:a kvartalet","3:e kvartalet","4:e kvartalet"],"dateFormatItem-Gy":"y G","dateFormatItem-M":"L","days-standAlone-wide":"S\u00f6ndag M\u00e5ndag Tisdag Onsdag Torsdag Fredag L\u00f6rdag".split(" "),"dateFormatItem-MMMMd":"d MMMM","dayPeriods-format-abbr-noon":"noon","timeFormat-medium":"HH:mm:ss","field-sun-relative+0":"s\u00f6ndag denna vecka","dateFormatItem-Hm":"HH:mm","field-sun-relative+1":"s\u00f6ndag n\u00e4sta vecka",
|
||||
"quarters-standAlone-abbr":["K1","K2","K3","K4"],eraAbbr:["f.Kr.","e.Kr."],"field-minute":"Minut","field-dayperiod":"fm/em","days-standAlone-abbr":"S\u00f6n M\u00e5n Tis Ons Tor Fre L\u00f6r".split(" "),"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"field-day-relative+-1":"i g\u00e5r","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"f","dateFormatItem-h":"h a","field-day-relative+-2":"i f\u00f6rrg\u00e5r","dateFormatItem-MMMd":"d MMM",
|
||||
"dateFormatItem-MEd":"E d/M","dateTimeFormat-full":"{1} {0}","field-fri-relative+0":"fredag denna vecka","field-fri-relative+1":"fredag n\u00e4sta vecka","field-day":"Dag","days-format-wide":"s\u00f6ndag m\u00e5ndag tisdag onsdag torsdag fredag l\u00f6rdag".split(" "),"field-zone":"Tidszon","months-standAlone-narrow":"JFMAMJJASOND".split(""),"dateFormatItem-y":"y","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-year-relative+-1":"i fjol","field-month-relative+-1":"f\u00f6rra m\u00e5naden",
|
||||
"dateTimeFormats-appendItem-Year":"{1} {0}","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"EM","days-format-abbr":"s\u00f6n m\u00e5n tis ons tors fre l\u00f6r".split(" "),eraNames:["f\u00f6re Kristus","f\u00f6re v\u00e4sterl\u00e4ndsk tider\u00e4kning","efter Kristus","v\u00e4sterl\u00e4ndsk tider\u00e4kning"],"dateFormatItem-yMMMd":"d MMM y","days-format-narrow":"SMTOTFL".split(""),"field-month":"M\u00e5nad","days-standAlone-narrow":"SMTOTFL".split(""),
|
||||
"dateFormatItem-MMM":"LLL","field-tue-relative+0":"tisdag denna vecka","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","field-tue-relative+1":"tisdag n\u00e4sta vecka","dayPeriods-format-wide-am":"fm","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-MMMMEd":"E d MMMM","dateFormatItem-EHm":"E HH:mm","field-mon-relative+0":"m\u00e5ndag denna vecka","field-mon-relative+1":"m\u00e5ndag n\u00e4sta vecka","dateFormat-short":"y-MM-dd",
|
||||
"dateFormatItem-MMd":"d/M","dateFormatItem-EHms":"E HH:mm:ss","dateFormatItem-Ehms":"E h:mm:ss a","dayPeriods-format-narrow-noon":"n","field-second":"Sekund","field-sat-relative+-1":"l\u00f6rdag f\u00f6rra veckan","dateFormatItem-yMMMEd":"E d MMM y","field-sun-relative+-1":"s\u00f6ndag f\u00f6rra veckan","field-month-relative+0":"denna m\u00e5nad","field-month-relative+1":"n\u00e4sta m\u00e5nad","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormatItem-Ed":"E d","field-week":"Vecka","dateFormat-medium":"d MMM y",
|
||||
"field-week-relative+-1":"f\u00f6rra veckan","field-year-relative+0":"i \u00e5r","field-year-relative+1":"n\u00e4sta \u00e5r","dayPeriods-format-narrow-pm":"e","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a","dateFormatItem-GyMMM":"MMM y G","field-mon-relative+-1":"m\u00e5ndag f\u00f6rra veckan","field-week-relative+0":"denna vecka","field-week-relative+1":"n\u00e4sta vecka"},"dijit/nls/loading":{_localized:{},loadingState:"L\u00e4ser in...",errorState:"Det har intr\u00e4ffat ett fel."},
|
||||
"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00b7",list:";",percentSign:"%",minusSign:"\u2212","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},"decimalFormat-short":"000\u00a0bn","currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"\u00a4\u00a4\u00a4",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"#,##0.00\u00a0\u00a4","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",
|
||||
perMille:"\u2030",group:"\u00a0",percentFormat:"#,##0\u00a0%","decimalFormat-long":"000 biljoner",decimalFormat:"#,##0.###",decimal:",","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"\u00d710^"},"dijit/form/nls/ComboBox":{previousMessage:"Tidigare val",_localized:{},nextMessage:"Fler val"},"dijit/nls/common":{buttonOk:"OK",buttonCancel:"Avbryt",_localized:{},buttonSave:"Spara",itemClose:"St\u00e4ng"}});
|
||||
//# sourceMappingURL=dojo_sv.js.map
|
||||
25
Server/www/spiderbasic/dojo/nls/dojo_th.js
Normal file
@ -0,0 +1,25 @@
|
||||
//>>built
|
||||
define("dojo/nls/dojo_th",{"dijit/form/nls/validate":{invalidMessage:"\u0e04\u0e48\u0e32\u0e17\u0e35\u0e48\u0e1b\u0e49\u0e2d\u0e19\u0e44\u0e21\u0e48\u0e16\u0e39\u0e01\u0e15\u0e49\u0e2d\u0e07",rangeMessage:"\u0e04\u0e48\u0e32\u0e19\u0e35\u0e49\u0e40\u0e01\u0e34\u0e19\u0e0a\u0e48\u0e27\u0e07",_localized:{},missingMessage:"\u0e08\u0e33\u0e40\u0e1b\u0e47\u0e19\u0e15\u0e49\u0e2d\u0e07\u0e21\u0e35\u0e04\u0e48\u0e32\u0e19\u0e35\u0e49"},"dojo/cldr/nls/gregorian":{"dateFormatItem-Ehm":"E h:mm a","days-standAlone-short":"\u0e2d\u0e32. \u0e08. \u0e2d. \u0e1e. \u0e1e\u0e24. \u0e28. \u0e2a.".split(" "),
|
||||
"months-format-narrow":"\u0e21.\u0e04. \u0e01.\u0e1e. \u0e21\u0e35.\u0e04. \u0e40\u0e21.\u0e22. \u0e1e.\u0e04. \u0e21\u0e34.\u0e22. \u0e01.\u0e04. \u0e2a.\u0e04. \u0e01.\u0e22. \u0e15.\u0e04. \u0e1e.\u0e22. \u0e18.\u0e04.".split(" "),"field-second-relative+0":"\u0e02\u0e13\u0e30\u0e19\u0e35\u0e49","quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"\u0e27\u0e31\u0e19\u0e43\u0e19\u0e2a\u0e31\u0e1b\u0e14\u0e32\u0e2b\u0e4c","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"E d/M/y","field-wed-relative+0":"\u0e1e\u0e38\u0e18\u0e19\u0e35\u0e49",
|
||||
"field-wed-relative+1":"\u0e1e\u0e38\u0e18\u0e2b\u0e19\u0e49\u0e32","dateFormatItem-GyMMMEd":"E d MMM G y","dateFormatItem-MMMEd":"E d MMM",eraNarrow:["\u0e01\u0e48\u0e2d\u0e19 \u0e04.\u0e28.","\u0e01.\u0e2a.\u0e28.","\u0e04.\u0e28.","\u0e2a.\u0e28."],"field-tue-relative+-1":"\u0e2d\u0e31\u0e07\u0e04\u0e32\u0e23\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27","days-format-short":"\u0e2d\u0e32. \u0e08. \u0e2d. \u0e1e. \u0e1e\u0e24. \u0e28. \u0e2a.".split(" "),"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}",
|
||||
"dateFormat-long":"d MMMM y","field-fri-relative+-1":"\u0e28\u0e38\u0e01\u0e23\u0e4c\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27","field-wed-relative+-1":"\u0e1e\u0e38\u0e18\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27","months-format-wide":"\u0e21\u0e01\u0e23\u0e32\u0e04\u0e21 \u0e01\u0e38\u0e21\u0e20\u0e32\u0e1e\u0e31\u0e19\u0e18\u0e4c \u0e21\u0e35\u0e19\u0e32\u0e04\u0e21 \u0e40\u0e21\u0e29\u0e32\u0e22\u0e19 \u0e1e\u0e24\u0e29\u0e20\u0e32\u0e04\u0e21 \u0e21\u0e34\u0e16\u0e38\u0e19\u0e32\u0e22\u0e19 \u0e01\u0e23\u0e01\u0e0e\u0e32\u0e04\u0e21 \u0e2a\u0e34\u0e07\u0e2b\u0e32\u0e04\u0e21 \u0e01\u0e31\u0e19\u0e22\u0e32\u0e22\u0e19 \u0e15\u0e38\u0e25\u0e32\u0e04\u0e21 \u0e1e\u0e24\u0e28\u0e08\u0e34\u0e01\u0e32\u0e22\u0e19 \u0e18\u0e31\u0e19\u0e27\u0e32\u0e04\u0e21".split(" "),
|
||||
"dateTimeFormat-medium":"{1} {0}","dayPeriods-format-wide-pm":"\u0e2b\u0e25\u0e31\u0e07\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07","dateFormat-full":"EEEE\u0e17\u0e35\u0e48 d MMMM G y","field-thu-relative+-1":"\u0e1e\u0e24\u0e2b\u0e31\u0e2a\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27","dateFormatItem-Md":"d/M",_localized:{},"dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dayPeriods-format-wide-noon":"noon","dateFormatItem-yMd":"d/M/y","field-era":"\u0e2a\u0e21\u0e31\u0e22",
|
||||
"dateFormatItem-yM":"M/y","months-standAlone-wide":"\u0e21\u0e01\u0e23\u0e32\u0e04\u0e21 \u0e01\u0e38\u0e21\u0e20\u0e32\u0e1e\u0e31\u0e19\u0e18\u0e4c \u0e21\u0e35\u0e19\u0e32\u0e04\u0e21 \u0e40\u0e21\u0e29\u0e32\u0e22\u0e19 \u0e1e\u0e24\u0e29\u0e20\u0e32\u0e04\u0e21 \u0e21\u0e34\u0e16\u0e38\u0e19\u0e32\u0e22\u0e19 \u0e01\u0e23\u0e01\u0e0e\u0e32\u0e04\u0e21 \u0e2a\u0e34\u0e07\u0e2b\u0e32\u0e04\u0e21 \u0e01\u0e31\u0e19\u0e22\u0e32\u0e22\u0e19 \u0e15\u0e38\u0e25\u0e32\u0e04\u0e21 \u0e1e\u0e24\u0e28\u0e08\u0e34\u0e01\u0e32\u0e22\u0e19 \u0e18\u0e31\u0e19\u0e27\u0e32\u0e04\u0e21".split(" "),
|
||||
"timeFormat-short":"HH:mm","quarters-format-wide":["\u0e44\u0e15\u0e23\u0e21\u0e32\u0e2a 1","\u0e44\u0e15\u0e23\u0e21\u0e32\u0e2a 2","\u0e44\u0e15\u0e23\u0e21\u0e32\u0e2a 3","\u0e44\u0e15\u0e23\u0e21\u0e32\u0e2a 4"],"dateFormatItem-yQQQQ":"QQQQ y","timeFormat-long":"H \u0e19\u0e32\u0e2c\u0e34\u0e01\u0e32 mm \u0e19\u0e32\u0e17\u0e35 ss \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35 z","field-year":"\u0e1b\u0e35","dateFormatItem-yMMM":"MMM y","dateTimeFormats-appendItem-Era":"{1} {0}","field-hour":"\u0e0a\u0e31\u0e48\u0e27\u0e42\u0e21\u0e07",
|
||||
"months-format-abbr":"\u0e21.\u0e04. \u0e01.\u0e1e. \u0e21\u0e35.\u0e04. \u0e40\u0e21.\u0e22. \u0e1e.\u0e04. \u0e21\u0e34.\u0e22. \u0e01.\u0e04. \u0e2a.\u0e04. \u0e01.\u0e22. \u0e15.\u0e04. \u0e1e.\u0e22. \u0e18.\u0e04.".split(" "),"field-sat-relative+0":"\u0e40\u0e2a\u0e32\u0e23\u0e4c\u0e19\u0e35\u0e49","field-sat-relative+1":"\u0e40\u0e2a\u0e32\u0e23\u0e4c\u0e2b\u0e19\u0e49\u0e32","timeFormat-full":"H \u0e19\u0e32\u0e2c\u0e34\u0e01\u0e32 mm \u0e19\u0e32\u0e17\u0e35 ss \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35 zzzz",
|
||||
"dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-day-relative+0":"\u0e27\u0e31\u0e19\u0e19\u0e35\u0e49","field-thu-relative+0":"\u0e1e\u0e24\u0e2b\u0e31\u0e2a\u0e19\u0e35\u0e49","field-day-relative+1":"\u0e1e\u0e23\u0e38\u0e48\u0e07\u0e19\u0e35\u0e49","field-thu-relative+1":"\u0e1e\u0e24\u0e2b\u0e31\u0e2a\u0e2b\u0e19\u0e49\u0e32","dateFormatItem-GyMMMd":"d MMM G y","field-day-relative+2":"\u0e21\u0e30\u0e23\u0e37\u0e19\u0e19\u0e35\u0e49","dateFormatItem-H":"HH","months-standAlone-abbr":"\u0e21.\u0e04. \u0e01.\u0e1e. \u0e21\u0e35.\u0e04. \u0e40\u0e21.\u0e22. \u0e1e.\u0e04. \u0e21\u0e34.\u0e22. \u0e01.\u0e04. \u0e2a.\u0e04. \u0e01.\u0e22. \u0e15.\u0e04. \u0e1e.\u0e22. \u0e18.\u0e04.".split(" "),
|
||||
"quarters-format-abbr":["\u0e44\u0e15\u0e23\u0e21\u0e32\u0e2a 1","\u0e44\u0e15\u0e23\u0e21\u0e32\u0e2a 2","\u0e44\u0e15\u0e23\u0e21\u0e32\u0e2a 3","\u0e44\u0e15\u0e23\u0e21\u0e32\u0e2a 4"],"quarters-standAlone-wide":["\u0e44\u0e15\u0e23\u0e21\u0e32\u0e2a 1","\u0e44\u0e15\u0e23\u0e21\u0e32\u0e2a 2","\u0e44\u0e15\u0e23\u0e21\u0e32\u0e2a 3","\u0e44\u0e15\u0e23\u0e21\u0e32\u0e2a 4"],"dateFormatItem-Gy":"G y","dateFormatItem-M":"L","days-standAlone-wide":"\u0e27\u0e31\u0e19\u0e2d\u0e32\u0e17\u0e34\u0e15\u0e22\u0e4c \u0e27\u0e31\u0e19\u0e08\u0e31\u0e19\u0e17\u0e23\u0e4c \u0e27\u0e31\u0e19\u0e2d\u0e31\u0e07\u0e04\u0e32\u0e23 \u0e27\u0e31\u0e19\u0e1e\u0e38\u0e18 \u0e27\u0e31\u0e19\u0e1e\u0e24\u0e2b\u0e31\u0e2a\u0e1a\u0e14\u0e35 \u0e27\u0e31\u0e19\u0e28\u0e38\u0e01\u0e23\u0e4c \u0e27\u0e31\u0e19\u0e40\u0e2a\u0e32\u0e23\u0e4c".split(" "),
|
||||
"dateFormatItem-MMMMd":"d MMMM","dayPeriods-format-abbr-noon":"noon","timeFormat-medium":"HH:mm:ss","field-sun-relative+0":"\u0e2d\u0e32\u0e17\u0e34\u0e15\u0e22\u0e4c\u0e19\u0e35\u0e49","dateFormatItem-Hm":"HH:mm","field-sun-relative+1":"\u0e2d\u0e32\u0e17\u0e34\u0e15\u0e22\u0e4c\u0e2b\u0e19\u0e49\u0e32","quarters-standAlone-abbr":["\u0e44\u0e15\u0e23\u0e21\u0e32\u0e2a 1","\u0e44\u0e15\u0e23\u0e21\u0e32\u0e2a 2","\u0e44\u0e15\u0e23\u0e21\u0e32\u0e2a 3","\u0e44\u0e15\u0e23\u0e21\u0e32\u0e2a 4"],eraAbbr:["\u0e1b\u0e35\u0e01\u0e48\u0e2d\u0e19 \u0e04.\u0e28.",
|
||||
"\u0e04.\u0e28."],"field-minute":"\u0e19\u0e32\u0e17\u0e35","field-dayperiod":"\u0e0a\u0e48\u0e27\u0e07\u0e27\u0e31\u0e19","days-standAlone-abbr":"\u0e2d\u0e32. \u0e08. \u0e2d. \u0e1e. \u0e1e\u0e24. \u0e28. \u0e2a.".split(" "),"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"field-day-relative+-1":"\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e27\u0e32\u0e19","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"a","dateFormatItem-h":"h a","field-day-relative+-2":"\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e27\u0e32\u0e19\u0e0b\u0e37\u0e19",
|
||||
"dateFormatItem-MMMd":"d MMM","dateFormatItem-MEd":"E d/M","dateTimeFormat-full":"{1} {0}","field-fri-relative+0":"\u0e28\u0e38\u0e01\u0e23\u0e4c\u0e19\u0e35\u0e49","field-fri-relative+1":"\u0e28\u0e38\u0e01\u0e23\u0e4c\u0e2b\u0e19\u0e49\u0e32","dateFormatItem-yMMMM":"MMMM y","field-day":"\u0e27\u0e31\u0e19","days-format-wide":"\u0e27\u0e31\u0e19\u0e2d\u0e32\u0e17\u0e34\u0e15\u0e22\u0e4c \u0e27\u0e31\u0e19\u0e08\u0e31\u0e19\u0e17\u0e23\u0e4c \u0e27\u0e31\u0e19\u0e2d\u0e31\u0e07\u0e04\u0e32\u0e23 \u0e27\u0e31\u0e19\u0e1e\u0e38\u0e18 \u0e27\u0e31\u0e19\u0e1e\u0e24\u0e2b\u0e31\u0e2a\u0e1a\u0e14\u0e35 \u0e27\u0e31\u0e19\u0e28\u0e38\u0e01\u0e23\u0e4c \u0e27\u0e31\u0e19\u0e40\u0e2a\u0e32\u0e23\u0e4c".split(" "),
|
||||
"field-zone":"\u0e40\u0e02\u0e15\u0e40\u0e27\u0e25\u0e32","months-standAlone-narrow":"\u0e21.\u0e04. \u0e01.\u0e1e. \u0e21\u0e35.\u0e04. \u0e40\u0e21.\u0e22. \u0e1e.\u0e04. \u0e21\u0e34.\u0e22. \u0e01.\u0e04. \u0e2a.\u0e04. \u0e01.\u0e22. \u0e15.\u0e04. \u0e1e.\u0e22. \u0e18.\u0e04.".split(" "),"dateFormatItem-y":"y","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-year-relative+-1":"\u0e1b\u0e35\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27","field-month-relative+-1":"\u0e40\u0e14\u0e37\u0e2d\u0e19\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27",
|
||||
"dateTimeFormats-appendItem-Year":"{1} {0}","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-abbr":"\u0e2d\u0e32. \u0e08. \u0e2d. \u0e1e. \u0e1e\u0e24. \u0e28. \u0e2a.".split(" "),eraNames:["\u0e1b\u0e35\u0e01\u0e48\u0e2d\u0e19\u0e04\u0e23\u0e34\u0e2a\u0e15\u0e4c\u0e28\u0e31\u0e01\u0e23\u0e32\u0e0a","\u0e01\u0e48\u0e2d\u0e19\u0e2a\u0e32\u0e21\u0e31\u0e0d\u0e28\u0e31\u0e01\u0e23\u0e32\u0e0a","\u0e04\u0e23\u0e34\u0e2a\u0e15\u0e4c\u0e28\u0e31\u0e01\u0e23\u0e32\u0e0a",
|
||||
"\u0e2a\u0e32\u0e21\u0e31\u0e0d\u0e28\u0e31\u0e01\u0e23\u0e32\u0e0a"],"dateFormatItem-yMMMd":"d MMM y","days-format-narrow":"\u0e2d\u0e32 \u0e08 \u0e2d \u0e1e \u0e1e\u0e24 \u0e28 \u0e2a".split(" "),"field-month":"\u0e40\u0e14\u0e37\u0e2d\u0e19","days-standAlone-narrow":"\u0e2d\u0e32 \u0e08 \u0e2d \u0e1e \u0e1e\u0e24 \u0e28 \u0e2a".split(" "),"dateFormatItem-MMM":"LLL","field-tue-relative+0":"\u0e2d\u0e31\u0e07\u0e04\u0e32\u0e23\u0e19\u0e35\u0e49","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})",
|
||||
"field-tue-relative+1":"\u0e2d\u0e31\u0e07\u0e04\u0e32\u0e23\u0e2b\u0e19\u0e49\u0e32","dayPeriods-format-wide-am":"\u0e01\u0e48\u0e2d\u0e19\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-MMMMEd":"E d MMMM","dateFormatItem-EHm":"E HH:mm","field-mon-relative+0":"\u0e08\u0e31\u0e19\u0e17\u0e23\u0e4c\u0e19\u0e35\u0e49","field-mon-relative+1":"\u0e08\u0e31\u0e19\u0e17\u0e23\u0e4c\u0e2b\u0e19\u0e49\u0e32",
|
||||
"dateFormat-short":"d/M/yy","dateFormatItem-EHms":"E HH:mm:ss","dateFormatItem-Ehms":"E h:mm:ss a","dayPeriods-format-narrow-noon":"n","field-second":"\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35","field-sat-relative+-1":"\u0e40\u0e2a\u0e32\u0e23\u0e4c\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27","dateFormatItem-yMMMEd":"E d MMM y","field-sun-relative+-1":"\u0e2d\u0e32\u0e17\u0e34\u0e15\u0e22\u0e4c\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27","field-month-relative+0":"\u0e40\u0e14\u0e37\u0e2d\u0e19\u0e19\u0e35\u0e49",
|
||||
"field-month-relative+1":"\u0e40\u0e14\u0e37\u0e2d\u0e19\u0e2b\u0e19\u0e49\u0e32","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormatItem-Ed":"E d","field-week":"\u0e2a\u0e31\u0e1b\u0e14\u0e32\u0e2b\u0e4c","dateFormat-medium":"d MMM y","field-week-relative+-1":"\u0e2a\u0e31\u0e1b\u0e14\u0e32\u0e2b\u0e4c\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27","field-year-relative+0":"\u0e1b\u0e35\u0e19\u0e35\u0e49","field-year-relative+1":"\u0e1b\u0e35\u0e2b\u0e19\u0e49\u0e32","dayPeriods-format-narrow-pm":"p",
|
||||
"dateFormatItem-mmss":"mm:ss","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a","dateFormatItem-GyMMM":"MMM G y","field-mon-relative+-1":"\u0e08\u0e31\u0e19\u0e17\u0e23\u0e4c\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27","field-week-relative+0":"\u0e2a\u0e31\u0e1b\u0e14\u0e32\u0e2b\u0e4c\u0e19\u0e35\u0e49","field-week-relative+1":"\u0e2a\u0e31\u0e1b\u0e14\u0e32\u0e2b\u0e4c\u0e2b\u0e19\u0e49\u0e32"},"dijit/nls/loading":{_localized:{},loadingState:"\u0e01\u0e33\u0e25\u0e31\u0e07\u0e42\u0e2b\u0e25\u0e14...",
|
||||
errorState:"\u0e02\u0e2d\u0e2d\u0e20\u0e31\u0e22 \u0e40\u0e01\u0e34\u0e14\u0e02\u0e49\u0e2d\u0e1c\u0e34\u0e14\u0e1e\u0e25\u0e32\u0e14"},"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},"decimalFormat-short":"000\u00a0\u0e25'.'\u0e25'.'","currencySpacing-afterCurrency-insertBetween":"\u00a0",
|
||||
nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"\u00a4#,##0.00;(\u00a4#,##0.00)","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:",",percentFormat:"#,##0%","decimalFormat-long":"000 \u0e25\u0e49\u0e32\u0e19\u0e25\u0e49\u0e32\u0e19",decimalFormat:"#,##0.###",decimal:".","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"\u0e01\u0e32\u0e23\u0e40\u0e25\u0e37\u0e2d\u0e01\u0e01\u0e48\u0e2d\u0e19\u0e2b\u0e19\u0e49\u0e32",
|
||||
_localized:{},nextMessage:"\u0e01\u0e32\u0e23\u0e40\u0e25\u0e37\u0e2d\u0e01\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e40\u0e15\u0e34\u0e21"},"dijit/nls/common":{buttonOk:"\u0e15\u0e01\u0e25\u0e07",buttonCancel:"\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01",_localized:{},buttonSave:"\u0e1a\u0e31\u0e19\u0e17\u0e36\u0e01",itemClose:"\u0e1b\u0e34\u0e14"}});
|
||||
//# sourceMappingURL=dojo_th.js.map
|
||||
16
Server/www/spiderbasic/dojo/nls/dojo_tr.js
Normal file
@ -0,0 +1,16 @@
|
||||
//>>built
|
||||
define("dojo/nls/dojo_tr",{"dijit/form/nls/validate":{invalidMessage:"Girilen de\u011fer ge\u00e7ersiz.",rangeMessage:"Bu de\u011fer aral\u0131k d\u0131\u015f\u0131nda.",_localized:{},missingMessage:"Bu de\u011fer gerekli."},"dojo/cldr/nls/gregorian":{"dateFormatItem-Ehm":"E a h:mm","days-standAlone-short":"Pa Pt Sa \u00c7a Pe Cu Ct".split(" "),"months-format-narrow":"O\u015eMNMHTAEEKA".split(""),"field-second-relative+0":"\u015fimdi","quarters-standAlone-narrow":["1.","2.","3.","4."],"field-weekday":"Haftan\u0131n G\u00fcn\u00fc",
|
||||
"dateFormatItem-yQQQ":"y/QQQ","dateFormatItem-yMEd":"dd.MM.y E","field-wed-relative+0":"bu \u00e7ar\u015famba","field-wed-relative+1":"gelecek \u00e7ar\u015famba","dateFormatItem-GyMMMEd":"G d MMM y E","dateFormatItem-MMMEd":"d MMMM E",eraNarrow:["M\u00d6","MS"],"dateFormatItem-yMM":"MM.y","field-tue-relative+-1":"ge\u00e7en sal\u0131","days-format-short":"Pa Pt Sa \u00c7a Pe Cu Ct".split(" "),"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"d MMMM y","field-fri-relative+-1":"ge\u00e7en cuma",
|
||||
"field-wed-relative+-1":"ge\u00e7en \u00e7ar\u015famba","months-format-wide":"Ocak \u015eubat Mart Nisan May\u0131s Haziran Temmuz A\u011fustos Eyl\u00fcl Ekim Kas\u0131m Aral\u0131k".split(" "),"dateTimeFormat-medium":"{1} {0}","dayPeriods-format-wide-pm":"\u00d6S","dateFormat-full":"d MMMM y EEEE","field-thu-relative+-1":"ge\u00e7en per\u015fembe","dateFormatItem-Md":"dd/MM",_localized:{},"dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dayPeriods-format-wide-noon":"noon",
|
||||
"dateFormatItem-yMd":"dd.MM.y","field-era":"Miladi D\u00f6nem","dateFormatItem-yM":"MM/y","months-standAlone-wide":"Ocak \u015eubat Mart Nisan May\u0131s Haziran Temmuz A\u011fustos Eyl\u00fcl Ekim Kas\u0131m Aral\u0131k".split(" "),"timeFormat-short":"HH:mm","quarters-format-wide":["1. \u00e7eyrek","2. \u00e7eyrek","3. \u00e7eyrek","4. \u00e7eyrek"],"dateFormatItem-yQQQQ":"y/QQQQ","timeFormat-long":"HH:mm:ss z","field-year":"Y\u0131l","dateFormatItem-yMMM":"MMM y","dateTimeFormats-appendItem-Era":"{1} {0}",
|
||||
"field-hour":"Saat","months-format-abbr":"Oca \u015eub Mar Nis May Haz Tem A\u011fu Eyl Eki Kas Ara".split(" "),"field-sat-relative+0":"bu cumartesi","field-sat-relative+1":"gelecek cumartesi","timeFormat-full":"HH:mm:ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-day-relative+0":"bug\u00fcn","field-thu-relative+0":"bu per\u015fembe","field-day-relative+1":"yar\u0131n","field-thu-relative+1":"gelecek per\u015fembe","dateFormatItem-GyMMMd":"G dd MMM y","field-day-relative+2":"\u00f6b\u00fcr g\u00fcn",
|
||||
"dateFormatItem-H":"HH","months-standAlone-abbr":"Oca \u015eub Mar Nis May Haz Tem A\u011fu Eyl Eki Kas Ara".split(" "),"quarters-format-abbr":["\u00c71","\u00c72","\u00c73","\u00c74"],"quarters-standAlone-wide":["1. \u00e7eyrek","2. \u00e7eyrek","3. \u00e7eyrek","4. \u00e7eyrek"],"dateFormatItem-Gy":"G y","dateFormatItem-M":"L","days-standAlone-wide":"Pazar Pazartesi Sal\u0131 \u00c7ar\u015famba Per\u015fembe Cuma Cumartesi".split(" "),"dateFormatItem-MMMMd":"dd MMMM","dayPeriods-format-abbr-noon":"noon",
|
||||
"timeFormat-medium":"HH:mm:ss","field-sun-relative+0":"bu pazar","dateFormatItem-Hm":"HH:mm","field-sun-relative+1":"gelecek pazar","quarters-standAlone-abbr":["\u00c71","\u00c72","\u00c73","\u00c74"],eraAbbr:["M\u00d6","MS"],"field-minute":"Dakika","field-dayperiod":"\u00d6\u00d6/\u00d6S","days-standAlone-abbr":"Paz Pzt Sal \u00c7ar Per Cum Cmt".split(" "),"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1.","2.","3.","4."],"field-day-relative+-1":"d\u00fcn","dateTimeFormat-long":"{1} {0}",
|
||||
"dayPeriods-format-narrow-am":"a","dateFormatItem-h":"a h","field-day-relative+-2":"evvelsi g\u00fcn","dateFormatItem-MMMd":"d MMM","dateFormatItem-MEd":"dd/MM E","dateTimeFormat-full":"{1} {0}","field-fri-relative+0":"bu cuma","field-fri-relative+1":"gelecek cuma","dateFormatItem-yMMMM":"MMMM y","field-day":"G\u00fcn","days-format-wide":"Pazar Pazartesi Sal\u0131 \u00c7ar\u015famba Per\u015fembe Cuma Cumartesi".split(" "),"field-zone":"Saat Dilimi","months-standAlone-narrow":"O\u015eMNMHTAEEKA".split(""),
|
||||
"dateFormatItem-y":"y","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-year-relative+-1":"ge\u00e7en y\u0131l","field-month-relative+-1":"ge\u00e7en ay","dateTimeFormats-appendItem-Year":"{1} {0}","dateFormatItem-hm":"a h:mm","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-abbr":"Paz Pzt Sal \u00c7ar Per Cum Cmt".split(" "),eraNames:["Milattan \u00d6nce","Milattan Sonra"],"dateFormatItem-yMMMd":"dd MMM y","days-format-narrow":"PPS\u00c7PCC".split(""),
|
||||
"field-month":"Ay","days-standAlone-narrow":"PPS\u00c7PCC".split(""),"dateFormatItem-MMM":"LLL","field-tue-relative+0":"bu sal\u0131","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","field-tue-relative+1":"gelecek sal\u0131","dayPeriods-format-wide-am":"\u00d6\u00d6","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-MMMMEd":"dd MMMM E","dateFormatItem-EHm":"E HH:mm","field-mon-relative+0":"bu pazartesi","field-mon-relative+1":"gelecek pazartesi",
|
||||
"dateFormat-short":"d.MM.y","dateFormatItem-EHms":"E HH:mm:ss","dateFormatItem-Ehms":"E a h:mm:ss","dayPeriods-format-narrow-noon":"n","field-second":"Saniye","field-sat-relative+-1":"ge\u00e7en cumartesi","dateFormatItem-yMMMEd":"d MMM y E","field-sun-relative+-1":"ge\u00e7en pazar","field-month-relative+0":"bu ay","field-month-relative+1":"gelecek ay","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormatItem-Ed":"d E","field-week":"Hafta","dateFormat-medium":"d MMM y","field-week-relative+-1":"ge\u00e7en hafta",
|
||||
"field-year-relative+0":"bu y\u0131l","field-year-relative+1":"gelecek y\u0131l","dayPeriods-format-narrow-pm":"p","dateFormatItem-mmss":"mm:ss","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"a h:mm:ss","dateFormatItem-GyMMM":"G MMM y","field-mon-relative+-1":"ge\u00e7en pazartesi","field-week-relative+0":"bu hafta","field-week-relative+1":"gelecek hafta"},"dijit/nls/loading":{_localized:{},loadingState:"Y\u00fckleniyor...",errorState:"\u00dczg\u00fcn\u00fcz, bir hata olu\u015ftu"},
|
||||
"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},"decimalFormat-short":"000\u00a0Tn","currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"#,##0.00\u00a0\u00a4;(#,##0.00\u00a0\u00a4)",
|
||||
"currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:".",percentFormat:"%#,##0","decimalFormat-long":"000 trilyon",decimalFormat:"#,##0.###",decimal:",","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"\u00d6nceki se\u00e7enekler",_localized:{},nextMessage:"Di\u011fer se\u00e7enekler"},"dijit/nls/common":{buttonOk:"Tamam",buttonCancel:"\u0130ptal",_localized:{},buttonSave:"Kaydet",itemClose:"Kapat"}});
|
||||
//# sourceMappingURL=dojo_tr.js.map
|
||||
20
Server/www/spiderbasic/dojo/nls/dojo_zh-cn.js
Normal file
@ -0,0 +1,20 @@
|
||||
//>>built
|
||||
define("dojo/nls/dojo_zh-cn",{"dijit/form/nls/validate":{invalidMessage:"\u8f93\u5165\u7684\u503c\u65e0\u6548\u3002",rangeMessage:"\u6b64\u503c\u8d85\u51fa\u8303\u56f4\u3002",_localized:{},missingMessage:"\u8be5\u503c\u662f\u5fc5\u9700\u7684\u3002"},"dojo/cldr/nls/gregorian":{"dateTimeFormats-appendItem-Year":"{1} {0}","field-tue-relative+-1":"\u4e0a\u5468\u4e8c","field-year":"\u5e74","dayPeriods-format-wide-weeHours":"\u51cc\u6668","dateFormatItem-Hm":"HH:mm","field-wed-relative+0":"\u672c\u5468\u4e09",
|
||||
"field-wed-relative+1":"\u4e0b\u5468\u4e09","dayPeriods-format-wide-night":"\u665a\u4e0a","dateFormatItem-ms":"mm:ss","timeFormat-short":"ah:mm","field-minute":"\u5206\u949f","dateTimeFormat-short":"{1} {0}","field-day-relative+0":"\u4eca\u5929","field-day-relative+1":"\u660e\u5929","field-day-relative+2":"\u540e\u5929","field-tue-relative+0":"\u672c\u5468\u4e8c","field-tue-relative+1":"\u4e0b\u5468\u4e8c","dayPeriods-format-narrow-am":"\u4e0a\u5348","dateFormatItem-MMMd":"M\u6708d\u65e5","dayPeriods-format-abbr-am":"AM",
|
||||
"dayPeriods-format-narrow-earlyMorning":"\u6e05\u6668","field-week-relative+0":"\u672c\u5468","field-month-relative+0":"\u672c\u6708","field-week-relative+1":"\u4e0b\u5468","field-month-relative+1":"\u4e0b\u4e2a\u6708","timeFormat-medium":"ah:mm:ss","dateFormatItem-MMMMdd":"M\u6708dd\u65e5","field-second-relative+0":"\u73b0\u5728","dayPeriods-format-wide-afternoon":"\u4e0b\u5348","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","months-standAlone-narrow":"1 2 3 4 5 6 7 8 9 10 11 12".split(" "),
|
||||
eraNames:["\u516c\u5143\u524d","\u516c\u5143"],"dateFormatItem-GyMMMEd":"Gy\u5e74M\u6708d\u65e5E","field-day":"\u65e5","field-year-relative+-1":"\u53bb\u5e74","dayPeriods-format-wide-am":"\u4e0a\u5348","dayPeriods-format-narrow-midDay":"\u4e2d\u5348","field-wed-relative+-1":"\u4e0a\u5468\u4e09","dateTimeFormat-medium":"{1} {0}","field-second":"\u79d2\u949f","days-standAlone-narrow":"\u65e5\u4e00\u4e8c\u4e09\u56db\u4e94\u516d".split(""),"dateFormatItem-Ehms":"Eah:mm:ss","dateFormat-long":"y\u5e74M\u6708d\u65e5",
|
||||
"dateFormatItem-GyMMMd":"Gy\u5e74M\u6708d\u65e5","dateFormatItem-yMMMEd":"y\u5e74M\u6708d\u65e5E","quarters-standAlone-wide":["\u7b2c\u4e00\u5b63\u5ea6","\u7b2c\u4e8c\u5b63\u5ea6","\u7b2c\u4e09\u5b63\u5ea6","\u7b2c\u56db\u5b63\u5ea6"],"days-format-narrow":"\u65e5\u4e00\u4e8c\u4e09\u56db\u4e94\u516d".split(""),"dateTimeFormats-appendItem-Timezone":"{1}{0}","field-mon-relative+-1":"\u4e0a\u5468\u4e00","dateFormatItem-GyMMM":"Gy\u5e74M\u6708","field-month":"\u6708","dateFormatItem-MMM":"LLL","field-dayperiod":"\u4e0a\u5348/\u4e0b\u5348",
|
||||
"dayPeriods-format-narrow-pm":"\u4e0b\u5348","dateFormat-medium":"y\u5e74M\u6708d\u65e5",eraAbbr:["\u516c\u5143\u524d","\u516c\u5143"],"quarters-standAlone-abbr":["1\u5b63\u5ea6","2\u5b63\u5ea6","3\u5b63\u5ea6","4\u5b63\u5ea6"],"dayPeriods-format-abbr-pm":"PM","field-mon-relative+0":"\u672c\u5468\u4e00","field-mon-relative+1":"\u4e0b\u5468\u4e00","months-format-narrow":"1 2 3 4 5 6 7 8 9 10 11 12".split(" "),"days-format-short":"\u5468\u65e5 \u5468\u4e00 \u5468\u4e8c \u5468\u4e09 \u5468\u56db \u5468\u4e94 \u5468\u516d".split(" "),
|
||||
"quarters-format-narrow":["1","2","3","4"],"dayPeriods-format-wide-pm":"\u4e0b\u5348","field-sat-relative+-1":"\u4e0a\u5468\u516d","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dateTimeFormat-long":"{1} {0}","dateFormatItem-Md":"M/d","field-hour":"\u5c0f\u65f6","dateFormatItem-yQQQQ":"y\u5e74\u7b2cQ\u5b63\u5ea6","months-format-wide":"\u4e00\u6708 \u4e8c\u6708 \u4e09\u6708 \u56db\u6708 \u4e94\u6708 \u516d\u6708 \u4e03\u6708 \u516b\u6708 \u4e5d\u6708 \u5341\u6708 \u5341\u4e00\u6708 \u5341\u4e8c\u6708".split(" "),
|
||||
"dateFormat-full":"y\u5e74M\u6708d\u65e5EEEE","field-month-relative+-1":"\u4e0a\u4e2a\u6708","dayPeriods-format-wide-earlyMorning":"\u6e05\u6668","dateFormatItem-Hms":"HH:mm:ss","field-fri-relative+0":"\u672c\u5468\u4e94","field-fri-relative+1":"\u4e0b\u5468\u4e94","dayPeriods-format-narrow-noon":"\u4e2d\u5348","dayPeriods-format-narrow-morning":"\u4e0a\u5348","dayPeriods-format-wide-morning":"\u4e0a\u5348","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})",_localized:{},"field-week-relative+-1":"\u4e0a\u5468",
|
||||
"dateFormatItem-Ehm":"Eah:mm","months-format-abbr":"1\u6708 2\u6708 3\u6708 4\u6708 5\u6708 6\u6708 7\u6708 8\u6708 9\u6708 10\u6708 11\u6708 12\u6708".split(" "),"timeFormat-long":"zah:mm:ss","dateFormatItem-yMMM":"y\u5e74M\u6708","dateFormat-short":"yy/M/d","days-standAlone-wide":"\u661f\u671f\u65e5 \u661f\u671f\u4e00 \u661f\u671f\u4e8c \u661f\u671f\u4e09 \u661f\u671f\u56db \u661f\u671f\u4e94 \u661f\u671f\u516d".split(" "),"dateTimeFormats-appendItem-Era":"{1} {0}","dateFormatItem-H":"H\u65f6",
|
||||
"dateFormatItem-M":"M\u6708","months-standAlone-wide":"\u4e00\u6708 \u4e8c\u6708 \u4e09\u6708 \u56db\u6708 \u4e94\u6708 \u516d\u6708 \u4e03\u6708 \u516b\u6708 \u4e5d\u6708 \u5341\u6708 \u5341\u4e00\u6708 \u5341\u4e8c\u6708".split(" "),"field-sun-relative+-1":"\u4e0a\u5468\u65e5","days-standAlone-abbr":"\u5468\u65e5 \u5468\u4e00 \u5468\u4e8c \u5468\u4e09 \u5468\u56db \u5468\u4e94 \u5468\u516d".split(" "),"dateTimeFormat-full":"{1} {0}","dateFormatItem-hm":"ah:mm","dayPeriods-format-wide-midDay":"\u4e2d\u5348",
|
||||
"dateFormatItem-d":"d\u65e5","field-weekday":"\u661f\u671f","field-sat-relative+0":"\u672c\u5468\u516d","dateFormatItem-h":"ah\u65f6","field-sat-relative+1":"\u4e0b\u5468\u516d","months-standAlone-abbr":"1\u6708 2\u6708 3\u6708 4\u6708 5\u6708 6\u6708 7\u6708 8\u6708 9\u6708 10\u6708 11\u6708 12\u6708".split(" "),"dateFormatItem-yMM":"y\u5e74M\u6708","timeFormat-full":"zzzzah:mm:ss","dateFormatItem-MEd":"M/dE","dateFormatItem-y":"y\u5e74","field-thu-relative+0":"\u672c\u5468\u56db","field-thu-relative+1":"\u4e0b\u5468\u56db",
|
||||
"dateFormatItem-hms":"ah:mm:ss","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dayPeriods-format-abbr-noon":"noon","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-thu-relative+-1":"\u4e0a\u5468\u56db","dateFormatItem-yMd":"y/M/d","field-week":"\u5468","quarters-standAlone-narrow":["1","2","3","4"],"quarters-format-wide":["\u7b2c\u4e00\u5b63\u5ea6","\u7b2c\u4e8c\u5b63\u5ea6","\u7b2c\u4e09\u5b63\u5ea6","\u7b2c\u56db\u5b63\u5ea6"],"dayPeriods-format-narrow-weeHours":"\u51cc\u6668","dateFormatItem-Ed":"d\u65e5E",
|
||||
"dayPeriods-format-narrow-afternoon":"\u4e0b\u5348","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","days-standAlone-short":"\u5468\u65e5 \u5468\u4e00 \u5468\u4e8c \u5468\u4e09 \u5468\u56db \u5468\u4e94 \u5468\u516d".split(" "),"quarters-format-abbr":["1\u5b63\u5ea6","2\u5b63\u5ea6","3\u5b63\u5ea6","4\u5b63\u5ea6"],"field-year-relative+0":"\u4eca\u5e74","field-year-relative+1":"\u660e\u5e74","field-fri-relative+-1":"\u4e0a\u5468\u4e94",eraNarrow:["\u516c\u5143\u524d","\u516c\u5143"],"dayPeriods-format-wide-noon":"\u4e2d\u5348",
|
||||
"dateFormatItem-yQQQ":"y\u5e74\u7b2cQ\u5b63\u5ea6","days-format-wide":"\u661f\u671f\u65e5 \u661f\u671f\u4e00 \u661f\u671f\u4e8c \u661f\u671f\u4e09 \u661f\u671f\u56db \u661f\u671f\u4e94 \u661f\u671f\u516d".split(" "),"dayPeriods-format-narrow-night":"\u665a\u4e0a","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateFormatItem-EHm":"EHH:mm","field-zone":"\u65f6\u533a","dateFormatItem-yM":"y/M","dateFormatItem-yMMMM":"y\u5e74M\u6708","dateFormatItem-MMMEd":"M\u6708d\u65e5E","dateFormatItem-EHms":"EHH:mm:ss",
|
||||
"dateFormatItem-yMEd":"y/M/dE","field-day-relative+-1":"\u6628\u5929","field-day-relative+-2":"\u524d\u5929","days-format-abbr":"\u5468\u65e5 \u5468\u4e00 \u5468\u4e8c \u5468\u4e09 \u5468\u56db \u5468\u4e94 \u5468\u516d".split(" "),"field-sun-relative+0":"\u672c\u5468\u65e5","dateFormatItem-MMdd":"MM/dd","field-sun-relative+1":"\u4e0b\u5468\u65e5","dateFormatItem-yMMMd":"y\u5e74M\u6708d\u65e5","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-Gy":"Gy\u5e74","field-era":"\u7eaa\u5143"},
|
||||
"dijit/nls/loading":{_localized:{},loadingState:"\u6b63\u5728\u52a0\u8f7d...",errorState:"\u5bf9\u4e0d\u8d77\uff0c\u53d1\u751f\u4e86\u9519\u8bef"},"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},"decimalFormat-short":"000\u5146","currencySpacing-afterCurrency-insertBetween":"\u00a0",
|
||||
nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"\u00a4#,##0.00;(\u00a4#,##0.00)","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:",",percentFormat:"#,##0%","decimalFormat-long":"000\u5146",decimalFormat:"#,##0.###",decimal:".","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"\u5148\u524d\u9009\u9879",_localized:{},nextMessage:"\u66f4\u591a\u9009\u9879"},
|
||||
"dijit/nls/common":{buttonOk:"\u786e\u5b9a",buttonCancel:"\u53d6\u6d88",_localized:{},buttonSave:"\u4fdd\u5b58",itemClose:"\u5173\u95ed"}});
|
||||
//# sourceMappingURL=dojo_zh-cn.js.map
|
||||
19
Server/www/spiderbasic/dojo/nls/dojo_zh-tw.js
Normal file
@ -0,0 +1,19 @@
|
||||
//>>built
|
||||
define("dojo/nls/dojo_zh-tw",{"dijit/form/nls/validate":{invalidMessage:"\u8f38\u5165\u7684\u503c\u7121\u6548\u3002",rangeMessage:"\u6b64\u503c\u8d85\u51fa\u7bc4\u570d\u3002",_localized:{},missingMessage:"\u5fc5\u9808\u63d0\u4f9b\u6b64\u503c\u3002"},"dojo/cldr/nls/gregorian":{"dateTimeFormats-appendItem-Year":"{1} {0}","field-tue-relative+-1":"\u4e0a\u9031\u4e8c","field-year":"\u5e74","dayPeriods-format-wide-weeHours":"\u51cc\u6668","dateFormatItem-Hm":"HH:mm","field-wed-relative+0":"\u672c\u9031\u4e09",
|
||||
"field-wed-relative+1":"\u4e0b\u9031\u4e09","dayPeriods-format-wide-night":"\u665a\u4e0a","dateFormatItem-ms":"mm:ss","timeFormat-short":"ah:mm","field-minute":"\u5206\u9418","dateTimeFormat-short":"{1} {0}","field-day-relative+0":"\u4eca\u5929","field-day-relative+1":"\u660e\u5929","field-day-relative+2":"\u5f8c\u5929","field-tue-relative+0":"\u672c\u9031\u4e8c","field-tue-relative+1":"\u4e0b\u9031\u4e8c","dayPeriods-format-narrow-am":"\u4e0a\u5348","dateFormatItem-MMMd":"M\u6708d\u65e5","dayPeriods-format-abbr-am":"AM",
|
||||
"dayPeriods-format-narrow-earlyMorning":"\u6e05\u6668","field-week-relative+0":"\u672c\u9031","field-month-relative+0":"\u672c\u6708","field-week-relative+1":"\u4e0b\u9031","field-month-relative+1":"\u4e0b\u500b\u6708","timeFormat-medium":"ah:mm:ss","dateFormatItem-MMMMdd":"M\u6708dd\u65e5","field-second-relative+0":"\u73fe\u5728","dayPeriods-format-wide-afternoon":"\u4e0b\u5348","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","months-standAlone-narrow":"1 2 3 4 5 6 7 8 9 10 11 12".split(" "),
|
||||
eraNames:["\u897f\u5143\u524d","\u897f\u5143"],"dateFormatItem-GyMMMEd":"G y \u5e74 M \u6708 d \u65e5E","field-day":"\u65e5","field-year-relative+-1":"\u53bb\u5e74","dayPeriods-format-wide-am":"\u4e0a\u5348","dayPeriods-format-narrow-midDay":"\u4e2d\u5348","field-wed-relative+-1":"\u4e0a\u9031\u4e09","dateTimeFormat-medium":"{1} {0}","field-second":"\u79d2","days-standAlone-narrow":"\u65e5\u4e00\u4e8c\u4e09\u56db\u4e94\u516d".split(""),"dateFormatItem-Ehms":"E a h:mm:ss","dateFormat-long":"y\u5e74M\u6708d\u65e5",
|
||||
"dateFormatItem-GyMMMd":"G y \u5e74 M \u6708 d \u65e5","dateFormatItem-yMMMEd":"y\u5e74M\u6708d\u65e5E",$locale:"zh-hant-tw","quarters-standAlone-wide":["\u7b2c1\u5b63","\u7b2c2\u5b63","\u7b2c3\u5b63","\u7b2c4\u5b63"],"days-format-narrow":"\u65e5\u4e00\u4e8c\u4e09\u56db\u4e94\u516d".split(""),"dateTimeFormats-appendItem-Timezone":"{0} {1}","field-mon-relative+-1":"\u4e0a\u9031\u4e00","dateFormatItem-GyMMM":"G y \u5e74 M \u6708","field-month":"\u6708","dateFormatItem-MMM":"LLL","field-dayperiod":"\u4e0a\u5348/\u4e0b\u5348",
|
||||
"dayPeriods-format-narrow-pm":"\u4e0b\u5348","dateFormat-medium":"y\u5e74M\u6708d\u65e5",eraAbbr:["\u897f\u5143\u524d","\u897f\u5143"],"quarters-standAlone-abbr":["\u7b2c1\u5b63","\u7b2c2\u5b63","\u7b2c3\u5b63","\u7b2c4\u5b63"],"dayPeriods-format-abbr-pm":"PM","field-mon-relative+0":"\u672c\u9031\u4e00","field-mon-relative+1":"\u4e0b\u9031\u4e00","months-format-narrow":"1 2 3 4 5 6 7 8 9 10 11 12".split(" "),"days-format-short":"\u5468\u65e5 \u5468\u4e00 \u5468\u4e8c \u5468\u4e09 \u5468\u56db \u5468\u4e94 \u5468\u516d".split(" "),
|
||||
"quarters-format-narrow":["1","2","3","4"],"dayPeriods-format-wide-pm":"\u4e0b\u5348","field-sat-relative+-1":"\u4e0a\u9031\u516d","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dateTimeFormat-long":"{1} {0}","dateFormatItem-Md":"M/d","field-hour":"\u5c0f\u6642","dateFormatItem-yQQQQ":"y\u5e74QQQQ","months-format-wide":"1\u6708 2\u6708 3\u6708 4\u6708 5\u6708 6\u6708 7\u6708 8\u6708 9\u6708 10\u6708 11\u6708 12\u6708".split(" "),"dateFormat-full":"y\u5e74M\u6708d\u65e5EEEE","field-month-relative+-1":"\u4e0a\u500b\u6708",
|
||||
"dayPeriods-format-wide-earlyMorning":"\u6e05\u6668","dateFormatItem-Hms":"HH:mm:ss","field-fri-relative+0":"\u672c\u9031\u4e94","field-fri-relative+1":"\u4e0b\u9031\u4e94","dayPeriods-format-narrow-noon":"\u4e2d\u5348","dayPeriods-format-narrow-morning":"\u4e0a\u5348","dayPeriods-format-wide-morning":"\u4e0a\u5348","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})",_localized:{},"field-week-relative+-1":"\u4e0a\u9031","dateFormatItem-Ehm":"E a h:mm","months-format-abbr":"1\u6708 2\u6708 3\u6708 4\u6708 5\u6708 6\u6708 7\u6708 8\u6708 9\u6708 10\u6708 11\u6708 12\u6708".split(" "),
|
||||
"timeFormat-long":"zah\u6642mm\u5206ss\u79d2","dateFormatItem-yMMM":"y\u5e74M\u6708","dateFormat-short":"y/M/d","days-standAlone-wide":"\u661f\u671f\u65e5 \u661f\u671f\u4e00 \u661f\u671f\u4e8c \u661f\u671f\u4e09 \u661f\u671f\u56db \u661f\u671f\u4e94 \u661f\u671f\u516d".split(" "),"dateTimeFormats-appendItem-Era":"{1} {0}","dateFormatItem-H":"H\u6642","dateFormatItem-M":"M\u6708","months-standAlone-wide":"1\u6708 2\u6708 3\u6708 4\u6708 5\u6708 6\u6708 7\u6708 8\u6708 9\u6708 10\u6708 11\u6708 12\u6708".split(" "),
|
||||
"field-sun-relative+-1":"\u4e0a\u9031\u65e5","days-standAlone-abbr":"\u5468\u65e5 \u5468\u4e00 \u5468\u4e8c \u5468\u4e09 \u5468\u56db \u5468\u4e94 \u5468\u516d".split(" "),"dateTimeFormat-full":"{1}{0}","dateFormatItem-hm":"ah:mm","dayPeriods-format-wide-midDay":"\u4e2d\u5348","dateFormatItem-d":"d\u65e5","field-weekday":"\u9031\u5929","field-sat-relative+0":"\u672c\u9031\u516d","dateFormatItem-h":"ah\u6642","field-sat-relative+1":"\u4e0b\u9031\u516d","months-standAlone-abbr":"1\u6708 2\u6708 3\u6708 4\u6708 5\u6708 6\u6708 7\u6708 8\u6708 9\u6708 10\u6708 11\u6708 12\u6708".split(" "),
|
||||
"dateFormatItem-yMM":"y-MM","timeFormat-full":"zzzzah\u6642mm\u5206ss\u79d2","dateFormatItem-MEd":"M/d\uff08E\uff09","dateFormatItem-y":"y\u5e74","field-thu-relative+0":"\u672c\u9031\u56db","field-thu-relative+1":"\u4e0b\u9031\u56db","dateFormatItem-hms":"ah:mm:ss","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dayPeriods-format-abbr-noon":"noon","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-thu-relative+-1":"\u4e0a\u9031\u56db","dateFormatItem-yMd":"y/M/d","field-week":"\u9031","quarters-standAlone-narrow":["1",
|
||||
"2","3","4"],"quarters-format-wide":["\u7b2c1\u5b63","\u7b2c2\u5b63","\u7b2c3\u5b63","\u7b2c4\u5b63"],"dayPeriods-format-narrow-weeHours":"\u51cc\u6668","dateFormatItem-Ed":"d\u65e5\uff08E\uff09","dayPeriods-format-narrow-afternoon":"\u4e0b\u5348","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","days-standAlone-short":"\u5468\u65e5 \u5468\u4e00 \u5468\u4e8c \u5468\u4e09 \u5468\u56db \u5468\u4e94 \u5468\u516d".split(" "),"quarters-format-abbr":["\u7b2c1\u5b63","\u7b2c2\u5b63","\u7b2c3\u5b63","\u7b2c4\u5b63"],
|
||||
"field-year-relative+0":"\u4eca\u5e74","field-year-relative+1":"\u660e\u5e74","field-fri-relative+-1":"\u4e0a\u9031\u4e94",eraNarrow:["\u897f\u5143\u524d","\u897f\u5143"],"dayPeriods-format-wide-noon":"\u4e2d\u5348","dateFormatItem-yQQQ":"y\u5e74QQQ","days-format-wide":"\u661f\u671f\u65e5 \u661f\u671f\u4e00 \u661f\u671f\u4e8c \u661f\u671f\u4e09 \u661f\u671f\u56db \u661f\u671f\u4e94 \u661f\u671f\u516d".split(" "),"dayPeriods-format-narrow-night":"\u665a\u4e0a","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})",
|
||||
"dateFormatItem-EHm":"E HH:mm","field-zone":"\u6642\u5340","dateFormatItem-yM":"y/M","dateFormatItem-yMMMM":"y\u5e74M\u6708","dateFormatItem-MMMEd":"M\u6708d\u65e5E","dateFormatItem-EHms":"E HH:mm:ss","dateFormatItem-yMEd":"y/M/d\uff08E\uff09","field-day-relative+-1":"\u6628\u5929","field-day-relative+-2":"\u524d\u5929","days-format-abbr":"\u5468\u65e5 \u5468\u4e00 \u5468\u4e8c \u5468\u4e09 \u5468\u56db \u5468\u4e94 \u5468\u516d".split(" "),"field-sun-relative+0":"\u672c\u9031\u65e5","dateFormatItem-MMdd":"MM/dd",
|
||||
"field-sun-relative+1":"\u4e0b\u9031\u65e5","dateFormatItem-yMMMd":"y\u5e74M\u6708d\u65e5","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-Gy":"G y \u5e74","field-era":"\u5e74\u4ee3"},"dijit/nls/loading":{_localized:{},loadingState:"\u8f09\u5165\u4e2d...",errorState:"\u62b1\u6b49\uff0c\u767c\u751f\u932f\u8aa4"},"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",$locale:"zh-hant-tw",superscriptingExponent:"\u00d7",
|
||||
list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},"decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"\u975e\u6578\u503c",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"\u00a4#,##0.00;(\u00a4#,##0.00)","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:",",percentFormat:"#,##0%","decimalFormat-long":"000\u5146",decimalFormat:"#,##0.###",
|
||||
decimal:".","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"\u524d\u4e00\u500b\u9078\u64c7\u9805",_localized:{},nextMessage:"\u5176\u4ed6\u9078\u64c7\u9805"},"dijit/nls/common":{buttonOk:"\u78ba\u5b9a",buttonCancel:"\u53d6\u6d88",_localized:{},buttonSave:"\u5132\u5b58",itemClose:"\u95dc\u9589"}});
|
||||
//# sourceMappingURL=dojo_zh-tw.js.map
|
||||
BIN
Server/www/spiderbasic/dojo/resources/blank.gif
Normal file
|
After Width: | Height: | Size: 43 B |
1
Server/www/spiderbasic/dojo/themes/claro/claro.css
Normal file
|
After Width: | Height: | Size: 297 B |
|
After Width: | Height: | Size: 105 B |
@ -0,0 +1,23 @@
|
||||
<?xml version="1.0" ?>
|
||||
<!--
|
||||
Source file for buttonDisabled.png, which is used by IE7-9 for Button gradients.
|
||||
Compile to png with batik, gimp, or online tool ex: http://www.fileformat.info/convert/image/svg2raster.htm
|
||||
|
||||
Output should match gradients defined in Button.css. It is however an approximation, since generated
|
||||
output has a constant height, rather than matching the height of each button.
|
||||
-->
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1px" height="18px" viewBox="0 0 1 18" preserveAspectRatio="none">
|
||||
|
||||
<defs>
|
||||
<linearGradient id="disabled" gradientUnits="objectBoundingBox" x1="0%" y1="0%" x2="0%" y2="100%">
|
||||
<stop offset="0%" stop-color="#ffffff" stop-opacity="1"/>
|
||||
<stop offset="50%" stop-color="#ffffff" stop-opacity="0"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
|
||||
<!--
|
||||
Swatch for disabled buttons. It will only fill the top part of the disabled buttons.
|
||||
The bottom of disabled buttons are pure background-color
|
||||
-->
|
||||
<rect x="0" y="0" width="1" height="18" fill="url(#disabled)"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1012 B |
|
After Width: | Height: | Size: 122 B |
@ -0,0 +1,24 @@
|
||||
<?xml version="1.0" ?>
|
||||
<!--
|
||||
Source file for buttonEnabled.png, which is used by IE7-9 for Button gradients.
|
||||
Compile to png with batik, gimp, or online tool ex: http://www.fileformat.info/convert/image/svg2raster.htm
|
||||
|
||||
Output should match gradients defined in Button.css. It is however an approximation, since generated
|
||||
output has a constant height, rather than matching the height of each button.
|
||||
-->
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1px" height="149px" viewBox="0 0 1 149" preserveAspectRatio="none">
|
||||
|
||||
<defs>
|
||||
<linearGradient id="enabled" gradientUnits="objectBoundingBox" x1="0%" y1="0%" x2="0%" y2="100%">
|
||||
<stop offset="0%" stop-color="#ffffff" stop-opacity="1"/>
|
||||
<stop offset="2%" stop-color="#ffffff" stop-opacity="0"/>
|
||||
<stop offset="15%" stop-color="#ffffff" stop-opacity="0.7"/> <!-- near bottom of average height buttons -->
|
||||
</linearGradient>
|
||||
</defs>
|
||||
|
||||
<!--
|
||||
Swatch for enabled buttons. It's 149px tall to account for tall buttons, but usually
|
||||
only the top will be visible.
|
||||
-->
|
||||
<rect x="0" y="0" width="1" height="149" fill="url(#enabled)"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 2.1 KiB |
|
After Width: | Height: | Size: 3.4 KiB |
|
After Width: | Height: | Size: 314 B |
BIN
Server/www/spiderbasic/dojo/themes/claro/form/images/error.png
Normal file
|
After Width: | Height: | Size: 355 B |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 94 B |
@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" ?>
|
||||
<!--
|
||||
Source file for standardGradient.png, which is used by IE7-9 for light-to-dark gradient of many widgets.
|
||||
Compile to png with batik, gimp, or online tool ex: http://www.fileformat.info/convert/image/svg2raster.htm
|
||||
|
||||
Output should match CSS gradient from .standard-gradient() mixin in variables.css.
|
||||
It is however an approximation, since generated
|
||||
output has a constant height, rather than matching the height of each node.
|
||||
-->
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1px" height="16px" viewBox="0 0 1 1" preserveAspectRatio="none">
|
||||
<defs>
|
||||
<linearGradient id="gradient" gradientUnits="objectBoundingBox" x1="0%" y1="0%" x2="0%" y2="100%">
|
||||
<stop offset="0%" stop-color="rgb(190,190,190)" stop-opacity="0.98"/>
|
||||
<stop offset="20%" stop-color="#ffffff" stop-opacity="0.65"/>
|
||||
<stop offset="100%" stop-color="#ffffff" stop-opacity="0"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<rect x="0" y="0" width="1" height="1" fill="url(#gradient)"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 979 B |
BIN
Server/www/spiderbasic/dojo/themes/claro/images/calendar.png
Normal file
|
After Width: | Height: | Size: 142 B |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 998 B |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 649 B |