#!/mod/bin/jimsh

package require cgi
source /mod/webif/lib/setup
require ts.class pretty_size system.class settings.class escape browse.class

cgi_input

set ignore {.nts .thm .hmi}
set include {.ts .avi .mpg .mpeg .wmv .mkv .mp3 .mp4 .mov .hmt}

set dir [cgi_get dir [system mediaroot]]

set model [system model]
set dustbin [system dustbin 1]
set order [[settings new] sortorder]

proc icon {img {hover ""} {extra ""} {class "va"}} {
	puts -nonewline "<img src=$img class=\"$class\" height=21 $extra"
	if {$hover ne ""} {
		puts -nonewline " alt=\"$hover\" title=\"$hover\""
	}
	puts ">"
}

proc directory {file bfile tbfile {img /images/711_1_09_Media_Folder.png}} {
	if {$bfile eq $::dustbin} { set img "/img/Dustbin_Folder.png" }
	lassign [{dir iconset} $file] icons attrs
	puts "<li><a href=\"browse.jim?dir=[cgi_quote_url $file]\"
	    data-transition=flip>
		<img src=$img border=0 class=va width=80 id=\"img$tbfile\">
		<h3>$bfile</h3>
	"
	if {[llength $icons]} {
		puts "<p>[join $icons ""]</p>"
	}
	puts "<p class=ui-li-count>
			<span class=filesize id=\"$tbfile\"></span>
		</p>
	    </a></li>
	"
}

proc entry {file {i 0}} {
	set bfile [file tail $file]
	regsub -all " +" $bfile "" tbfile
	if {[string index $bfile 0] == "\025"} {
		set bfile [string range $bfile 1 end]
	}
	if [file isdirectory "$file"] {
		directory $file $bfile $tbfile
		return
	}
	set ext [file extension $file]
	if {$ext in $::ignore || $ext ni $::include} { return }

	file stat $file st
	set rsz $st(size)
	set sz [pretty_size $rsz]

	set base [file rootname $file]

	if {$ext eq ".ts" && [file exists "${base}.nts"]} {
		set type ts
		set ts [ts fetch $file 1]
		set img Video_TS
		set omenu opt
	} elseif {$ext eq ".hmt"} {
		if {[file exists "${base}.ts"]} { continue }
		# Sole hmt file indicates failure to track.
		set type bad
		set ts 0
		set img Video_Failed
		set omenu oopt
	} else {
		set type gen
		set ts 0
		set img Video_Other
		set omenu oopt
	}

	set new 0
	if {$type eq "ts"} {
		if {[$ts flag "New"] > 0} { set new 1 }
	} elseif {$type eq "gen"} {
		if {![file exists "${base}.hmi"]} { set new 1 }
	}

	if {$new} { append img _New }

	set fscl "fs"
	set synopsis ""
	if {$type eq "ts"} {
		set fscl "fs fsts"
		set synopsis [cgi_quote_html [$ts get synopsis]]
	}

	puts "<li>
		<img class=va border=0 width=80 src=/img/$img.png>
		<h3>$bfile</h3>
		<p class=ui-li-count>
			<span class=filesize> $sz </span>
		</p>
		<p class=icons>
	"

	# Icons

	set locked 0
	set encd 0
	set odencd 1
	set def unknown
	set bx 0
	set dlna 0
	if {$type eq "ts"} {
		# HD / SD
		if {[$ts get definition] eq "HD"} {
			set def HD
			set img "172_1_00_HD"
		} else {
			set def SD
			set img "172_1_26_SD"
		}
		icon "/images/$img.png"

		# Locked
		if {[$ts flag "Locked"] > 0} {
			set locked 1
			icon "/images/178_1_00_Icon_Lock.png" "Locked"
		}

		# Encrypted
		if {[$ts flag "Encrypted"] > 0} {
			set encd 1
			icon "/images/749_1_26_Video_Encryption.png" ""
		}
		if {![$ts flag "ODEncrypted"]} {
			set odencd 0
			icon "/img/Decrypted.png" "Decrypted"
		}

		# Guidance
		if {[$ts flag "Guidance"] > 0} {
			icon "/images/174_1_26_GuidancePolicy.png"
		}

		# Indexed
		if {$::model eq "HDR" && [llength [$ts dlnaloc]]} {
			icon "/img/dlna.png" "Indexed by DLNA Server"
			set dlna 1
		}

		# Shrunk (shown when necessary via Ajax)
		icon "/img/compress.png" "Shrunk" \
		    "id=\"sp_$tbfile\"" "va hidden"
	}

	puts "</p></li>"
}

mheader

puts "
	<span class=\"dir hidden\">$dir</span>
	<ul data-role=listview data-filter=true data-count-theme=e>
	<li data-role=list-divider>$dir
		<p class=ui-li-count>
		<span class=\"filesize dirsize\"></span>
		</p>
	</li>
"

# Parent directory
directory [join [lrange [split $dir /] 0 end-1] /] "\[parent directory\]" \
    _parent "/images/711_3_09_Media_Folder_UP.png"

proc s_time {a b} {
	global dir

	set a "$dir/$a"
	set b "$dir/$b"

	set ad [file isdirectory $a]
	set bd [file isdirectory $b]

	if {$ad && !$bd} { return -1 }
	if {$bd && !$ad} { return 1 }
	if {$ad && $bd} {
		if {$a < $b} { return -1 }
		if {$a > $b} { return 1 }
		return 0
	}

	if {[catch {file stat $a l}]} { return 0}
	set at $l(ctime)
	if {[catch {file stat $b l}]} { return 0}
	set bt $l(ctime)

	if {$at < $bt} { return -1 }
	if {$at > $bt} { return 1 }
	return 0
}

set files [readdir -nocomplain $dir]
switch $order {
	1 {		set files [lsort -command s_time $files] }
	default {	set files [lsort $files] }
}

foreach file $files { entry "$dir/$file" }

puts "</ul>"

mfooter