2013-07-06 10:20:53 -07:00
( function ( window , document , $ ) {
2013-10-21 07:21:32 -07:00
function refreshDirectoryBrowser ( page , path , fileOptions ) {
2013-09-06 13:25:03 -07:00
2013-07-06 10:20:53 -07:00
Dashboard . showLoadingMsg ( ) ;
2013-09-06 13:25:03 -07:00
if ( path ) {
$ ( '.networkHeadline' ) . hide ( ) ;
} else {
$ ( '.networkHeadline' ) . show ( ) ;
}
2013-07-06 10:20:53 -07:00
var promise ;
2013-09-06 13:25:03 -07:00
if ( path === "Network" ) {
promise = ApiClient . getNetworkDevices ( ) ;
}
else if ( path ) {
2013-10-21 07:21:32 -07:00
promise = ApiClient . getDirectoryContents ( path , fileOptions ) ;
2013-07-06 10:20:53 -07:00
} else {
promise = ApiClient . getDrives ( ) ;
}
promise . done ( function ( folders ) {
$ ( '#txtDirectoryPickerPath' , page ) . val ( path || "" ) ;
var html = '' ;
if ( path ) {
var parentPath = path ;
if ( parentPath . endsWith ( '\\' ) ) {
parentPath = parentPath . substring ( 0 , parentPath . length - 1 ) ;
}
var lastIndex = parentPath . lastIndexOf ( '\\' ) ;
parentPath = lastIndex == - 1 ? "" : parentPath . substring ( 0 , lastIndex ) ;
if ( parentPath . endsWith ( ':' ) ) {
parentPath += "\\" ;
}
2013-09-06 13:25:03 -07:00
2013-07-06 10:20:53 -07:00
if ( parentPath == '\\' ) {
2013-09-06 13:25:03 -07:00
parentPath = "Network" ;
2013-07-06 10:20:53 -07:00
}
2013-10-21 07:21:32 -07:00
html += '<li><a class="lnkPath lnkDirectory" data-path="' + parentPath + '" href="#">..</a></li>' ;
2013-07-06 10:20:53 -07:00
}
for ( var i = 0 , length = folders . length ; i < length ; i ++ ) {
var folder = folders [ i ] ;
2013-10-21 07:21:32 -07:00
var cssClass = folder . Type == "File" ? "lnkPath lnkFile" : "lnkPath lnkDirectory" ;
html += '<li><a class="' + cssClass + '" data-path="' + folder . Path + '" href="#">' + folder . Name + '</a></li>' ;
2013-07-06 10:20:53 -07:00
}
2013-09-06 13:25:03 -07:00
if ( ! path ) {
2013-10-21 07:21:32 -07:00
html += '<li><a class="lnkPath lnkDirectory" data-path="Network" href="#">Network</a></li>' ;
2013-09-06 13:25:03 -07:00
}
2013-07-06 10:20:53 -07:00
$ ( '#ulDirectoryPickerList' , page ) . html ( html ) . listview ( 'refresh' ) ;
Dashboard . hideLoadingMsg ( ) ;
} ) . fail ( function ( ) {
$ ( '#txtDirectoryPickerPath' , page ) . val ( "" ) ;
$ ( '#ulDirectoryPickerList' , page ) . html ( '' ) . listview ( 'refresh' ) ;
Dashboard . hideLoadingMsg ( ) ;
} ) ;
}
2013-09-06 13:25:03 -07:00
window . DirectoryBrowser = function ( page ) {
2013-07-06 10:20:53 -07:00
var self = this ;
self . show = function ( options ) {
options = options || { } ;
2013-10-21 07:21:32 -07:00
var fileOptions = {
2013-10-21 07:22:21 -07:00
includeDirectories : true
2013-10-21 07:21:32 -07:00
} ;
if ( options . includeDirectories != null ) {
fileOptions . includeDirectories = options . includeDirectories ;
}
if ( options . includeFiles != null ) {
fileOptions . includeFiles = options . includeFiles ;
}
2013-07-06 10:20:53 -07:00
options . header = options . header || "Select Media Path" ;
options . instruction = options . instruction || "Any path will do, but for optimal playback of bluray, dvd folders, and games, <b>network paths (UNC)</b> are recommended." ;
var html = '<div data-role="popup" id="popupDirectoryPicker" class="ui-corner-all popup" style="min-width:65%;">' ;
html += '<div class="ui-corner-top ui-bar-a" style="text-align: center; padding: 0 20px;">' ;
html += '<h3>' + options . header + '</h3>' ;
html += '</div>' ;
html += '<div data-role="content" class="ui-corner-bottom ui-content">' ;
html += '<form>' ;
html += '<p class="directoryPickerHeadline">' + options . instruction + '</p>' ;
2013-09-14 14:18:57 -07:00
html += '<div style="margin:0;">' ;
2013-10-21 07:21:32 -07:00
html += '<label for="txtDirectoryPickerPath" class="lblDirectoryPickerPath">Current Path:</label>' ;
2013-09-14 14:18:57 -07:00
html += '<div style="width:92%;display:inline-block;"><input id="txtDirectoryPickerPath" name="txtDirectoryPickerPath" type="text" required="required" style="font-weight:bold;" /></div>' ;
2013-09-08 06:38:52 -07:00
html += '<button class="btnRefreshDirectories" type="button" data-icon="refresh" data-inline="true" data-mini="true" data-iconpos="notext">Refresh</button>' ;
2013-07-06 10:20:53 -07:00
html += '</div>' ;
2013-09-14 14:18:57 -07:00
html += '<div class="directoryPickerHeadline networkHeadline" style="margin:5px 0 1em;padding:.5em;max-width:95%;">Network paths <b>can be entered manually</b> in the event the Network button fails to locate your devices. For example, <b>\\\\my-server</b> or <b>\\\\192.168.1.101</b>.</div>' ;
2013-07-06 10:20:53 -07:00
html += '<div style="height: 320px; overflow-y: auto;">' ;
html += '<ul id="ulDirectoryPickerList" data-role="listview" data-inset="true" data-auto-enhanced="false"></ul>' ;
2013-09-06 13:25:03 -07:00
2013-07-06 10:20:53 -07:00
html += '</div>' ;
2013-10-21 07:21:32 -07:00
2013-07-06 10:20:53 -07:00
html += '<p>' ;
html += '<button type="submit" data-theme="b" data-icon="ok">OK</button>' ;
html += '<button type="button" data-icon="delete" onclick="$(this).parents(\'.popup\').popup(\'close\');">Cancel</button>' ;
html += '</p>' ;
html += '</form>' ;
html += '</div>' ;
html += '</div>' ;
$ ( page ) . append ( html ) ;
var popup = $ ( '#popupDirectoryPicker' ) . popup ( ) . trigger ( 'create' ) . on ( "popupafteropen" , function ( ) {
2013-09-06 13:25:03 -07:00
2013-07-06 10:20:53 -07:00
$ ( '#popupDirectoryPicker input:first' , this ) . focus ( ) ;
2013-09-06 13:25:03 -07:00
2013-07-06 10:20:53 -07:00
} ) . popup ( "open" ) . on ( "popupafterclose" , function ( ) {
$ ( 'form' , this ) . off ( "submit" ) ;
2013-09-06 13:25:03 -07:00
2013-07-06 10:20:53 -07:00
$ ( this ) . off ( "click" ) . off ( "change" ) . off ( "popupafterclose" ) . remove ( ) ;
2013-10-21 07:21:32 -07:00
} ) . on ( "click" , ".lnkPath" , function ( ) {
2013-07-06 10:20:53 -07:00
var path = this . getAttribute ( 'data-path' ) ;
2013-10-21 07:21:32 -07:00
if ( $ ( this ) . hasClass ( 'lnkFile' ) ) {
$ ( '#txtDirectoryPickerPath' , page ) . val ( path ) ;
} else {
refreshDirectoryBrowser ( page , path , fileOptions ) ;
}
2013-09-06 13:25:03 -07:00
2013-09-08 06:38:52 -07:00
} ) . on ( "click" , ".btnRefreshDirectories" , function ( ) {
var path = $ ( '#txtDirectoryPickerPath' , page ) . val ( ) ;
2013-10-21 07:21:32 -07:00
refreshDirectoryBrowser ( page , path , fileOptions ) ;
2013-09-08 06:38:52 -07:00
2013-07-06 10:20:53 -07:00
} ) . on ( "change" , "#txtDirectoryPickerPath" , function ( ) {
2013-10-21 07:21:32 -07:00
refreshDirectoryBrowser ( page , this . value , fileOptions ) ;
2013-07-06 10:20:53 -07:00
} ) ;
var txtCurrentPath = $ ( '#txtDirectoryPickerPath' , popup ) ;
if ( options . path ) {
txtCurrentPath . val ( options . path ) ;
}
$ ( 'form' , popup ) . on ( 'submit' , function ( ) {
if ( options . callback ) {
options . callback ( $ ( '#txtDirectoryPickerPath' , this ) . val ( ) ) ;
}
return false ;
} ) ;
refreshDirectoryBrowser ( page , txtCurrentPath . val ( ) ) ;
} ;
2013-09-06 13:25:03 -07:00
self . close = function ( ) {
2013-07-06 10:20:53 -07:00
$ ( '#popupDirectoryPicker' , page ) . popup ( "close" ) ;
} ;
} ;
} ) ( window , document , jQuery ) ;