2010-07-05 16:14:12 +00:00
$ ( function ( ) {
2010-07-05 16:17:38 +00:00
//Ox.debug = Ox.print;
2010-07-05 12:35:51 +00:00
//Ox.print = function() {};
2010-07-01 08:49:53 +00:00
2010-07-05 16:14:12 +00:00
var $body = $ ( "body" ) ,
$document = $ ( document ) ,
$window = $ ( window ) ,
config = {
2010-07-07 12:36:42 +00:00
appId : "oxdb" ,
appName : "0xDB" ,
2010-07-05 16:14:12 +00:00
findKeys : [
{ id : "all" , title : "All" } ,
2010-07-14 15:25:20 +00:00
{ id : "title" , title : "Title" , autocomplete : true } ,
{ id : "director" , title : "Director" , autocomplete : true } ,
{ id : "country" , title : "Country" , autocomplete : true } ,
{ id : "year" , title : "Year" , autocomplete : true } ,
{ id : "language" , title : "Language" , autocomplete : true } ,
{ id : "writer" , title : "Writer" , autocomplete : true } ,
{ id : "producer" , title : "Producer" , autocomplete : true } ,
{ id : "cinematographer" , title : "Cinematographer" , autocomplete : true } ,
{ id : "editor" , title : "Editor" , autocomplete : true } ,
{ id : "actor" , title : "Actor" , autocomplete : true } ,
{ id : "character" , title : "Character" , autocomplete : true } ,
{ id : "name" , title : "Name" , autocomplete : true } ,
{ id : "genre" , title : "Genre" , autocomplete : true } ,
{ id : "keyword" , title : "Keyword" , autocomplete : true } ,
2010-07-05 16:14:12 +00:00
{ id : "summary" , title : "Summary" } ,
{ id : "dialog" , title : "Dialog" }
] ,
groups : [ "director" , "country" , "year" , "language" , "genre" ] ,
itemViews : [
{ id : "info" , title : "Info" } ,
{ id : "statistics" , title : "Statistics" } ,
{ id : "clips" , title : "Clips" } ,
{ id : "timeline" , title : "Timeline" } ,
{ id : "map" , title : "Map" } ,
{ id : "calendar" , title : "Calendar" } ,
{ id : "files" , title : "Files" , admin : true }
] ,
listViews : [
2010-07-06 05:48:42 +00:00
{ id : "list" , title : "as List" } ,
{ id : "icons" , title : "as Icons" } ,
{ id : "info" , title : "with Info" } ,
{ id : "clips" , title : "with Clips" } ,
{ id : "timelines" , title : "with Timelines" } ,
{ id : "maps" , title : "with Maps" } ,
{ id : "calendars" , title : "with Calendars" } ,
{ id : "clip" , title : "as Clips" } ,
{ id : "map" , title : "on Map" } ,
{ id : "calendar" , title : "on Calendar" } ,
2010-07-05 16:14:12 +00:00
] ,
2010-07-11 08:01:15 +00:00
sections : [
{ id : "history" , title : "History" } ,
{ id : "lists" , title : "My Lists" } ,
{ id : "public" , title : "Public Lists" } ,
{ id : "featured" , title : "Featured Lists" }
] ,
2010-07-05 16:14:12 +00:00
sortKeys : [
2010-07-07 22:18:29 +00:00
{ id : "title" , title : "Title" , operator : "" , align : "left" , width : 180 , removable : false } ,
{ id : "director" , title : "Director" , operator : "" , align : "left" , width : 180 , removable : false } ,
2010-07-05 16:14:12 +00:00
{ id : "country" , title : "Country" , operator : "" , align : "left" , width : 120 } ,
{ id : "year" , title : "Year" , operator : "-" , align : "right" , width : 60 } ,
{ id : "language" , title : "Language" , operator : "" , align : "left" , width : 120 } ,
2010-07-06 18:28:42 +00:00
{ id : "runtime" , title : "Runtime" , operator : "" , align : "right" , width : 60 } ,
2010-07-05 16:14:12 +00:00
{ id : "writer" , title : "Writer" , operator : "" , align : "left" , width : 180 } ,
{ id : "producer" , title : "Producer" , operator : "" , align : "left" , width : 180 } ,
{ id : "cinematographer" , title : "Cinematographer" , operator : "" , align : "left" , width : 180 } ,
{ id : "editor" , title : "Editor" , operator : "" , align : "left" , width : 180 } ,
{ id : "actors" , title : "Number of Actors" , operator : "-" , align : "right" , width : 60 } ,
{ id : "genre" , title : "Genre" , operator : "" , align : "left" , width : 120 } ,
{ id : "keywords" , title : "Number of Keywords" , operator : "-" , align : "right" , width : 60 } ,
{ id : "summary" , title : "Words in Summary" , operator : "-" , align : "right" , width : 60 } ,
{ id : "trivia" , title : "Words in Trivia" , operator : "-" , align : "right" , width : 60 } ,
{ id : "releasedate" , title : "Release Date" , operator : "-" , align : "left" , width : 90 } ,
{ id : "budget" , title : "Budget" , operator : "-" , align : "right" , width : 90 } ,
{ id : "gross" , title : "Gross" , operator : "-" , align : "right" , width : 90 } ,
{ id : "profit" , title : "Profit" , operator : "-" , align : "right" , width : 90 } ,
{ id : "rating" , title : "Rating" , operator : "-" , align : "right" , width : 60 } ,
{ id : "votes" , title : "Votes" , operator : "-" , align : "right" , width : 90 } ,
2010-07-06 05:48:42 +00:00
{ id : "id" , title : "ID" , operator : "" , align : "left" , width : 90 } ,
2010-07-05 16:14:12 +00:00
{ id : "aspectratio" , title : "Aspect Ratio" , operator : "-" , align : "left" , width : 90 } ,
{ id : "duration" , title : "Duration" , operator : "-" , align : "right" , width : 90 } ,
{ id : "color" , title : "Color" , operator : "" , align : "left" , width : 90 } ,
{ id : "saturation" , title : "Saturation" , operator : "-" , align : "right" , width : 60 } ,
{ id : "brightness" , title : "Brightness" , operator : "-" , align : "right" , width : 60 } ,
{ id : "volume" , title : "Volume" , operator : "-" , align : "right" , width : 60 } ,
{ id : "clips" , title : "Clips" , operator : "-" , align : "right" , width : 60 } ,
{ id : "cuts" , title : "Cuts" , operator : "-" , align : "right" , width : 60 } ,
{ id : "cutsperminute" , title : "Cuts per Minute" , operator : "-" , align : "right" , width : 60 } ,
{ id : "words" , title : "Words" , operator : "-" , align : "right" , width : 60 } ,
{ id : "wordsperminute" , title : "Words per Minute" , operator : "-" , align : "right" , width : 60 } ,
{ id : "resolution" , title : "Resolution" , operator : "-" , align : "left" , width : 90 } ,
{ id : "pixels" , title : "Pixels" , operator : "-" , align : "right" , width : 90 } ,
{ id : "size" , title : "Size" , operator : "-" , align : "right" , width : 90 } ,
{ id : "bitrate" , title : "Bitrate" , operator : "-" , align : "right" , width : 90 } ,
{ id : "files" , title : "Files" , operator : "-" , align : "right" , width : 60 } ,
{ id : "filename" , title : "Filename" , operator : "" , align : "left" , width : 180 } ,
{ id : "published" , title : "Date Published" , operator : "-" , align : "left" , width : 90 } ,
{ id : "modified" , title : "Date Modified" , operator : "-" , align : "left" , width : 90 }
] ,
2010-07-06 05:48:42 +00:00
totals : [
{ id : "items" } ,
{ id : "runtime" } ,
{ id : "files" , admin : true } ,
{ id : "duration" , admin : true } ,
{ id : "size" , admin : true } ,
{ id : "pixels" }
] ,
2010-07-05 16:14:12 +00:00
userSettings : {
group : "guest" ,
ui : {
2010-07-14 15:25:20 +00:00
columns : [ "id" , "title" , "director" , "country" , "year" , "language" , "runtime" , "genre" ] ,
find : { conditions : [ { key : "" , value : "" , operator : "" } ] , operator : "" } ,
2010-07-15 19:04:19 +00:00
groupsSize : 128 ,
2010-07-05 16:14:12 +00:00
itemView : "info" ,
2010-07-06 18:28:42 +00:00
listsSize : 192 ,
2010-07-05 16:14:12 +00:00
listView : "list" ,
2010-07-11 08:01:15 +00:00
sections : [ "history" , "lists" , "public" , "featured" ] ,
2010-07-05 16:14:12 +00:00
showGroups : true ,
showInfo : true ,
2010-07-06 18:28:42 +00:00
showLists : true ,
2010-07-05 16:14:12 +00:00
showMovies : true ,
sort : [
{ key : "director" , operator : "" }
] ,
2010-07-07 12:36:42 +00:00
theme : $ . browser . mozilla ? "classic" : "modern"
2010-07-05 16:14:12 +00:00
} ,
username : ""
}
} ,
user = config . userSettings ,
2010-07-06 05:48:42 +00:00
$ui = {
groups : [ ]
2010-07-08 15:02:22 +00:00
} ,
ui = {
infoRatio : 4 / 3 ,
selectedMovies : [ ]
2010-07-14 15:25:20 +00:00
} ,
// Objects
Query = ( function ( ) {
function constructFind ( query ) {
Ox . print ( "cF" , query )
return $ . map ( query . conditions , function ( v , i ) {
if ( ! Ox . isUndefined ( v . conditions ) ) {
return "[" + constructFind ( v ) + "]" ;
} else {
return v . value !== "" ? v . key + ( v . key ? ":" : "" ) + constructValue ( v . value , v . operator ) : null ;
}
} ) . join ( query . operator ) ;
}
function constructValue ( value , operator ) {
operator = operator . replace ( "=" , "^$" ) ;
if ( operator . indexOf ( "$" ) > - 1 ) {
value = operator . substr ( 0 , operator . length - 1 ) + value + "$"
} else {
value = operator + value ;
}
return value ;
}
function mergeFind ( ) {
}
function parseFind ( str ) {
var find = {
conditions : [ ] ,
operator : ""
} ,
2010-07-14 15:46:57 +00:00
subconditions = str . match ( /\[.*?\]/g ) || [ ] ;
2010-07-14 15:25:20 +00:00
$ . each ( subconditions , function ( i , v ) {
2010-07-14 15:46:57 +00:00
subconditions [ i ] = v . substr ( 1 , v . length - 2 ) ;
2010-07-14 15:25:20 +00:00
str = str . replace ( v , "[" + i + "]" ) ;
} ) ;
if ( str . indexOf ( "," ) > - 1 ) {
find . operator = "&" ;
} else if ( str . indexOf ( "|" ) > - 1 ) {
find . operator = "|" ;
}
2010-07-14 15:46:57 +00:00
Ox . print ( "pF" , str , find . operator )
2010-07-14 15:25:20 +00:00
find . conditions = $ . map ( find . operator === "" ? [ str ] : str . split ( find . operator == "&" ? "," : "|" ) , function ( v , i ) {
2010-07-14 15:46:57 +00:00
Ox . print ( "v" , v )
2010-07-14 15:25:20 +00:00
var ret , kv ;
if ( v [ 0 ] == "[" ) {
2010-07-14 15:46:57 +00:00
Ox . print ( "recursion" , subconditions )
ret = parseFind ( subconditions [ parseInt ( v . substr ( 1 , v . length - 2 ) ) ] ) ;
2010-07-14 15:25:20 +00:00
} else {
2010-07-14 15:46:57 +00:00
kv = ( ( v . indexOf ( ":" ) > - 1 ? "" : ":" ) + v ) . split ( ":" ) ;
2010-07-14 15:25:20 +00:00
ret = $ . extend ( {
key : kv [ 0 ]
} , parseValue ( kv [ 1 ] ) ) ;
}
return ret ;
} ) ;
return find ;
}
function parseValue ( str ) {
var value = {
value : str ,
operator : ""
} ;
if ( value . value [ 0 ] == "!" ) {
value . operator = "!"
value . value = value . value . substr ( 1 ) ;
}
if ( "^<>" . indexOf ( value . value [ 0 ] ) > - 1 ) {
value . operator += value . value [ 0 ] ;
value . value = value . value . substr ( 1 ) ;
}
if ( value . value . substr ( - 1 ) == "$" ) {
value . operator += "$" ;
2010-07-14 15:46:57 +00:00
value . value = value . value . substr ( 0 , value . value . length - 1 ) ;
2010-07-14 15:25:20 +00:00
}
2010-07-14 15:52:53 +00:00
value . operator = value . operator . replace ( "^$" , "=" ) ;
2010-07-14 15:25:20 +00:00
return value ;
}
return {
fromString : function ( str ) {
var query = Ox . unserialize ( str ) ,
sort = [ ] ;
if ( "find" in query ) {
user . ui . find = parseFind ( query . find ) ;
Ox . print ( "user.ui.find" , user . ui . find )
}
if ( "sort" in query ) {
sort = query . sort . split ( "," )
user . ui . sort = $ . map ( query . sort . split ( "," ) , function ( v , i ) {
var hasOperator = "+-" . indexOf ( v [ 0 ] ) > - 1 ,
key = hasOperator ? query . sort . substr ( 1 ) : query . sort ,
operator = hasOperator ? v [ 0 ] . replace ( "+" , "" ) : Ox . getObjectById ( config . sortKeys , key ) . operator ;
return {
key : key ,
operator : operator
} ;
} ) ;
}
if ( "view" in query ) {
user . ui . listView = query . view ;
}
} ,
toObject : function ( groupId ) {
Ox . print ( "tO" , user . ui . find . conditions )
// the inner $.merge() creates a clone
var conditions = $ . merge ( $ . merge ( [ ] , user . ui . find . conditions ) , groups ? $ . map ( groups , function ( v , i ) {
if ( v . id != groupId && v . conditions . length ) {
return v . conditions . length == 1 ? v . conditions : {
conditions : v . conditions ,
operator : "|"
} ;
}
} ) : [ ] ) ,
operator = conditions . length < 2 ? "" : "," ;
Ox . print ( groupId , user . ui . find , conditions ) ;
return {
conditions : conditions ,
operator : operator
} ;
} ,
toString : function ( ) {
Ox . print ( "tS" , user . ui . find )
return Ox . serialize ( {
find : constructFind ( Query . toObject ( ) ) ,
sort : user . ui . sort [ 0 ] . operator + user . ui . sort [ 0 ] . key ,
view : user . ui . listView
} ) ;
}
} ;
} ) ( ) ;
2010-07-05 16:14:12 +00:00
// App
2010-07-14 15:25:20 +00:00
Query . fromString ( location . hash . substr ( 1 ) ) ;
Ox . print ( "user.ui" , user . ui )
2010-07-07 12:36:42 +00:00
document . title = config . appName ;
2010-07-05 16:14:12 +00:00
Ox . theme ( user . ui . theme ) ;
2010-06-24 13:11:46 +00:00
app = new Ox . App ( {
2010-07-07 12:36:42 +00:00
name : config . appName ,
2010-06-24 13:11:46 +00:00
requestURL : "/api/"
} ) ;
2010-07-05 16:14:12 +00:00
// MainMenu
$ui . mainMenu = new Ox . MainMenu ( {
extras : [
$ui . loadingIcon = new Ox . LoadingIcon ( {
size : "medium"
} )
] ,
menus : [
2010-07-07 12:36:42 +00:00
{ id : config . appId , title : config . appName , items : [
2010-07-05 16:14:12 +00:00
{ id : "about" , title : "About" } ,
{ } ,
{ id : "home" , title : "Home Screen" } ,
{ id : "faq" , title : "Frequently Asked Questions" } ,
{ id : "tos" , title : "Terms of Service" } ,
{ } ,
{ id : "contact" , title : "Contact" }
] } ,
{ id : "user" , title : "User" , items : [
{ id : "username" , title : "User: not logged in" , disabled : true } ,
{ } ,
2010-07-06 18:28:42 +00:00
{ id : "preferences" , title : "Preferences" , disabled : true , keyboard : "control ," } ,
2010-07-05 16:14:12 +00:00
{ } ,
2010-07-08 15:02:22 +00:00
{ id : "register" , title : "Create an Account..." } ,
{ id : "login" , title : "Login..." }
2010-07-05 16:14:12 +00:00
] } ,
{ id : "list" , title : "List" , items : [
{ id : "history" , title : "History" , items : [
{ id : "allmovies" , title : "All Movies" }
] } ,
{ id : "lists" , title : "View List" , items : [
{ id : "favorites" , title : "Favorites" }
] } ,
{ id : "features" , title : "View Feature" , items : [
{ id : "situationistfilm" , title : "Situationist Film" } ,
{ id : "timelines" , title : "Timelines" }
] } ,
{ } ,
2010-07-06 18:28:42 +00:00
{ id : "newlist" , title : "New List..." , keyboard : "control n" } ,
{ id : "newlistfromselection" , title : "New List from Selection..." , disabled : true , keyboard : "shift control n" } ,
{ id : "newsmartlist" , title : "New Smart List..." , keyboard : "alt control n" } ,
2010-07-07 22:18:29 +00:00
{ id : "newsmartlistfromresults" , title : "New Smart List from Results..." , keyboard : "shift alt control n" } ,
2010-07-05 16:14:12 +00:00
{ } ,
2010-07-07 22:18:29 +00:00
{ id : "addmovietolist" , title : [ "Add Selected Movie to List..." , "Add Selected Movies to List..." ] , disabled : true } ,
2010-07-05 16:14:12 +00:00
{ } ,
{ id : "setposterframe" , title : "Set Poster Frame" , disabled : true }
] } ,
2010-07-08 15:02:22 +00:00
{ id : "edit" , title : "Edit" , items : [
{ id : "undo" , title : "Undo" , disabled : true , keyboard : "control z" } ,
{ id : "redo" , title : "Redo" , disabled : true , keyboard : "shift control z" } ,
{ } ,
{ id : "cut" , title : "Cut" , disabled : true , keyboard : "control x" } ,
{ id : "copy" , title : "Copy" , disabled : true , keyboard : "control c" } ,
{ id : "paste" , title : "Paste" , disabled : true , keyboard : "control v" } ,
{ id : "delete" , title : "Delete" , disabled : true , keyboard : "delete" } ,
{ } ,
{ id : "selectall" , title : "Select All" , disabled : true , keyboard : "control a" } ,
{ id : "selectnone" , title : "Select None" , disabled : true , keyboard : "shift control a" } ,
{ id : "invertselection" , title : "Invert Selection" , disabled : true , keyboard : "alt control a" }
] } ,
2010-07-05 16:14:12 +00:00
{ id : "view" , title : "View" , items : [
{ id : "movies" , title : "View Movies" , items : $ . map ( config . listViews , function ( view , i ) {
2010-07-06 05:48:42 +00:00
return $ . extend ( {
2010-07-05 16:14:12 +00:00
checked : user . ui . listView == view . id ,
group : "viewmovies"
2010-07-06 05:48:42 +00:00
} , view ) ;
2010-07-05 16:14:12 +00:00
} ) } ,
{ id : "icons" , title : "Icons" , items : [
{ id : "poster" , title : "Poster" } ,
{ id : "still" , title : "Still" } ,
{ id : "timeline" , title : "Timeline" }
] } ,
{ id : "info" , title : "Info" , items : [
{ id : "poster" , title : "Poster" } ,
{ id : "video" , title : "Video" }
] } ,
{ } ,
2010-07-07 22:18:29 +00:00
{ id : "openmovie" , title : [ "Open Movie" , "Open Movies" ] , disabled : true , items : $ . map ( config . itemViews , function ( view , i ) {
2010-07-05 16:14:12 +00:00
return view ;
} ) } ,
{ } ,
2010-07-06 18:28:42 +00:00
{ id : "lists" , title : "Hide Lists" , keyboard : "shift l" } ,
{ id : "info" , title : "Hide Info" , keyboard : "shift i" } ,
{ id : "groups" , title : "Hide Groups" , keyboard : "shift g" } ,
{ id : "movies" , title : "Hide Movies" , disabled : true , keyboard : "shift m" }
2010-07-05 16:14:12 +00:00
] } ,
{ id : "sort" , title : "Sort" , items : [
{ id : "sortmovies" , title : "Sort Movies by" , items : $ . map ( config . sortKeys , function ( key , i ) {
2010-07-06 05:48:42 +00:00
return $ . extend ( {
2010-07-07 12:36:42 +00:00
checked : user . ui . sort [ 0 ] . key == key . id ,
2010-07-05 16:14:12 +00:00
group : "sortmovies"
2010-07-06 05:48:42 +00:00
} , key ) ;
2010-07-05 16:14:12 +00:00
} ) } ,
{ id : "ordermovies" , title : "Order Movies" , items : [
2010-07-07 12:36:42 +00:00
{ id : "ascending" , title : "Ascending" , group : "ordermovies" , checked : user . ui . sort [ 0 ] . operator === "" } ,
2010-07-05 16:14:12 +00:00
{ id : "descending" , title : "Descending" , group : "ordermovies" , checked : user . ui . sort [ 0 ] . operator == "-" }
] } ,
2010-07-06 18:28:42 +00:00
{ id : "advancedsort" , title : "Advanced Sort..." , keyboard : "shift control s" } ,
2010-07-05 16:14:12 +00:00
{ } ,
{ id : "groupsstuff" , title : "Groups Stuff" }
] } ,
{ id : "find" , title : "Find" , items : [
{ id : "find" , title : "Find" , items : $ . map ( config . findKeys , function ( key , i ) {
2010-07-06 05:48:42 +00:00
return $ . extend ( {
2010-07-07 12:36:42 +00:00
checked : user . ui . find . key == key . id || user . ui . find . key === "" && key . id == "all" ,
2010-07-05 16:14:12 +00:00
group : "find"
2010-07-06 05:48:42 +00:00
} , key )
2010-07-05 16:14:12 +00:00
} ) } ,
2010-07-06 18:28:42 +00:00
{ id : "advancedfind" , title : "Advanced Find..." , keyboard : "shift control f" }
2010-07-05 16:14:12 +00:00
] } ,
{ id : "code" , title : "Code" , items : [
{ id : "download" , title : "Download" } ,
{ id : "contribute" , title : "Contribute" } ,
{ id : "report" , title : "Report a Bug" } ,
] } ,
{ id : "help" , title : "Help" , items : [
2010-07-07 12:36:42 +00:00
{ id : "help" , title : config . appName + " Help" , keyboard : "shift ?" }
2010-07-05 16:14:12 +00:00
] } ,
{ id : "debug" , title : "Debug" , items : [
{ id : "query" , title : "Show Query" }
] }
]
} ) ;
2010-07-11 08:01:15 +00:00
// Lists
$ui . lists = new Ox . Element ( ) ;
$ui . sections = [ ] ;
$ . each ( user . ui . sections , function ( i , id ) {
var section = new Ox . CollapsePanel ( {
size : "small" ,
title : Ox . getObjectById ( config . sections , id ) . title
} ) ;
$ui . sections . push ( section ) ;
section . $content . append (
$ ( "<div>" ) . css ( { height : "20px" } ) . append (
$ ( "<div>" ) . css ( { float : "left" , width : "16px" , height : "16px" , margin : "1px" } ) . append (
$ ( "<img>" ) . attr ( { src : "static/oxjs/build/png/ox.ui.modern/iconFind.png" } ) . css ( { width : "16px" , height : "16px" , border : 0 , background : "rgb(64, 64, 64)" , WebkitBorderRadius : "2px" } )
)
) . append (
$ ( "<div>" ) . css ( { float : "left" , width : "122px" , height : "14px" , margin : "2px" } ) . html ( "Foo" )
) . append (
$ ( "<div>" ) . css ( { float : "left" , width : "40px" , height : "14px" , margin : "2px" , textAlign : "right" } ) . html ( "23" )
)
) ;
$ui . lists . append ( section ) ;
} )
// Info
2010-07-08 15:02:22 +00:00
$ui . info = new Ox . Element ( )
. append (
$ui . infoStill = new Ox . Element ( "img" )
. css ( {
position : "absolute" ,
left : 0 ,
top : 0
} )
)
. append (
$ui . infoTimeline = new Ox . Element ( "img" )
. css ( {
position : "absolute" ,
left : 0 ,
bottom : 0 ,
height : "16px" ,
} )
) ;
2010-07-05 16:14:12 +00:00
// Toolbar
$ui . toolbar = new Ox . Bar ( {
size : 24
} )
. append (
$ui . groupsButton = new Ox . Button ( {
id : "groupsButton" ,
value : [ "Show Groups" , "Hide Groups" ]
} )
. css ( {
float : "left" ,
margin : "4px"
} )
. width ( 80 )
)
. append (
$ui . viewSelect = new Ox . Select ( {
id : "viewSelect" ,
items : $ . map ( config . listViews , function ( view , i ) {
2010-07-06 05:48:42 +00:00
view . title = "View " + view . title
return $ . extend ( {
checked : user . ui . listView == view . id ,
} , view ) ;
2010-07-05 16:14:12 +00:00
} )
} )
. css ( {
float : "left" ,
margin : "4px"
} )
. width ( 120 )
)
. append (
$ui . findInput = new Ox . Input ( {
autocomplete : function ( key , value , callback ) {
2010-07-15 14:41:40 +00:00
var findKey = Ox . getObjectById ( config . findKeys , key )
2010-07-05 16:14:12 +00:00
Ox . print ( "autocomplete" , key , value ) ;
value === "" && Ox . print ( "Warning: autocomplete function should never be called with empty value" ) ;
2010-07-14 15:25:20 +00:00
if ( "autocomplete" in findKey && findKey . autocomplete ) {
2010-07-05 16:14:12 +00:00
app . request ( "find" , {
keys : [ key ] ,
query : {
conditions : [
{
key : key ,
value : value ,
operator : ""
}
] ,
operator : ""
} ,
sort : [
{
key : key ,
operator : ""
}
] ,
range : [ 0 , 10 ]
} , function ( result ) {
callback ( $ . map ( result . data . items , function ( v ) {
return v . title ;
} ) ) ;
} ) ;
2010-07-14 15:25:20 +00:00
} else {
callback ( ) ;
2010-07-05 16:14:12 +00:00
}
} ,
clear : true ,
highlight : true ,
id : "findInput" ,
label : $ . map ( config . findKeys , function ( key , i ) {
return {
id : key . id ,
title : "Find: " + key . title
}
} ) ,
labelWidth : 85
} )
2010-07-06 05:48:42 +00:00
. css ( {
2010-07-05 16:14:12 +00:00
float : "right" ,
margin : "4px"
} )
. width ( 300 )
) ;
// Groups
2010-07-07 07:18:29 +00:00
var panelWidth = $document . width ( ) - user . ui . listsSize - 1 ,
2010-07-05 16:14:12 +00:00
groups = $ . map ( config . groups , function ( id , i ) {
2010-07-07 07:18:29 +00:00
var title = Ox . getObjectById ( config . sortKeys , id ) . title ,
width = getGroupWidth ( i , panelWidth ) ;
2010-07-05 16:14:12 +00:00
return {
id : id ,
conditions : [ ] ,
element : new Ox . TextList ( {
columns : [
{
align : "left" ,
id : "name" ,
operator : id == "year" ? "-" : "+" ,
title : title ,
unique : true ,
visible : true ,
2010-07-07 07:18:29 +00:00
width : width . column
2010-07-05 16:14:12 +00:00
} ,
{
align : "right" ,
id : "items" ,
operator : "-" ,
title : "#" ,
visible : true ,
width : 40
}
] ,
id : "group_" + id ,
request : function ( options ) {
delete options . keys ;
app . request ( "find" , $ . extend ( options , {
group : id ,
2010-07-14 15:25:20 +00:00
query : Query . toObject ( )
2010-07-05 16:14:12 +00:00
} ) , options . callback ) ;
} ,
sort : [
{
key : id == "year" ? "name" : "items" ,
operator : "-"
}
]
} ) ,
2010-07-07 07:18:29 +00:00
size : width . list ,
2010-07-05 16:14:12 +00:00
title : title
} ;
} ) ;
2010-07-06 05:48:42 +00:00
// Statusbar
$ui . statusbar = new Ox . Bar ( {
size : 16
} )
. css ( {
textAlign : "center"
} )
. append (
new Ox . Element ( )
. css ( {
2010-07-06 18:28:42 +00:00
marginTop : "2px" ,
2010-07-06 05:48:42 +00:00
fontSize : "9px"
} )
. append (
$ui . total = new Ox . Element ( "span" )
)
. append (
new Ox . Element ( "span" ) . html ( " — " )
)
. append (
$ui . selected = new Ox . Element ( "span" )
)
) ;
2010-07-05 16:14:12 +00:00
// Interface
$ui . app = new Ox . SplitPanel ( {
2010-06-24 13:11:46 +00:00
elements : [
{
2010-07-05 16:14:12 +00:00
element : $ui . mainMenu ,
size : 20
2010-06-24 13:11:46 +00:00
} ,
{
2010-07-05 16:14:12 +00:00
element : $ui . mainPanel = new Ox . SplitPanel ( {
elements : [
{
2010-07-06 18:28:42 +00:00
collapsible : true ,
2010-07-05 16:14:12 +00:00
element : $ui . leftPanel = new Ox . SplitPanel ( {
elements : [
{
2010-07-11 08:01:15 +00:00
element : $ui . lists . options ( {
2010-07-06 18:28:42 +00:00
id : "listsPanel"
2010-07-11 08:01:15 +00:00
} )
2010-07-05 16:14:12 +00:00
} ,
{
2010-07-06 18:28:42 +00:00
collapsible : true ,
2010-07-08 15:02:22 +00:00
element : $ui . info . options ( {
2010-07-06 18:28:42 +00:00
id : "infoPanel"
} ) ,
2010-07-08 15:02:22 +00:00
size : user . ui . listsSize / ui . infoRatio + 16
2010-07-05 16:14:12 +00:00
}
2010-07-06 05:48:42 +00:00
] ,
2010-07-06 18:28:42 +00:00
id : "leftPanel" ,
2010-07-06 05:48:42 +00:00
orientation : "vertical"
2010-07-05 16:14:12 +00:00
} ) ,
2010-07-06 18:28:42 +00:00
resizable : true ,
2010-07-15 19:04:19 +00:00
resize : [ 128 , 192 , 256 ] ,
size : user . ui . listsSize
2010-07-05 16:14:12 +00:00
} ,
{
element : $ui . rightPanel = new Ox . SplitPanel ( {
elements : [
{
2010-07-16 07:12:46 +00:00
element : $ui . toolbar . css ( { zIndex : 2 } ) , // fixme: remove later
2010-07-05 16:14:12 +00:00
size : 24
} ,
{
element : $ui . contentPanel = new Ox . SplitPanel ( {
elements : [
{
2010-07-15 19:04:19 +00:00
collapsible : true ,
2010-07-05 16:14:12 +00:00
element : $ui . groupsOuterPanel = new Ox . SplitPanel ( {
elements : [
{
2010-07-06 05:48:42 +00:00
element : $ui . groups [ 0 ] = groups [ 0 ] . element ,
2010-07-05 16:14:12 +00:00
size : groups [ 0 ] . size
} ,
{
element : $ui . groupsInnerPanel = new Ox . SplitPanel ( {
elements : [
{
2010-07-06 05:48:42 +00:00
element : $ui . groups [ 1 ] = groups [ 1 ] . element ,
2010-07-05 16:14:12 +00:00
size : groups [ 1 ] . size
} ,
{
2010-07-06 05:48:42 +00:00
element : $ui . groups [ 2 ] = groups [ 2 ] . element ,
2010-07-05 16:14:12 +00:00
} ,
{
2010-07-06 05:48:42 +00:00
element : $ui . groups [ 3 ] = groups [ 3 ] . element ,
2010-07-05 16:14:12 +00:00
size : groups [ 3 ] . size
}
2010-07-06 05:48:42 +00:00
] ,
orientation : "horizontal"
2010-07-05 16:14:12 +00:00
} )
} ,
{
2010-07-06 05:48:42 +00:00
element : $ui . groups [ 4 ] = groups [ 4 ] . element ,
2010-07-05 16:14:12 +00:00
size : groups [ 4 ] . size
2010-07-06 05:48:42 +00:00
} ,
] ,
orientation : "horizontal"
2010-07-05 16:14:12 +00:00
} ) ,
2010-07-15 19:04:19 +00:00
resizable : true ,
resize : [ 96 , 112 , 128 , 144 , 160 , 176 ] ,
size : user . ui . groupsSize
2010-07-05 16:14:12 +00:00
} ,
{
element : $ui . list = constructList ( user . ui . listView )
}
2010-07-06 05:48:42 +00:00
] ,
orientation : "vertical"
2010-07-05 16:14:12 +00:00
} )
2010-07-06 05:48:42 +00:00
} ,
2010-07-05 16:14:12 +00:00
{
2010-07-06 05:48:42 +00:00
element : $ui . statusbar ,
2010-07-05 16:14:12 +00:00
size : 16
}
2010-07-06 05:48:42 +00:00
] ,
2010-07-06 18:28:42 +00:00
id : "rightPanel" ,
2010-07-06 05:48:42 +00:00
orientation : "vertical"
2010-07-06 18:28:42 +00:00
} ) ,
2010-07-05 16:14:12 +00:00
}
2010-07-06 05:48:42 +00:00
] ,
orientation : "horizontal"
2010-07-05 16:14:12 +00:00
} )
2010-06-24 13:11:46 +00:00
}
2010-07-06 05:48:42 +00:00
] ,
orientation : "vertical"
2010-07-05 16:14:12 +00:00
} ) . appendTo ( $body ) ;
// Events
2010-07-06 05:48:42 +00:00
Ox . Request . requests ( ) && $ui . loadingIcon . start ( ) ;
2010-07-05 16:14:12 +00:00
Ox . Event . bind ( "requestStart" , function ( ) {
Ox . print ( "requestStart" )
2010-07-06 05:48:42 +00:00
$ui . loadingIcon . start ( ) ;
2010-07-05 16:14:12 +00:00
} ) ;
Ox . Event . bind ( "requestStop" , function ( ) {
Ox . print ( "requestStop" )
2010-07-06 05:48:42 +00:00
$ui . loadingIcon . stop ( ) ;
2010-07-05 16:14:12 +00:00
} ) ;
2010-07-07 12:36:42 +00:00
// Menu
2010-07-14 15:25:20 +00:00
Ox . Event . bind ( "click_about" , function ( event , data ) {
var $dialog = new Ox . Dialog ( {
buttons : [
{
click : function ( ) {
$dialog . close ( ) ;
} ,
id : "close" ,
title : "Close" ,
value : "Close"
}
] ,
id : "about" ,
title : "About"
} ) . open ( ) ;
} ) ;
2010-07-07 12:36:42 +00:00
Ox . Event . bind ( "change_viewmovies" , function ( event , data ) {
$ui . viewSelect . selectItem ( data . id ) ;
} ) ;
Ox . Event . bind ( "change_sortmovies" , function ( event , data ) {
var operator = Ox . getObjectById ( config . sortKeys , data . id ) . operator ;
$ui . mainMenu . checkItem ( "sort_ordermovies_" + ( operator === "" ? "ascending" : "descending" ) ) ;
$ui . list . sort ( data . id , operator ) ;
Ox . print ( user . ui . sort [ 0 ] . key , user . ui . sort [ 0 ] . operator ) ;
} ) ;
Ox . Event . bind ( "change_ordermovies" , function ( event , data ) {
$ui . list . sort ( user . ui . sort [ 0 ] . key , data . id == "ascending" ? "" : "-" ) ;
Ox . print ( user . ui . sort [ 0 ] . key , user . ui . sort [ 0 ] . operator ) ;
} ) ;
Ox . Event . bind ( "change_find" , function ( event , data ) {
$ui . findInput . changeLabel ( data . id ) ;
} ) ;
2010-07-14 15:25:20 +00:00
Ox . Event . bind ( "click_query" , function ( event , data ) {
var $dialog = new Ox . Dialog ( {
buttons : [
{
click : function ( ) {
$dialog . close ( ) ;
} ,
id : "close" ,
title : "Close" ,
value : "Close"
}
] ,
id : "query" ,
title : "Query"
} ) . append ( Query . toString ( ) + "<br/><br/>" + JSON . stringify ( Query . toObject ( ) ) ) . open ( ) ;
} ) ;
2010-07-07 12:36:42 +00:00
// Toolbar
2010-07-05 16:14:12 +00:00
Ox . Event . bind ( "change_viewSelect" , function ( event , data ) {
2010-07-06 05:48:42 +00:00
$ui . list . replaceWith ( constructList ( data . id ) ) ;
2010-07-05 16:14:12 +00:00
} ) ;
2010-07-07 12:36:42 +00:00
Ox . Event . bind ( "change_findInputLabel" , function ( event , data ) {
$ui . mainMenu . checkItem ( "find_find_" + data . id ) ;
} ) ;
2010-07-05 16:14:12 +00:00
2010-07-06 05:48:42 +00:00
Ox . Event . bind ( "submit_findInput" , function ( event , data ) {
2010-07-14 15:25:20 +00:00
var query ;
user . ui . find = {
conditions : [
{
key : data . key == "all" ? "" : data . key ,
value : data . value ,
operator : ""
}
] ,
2010-07-05 16:14:12 +00:00
operator : ""
} ;
$ . each ( groups , function ( i , group ) {
groups [ i ] . conditions = [ ] ;
2010-07-06 05:48:42 +00:00
$ui . groups [ i ] . options ( {
2010-07-05 16:14:12 +00:00
request : function ( options ) {
delete options . keys ;
return app . request ( "find" , $ . extend ( options , {
group : group . id ,
2010-07-14 15:25:20 +00:00
query : Query . toObject ( group . id )
2010-07-05 16:14:12 +00:00
} ) , options . callback ) ;
}
} ) ;
} ) ;
2010-07-06 05:48:42 +00:00
$ui . list . options ( {
2010-07-05 16:14:12 +00:00
request : function ( options ) {
return app . request ( "find" , $ . extend ( options , {
2010-07-14 15:25:20 +00:00
query : query = Query . toObject ( )
2010-07-05 16:14:12 +00:00
} ) , options . callback ) ;
}
2010-07-14 15:25:20 +00:00
} ) ;
location . hash = Query . toString ( query ) ;
2010-07-05 16:14:12 +00:00
} ) ;
2010-07-07 12:36:42 +00:00
// Groups
2010-07-05 16:14:12 +00:00
$ . each ( groups , function ( i , group ) {
Ox . Event . bind ( "select_group_" + group . id , function ( event , data ) {
2010-07-14 15:25:20 +00:00
var query ;
groups [ i ] . conditions = $ . map ( data . ids , function ( v ) {
return {
key : group . id ,
value : v ,
operator : "="
} ;
} ) ;
query = Query . toObject ( ) ;
2010-07-06 05:48:42 +00:00
$ui . list . options ( {
2010-07-05 16:14:12 +00:00
request : function ( options ) {
return app . request ( "find" , $ . extend ( options , {
2010-07-14 15:25:20 +00:00
query : query
2010-07-05 16:14:12 +00:00
} ) , options . callback ) ;
}
} ) ;
$ . each ( groups , function ( i _ , group _ ) {
if ( i _ != i ) {
2010-07-06 05:48:42 +00:00
$ui . groups [ i _ ] . options ( {
2010-07-05 16:14:12 +00:00
request : function ( options ) {
delete options . keys ;
return app . request ( "find" , $ . extend ( options , {
group : group _ . id ,
2010-07-14 15:25:20 +00:00
query : Query . toObject ( group _ . id )
2010-07-05 16:14:12 +00:00
} ) , options . callback ) ;
}
} ) ;
}
} ) ;
2010-07-14 15:25:20 +00:00
location . hash = Query . toString ( query ) ;
2010-07-05 16:14:12 +00:00
} ) ;
} ) ;
2010-07-07 12:36:42 +00:00
// List
2010-07-05 16:14:12 +00:00
Ox . Event . bind ( "load_list" , function ( event , data ) {
2010-07-06 05:48:42 +00:00
$ui . total . html ( constructStatus ( "total" , data ) ) ;
data = [ ] ;
$ . each ( config . totals , function ( i , v ) {
data [ v . id ] = 0 ;
} ) ;
$ui . selected . html ( constructStatus ( "selected" , data ) ) ;
2010-07-05 16:14:12 +00:00
} ) ;
Ox . Event . bind ( "sort_list" , function ( event , data ) {
2010-07-07 12:36:42 +00:00
/ * s o m e m a g i c h a s a l r e a d y s e t u s e r . u i . s o r t
Ox . print ( ":" , user . ui . sort [ 0 ] )
if ( data . key != user . ui . sort [ 0 ] . key ) {
$ui . mainMenu . checkItem ( "sort_sortmovies_" + data . key ) ;
}
if ( data . operator != user . ui . sort [ 0 ] . operator ) {
$ui . mainMenu . checkItem ( "sort_ordermovies_" + data . operator === "" ? "ascending" : "descending" ) ;
}
user . ui . sort [ 0 ] = data ;
* /
$ui . mainMenu . checkItem ( "sort_sortmovies_" + data . key ) ;
$ui . mainMenu . checkItem ( "sort_ordermovies_" + ( data . operator === "" ? "ascending" : "descending" ) ) ;
2010-07-05 16:14:12 +00:00
} ) ;
Ox . Event . bind ( "select_list" , function ( event , data ) {
2010-07-08 15:02:22 +00:00
var $still , $timeline ;
ui . selectedMovies = data . ids ;
2010-07-16 07:12:46 +00:00
setTimeout ( function ( ) {
if (
data . ids . length == ui . selectedMovies . length &&
( data . ids . length == 0 || data . ids [ 0 ] == ui . selectedMovies [ 0 ] )
) {
if ( data . ids . length ) {
$ui . mainMenu . enableItem ( "copy" ) ;
$ui . mainMenu . enableItem ( "openmovie" ) ;
} else {
$ui . mainMenu . disableItem ( "copy" ) ;
$ui . mainMenu . disableItem ( "openmovie" ) ;
2010-07-10 22:35:06 +00:00
}
2010-07-16 07:12:46 +00:00
if ( data . ids . length == 1 ) {
$still = $ ( "<img>" )
. attr ( {
src : "http://0xdb.org/" + data . ids [ 0 ] + "/still.jpg"
} )
. one ( "load" , function ( ) {
if ( data . ids [ 0 ] != ui . selectedMovies [ 0 ] ) {
Ox . print ( "cancel after load..." )
return ;
}
var image = $still [ 0 ] ,
imageWidth = image . width ,
imageHeight = image . height ,
width = $ui . info . width ( ) ,
height = imageHeight * width / imageWidth ;
ui . infoRatio = width / height ;
$still . css ( {
position : "absolute" ,
left : 0 ,
top : 0 ,
//width: width + "px",
//height: height + "px",
width : "100%" ,
opacity : 0
} )
. appendTo ( $ui . info . $element )
. animate ( {
opacity : 1
} ) ;
$ui . infoStill . animate ( {
2010-07-10 22:35:06 +00:00
opacity : 0
2010-07-16 07:12:46 +00:00
} , 250 ) ;
$ui . info . animate ( {
height : ( height + 16 ) + "px"
} , 250 , function ( ) {
$ui . infoStill . remove ( ) ;
$ui . infoStill = $still ;
2010-07-10 22:35:06 +00:00
} ) ;
2010-07-08 15:02:22 +00:00
} ) ;
2010-07-16 07:12:46 +00:00
/ *
$timeline = $ ( "<img>" )
. attr ( {
src : "http://0xdb.org/" + data . ids [ 0 ] + "/timeline/timeline.png"
} )
. one ( "load" , function ( ) {
$timeline . css ( {
position : "absolute" ,
left : 0 ,
bottom : "16px" ,
opacity : 0
} )
. appendTo ( $ui . info . $element )
. animate ( {
opacity : 1
} ) ;
$ui . infoTimeline . animate ( {
2010-07-10 22:35:06 +00:00
opacity : 0
2010-07-16 07:12:46 +00:00
} , 250 , function ( ) {
$ui . infoTimeline . remove ( ) ;
$ui . infoTimeline = $timeline ;
2010-07-10 22:35:06 +00:00
} ) ;
2010-07-08 15:02:22 +00:00
} ) ;
2010-07-16 07:12:46 +00:00
* /
}
app . request ( "find" , {
query : {
conditions : $ . map ( data . ids , function ( id , i ) {
return {
key : "id" ,
value : id ,
operator : "="
}
} ) ,
operator : "|"
2010-07-06 05:48:42 +00:00
}
2010-07-16 07:12:46 +00:00
} , function ( result ) {
$ui . selected . html ( constructStatus ( "selected" , result . data ) ) ;
} ) ;
} else {
Ox . print ( "cancelled after timeout" ) ;
2010-07-06 05:48:42 +00:00
}
2010-07-16 07:12:46 +00:00
} , 100 ) ;
2010-07-05 16:14:12 +00:00
} ) ;
2010-07-07 07:40:38 +00:00
2010-07-07 12:36:42 +00:00
// Resize
2010-07-07 07:18:29 +00:00
Ox . Event . bind ( "resize_leftPanel" , function ( event , data ) {
2010-07-08 15:02:22 +00:00
$ui . leftPanel . resize ( "infoPanel" , data / ui . infoRatio + 16 ) ;
2010-07-07 07:18:29 +00:00
} ) ;
2010-07-07 07:40:38 +00:00
Ox . Event . bind ( "resize_rightPanel" , function ( event , data ) {
var widths = $ . map ( groups , function ( v , i ) {
return getGroupWidth ( i , data ) ;
} ) ;
Ox . print ( "widths" , widths ) ;
$ui . groupsOuterPanel . resize ( 0 , widths [ 0 ] . list ) . resize ( 2 , widths [ 4 ] . list ) ;
$ui . groupsInnerPanel . resize ( 0 , widths [ 1 ] . list ) . resize ( 2 , widths [ 3 ] . list ) ;
$ . each ( $ui . groups , function ( i , list ) {
list . resizeColumn ( "name" , widths [ i ] . column ) ;
} ) ;
} ) ;
2010-07-05 16:14:12 +00:00
Ox . Event . bind ( "click_show_query" , function ( event , data ) {
var query = constructQuery ( ) ,
html = "Conditions<br/><br/>" + $ . map ( query . conditions , function ( v ) {
return v . key + " " + v . operator + " " + v . value ;
} ) . join ( "<br/>" ) + "<br/><br/>Operator: " + query . operator ,
$dialog = new Ox . Dialog ( {
title : "Show Query" ,
buttons : [
{
value : "Close" ,
click : function ( ) {
$dialog . close ( ) ;
}
}
]
} )
. append ( html )
. open ( ) ;
} ) ;
// Functions
function constructList ( view ) {
var $list ;
2010-07-06 05:48:42 +00:00
if ( view == "list" ) {
2010-07-05 16:14:12 +00:00
$list = new Ox . TextList ( {
columns : $ . map ( config . sortKeys , function ( key , i ) {
2010-07-06 05:48:42 +00:00
return $ . extend ( {
2010-07-05 16:14:12 +00:00
visible : $ . inArray ( key . id , user . ui . columns ) > - 1 ,
unique : key . id == "id"
2010-07-06 05:48:42 +00:00
} , key ) ;
2010-07-05 16:14:12 +00:00
} ) ,
id : "list" ,
request : function ( options ) {
2010-07-14 15:25:20 +00:00
Ox . print ( "options, Query.toObject" , options , Query . toObject ( ) )
2010-07-05 16:14:12 +00:00
app . request ( "find" , $ . extend ( options , {
2010-07-14 15:25:20 +00:00
query : Query . toObject ( )
2010-07-05 16:14:12 +00:00
} ) , options . callback ) ;
} ,
sort : user . ui . sort
} ) ;
} else if ( view == "icons" ) {
$list = new Ox . IconList ( {
id : "list" ,
item : function ( data , sort , size ) {
return {
height : data . posterHeight ,
id : data [ "id" ] ,
info : data [ $ . inArray ( sort [ 0 ] . key , [ "title" , "director" ] ) > - 1 ? "year" : sort [ 0 ] . key ] ,
title : data . title + ( data . director ? " (" + data . director + ")" : "" ) ,
url : "http://0xdb.org/" + data . id + "/poster." + size + "." + "jpg" ,
width : data . posterWidth
} ;
} ,
keys : [ "director" , "id" , "posterHeight" , "posterWidth" , "posterURL" , "title" ] ,
request : function ( options ) {
app . request ( "find" , $ . extend ( options , {
2010-07-14 15:25:20 +00:00
query : Query . toObject ( )
2010-07-05 16:14:12 +00:00
} ) , options . callback ) ;
} ,
size : 128 ,
sort : [
{
key : "director" ,
2010-07-07 12:36:42 +00:00
operator : ""
2010-07-05 16:14:12 +00:00
}
] ,
unique : "id"
} ) ;
}
return $list ;
}
2010-07-06 05:48:42 +00:00
function constructStatus ( key , data ) {
return Ox . toTitleCase ( key ) + ": " + [
Ox . formatNumber ( data . items ) + " movie" + ( data . items != 1 ? "s" : "" ) ,
Ox . formatDuration ( data . runtime , "medium" ) ,
data . files + " file" + ( data . files != 1 ? "s" : "" ) ,
Ox . formatDuration ( data . duration , "short" ) ,
Ox . formatValue ( data . size , "B" ) ,
Ox . formatValue ( data . pixels , "px" )
] . join ( ", " ) ;
2010-07-05 16:14:12 +00:00
}
2010-07-07 07:18:29 +00:00
function getGroupWidth ( pos , panelWidth ) {
var width = { } ;
width . list = Math . floor ( panelWidth / 5 ) + ( panelWidth % 5 > pos ) ;
width . column = width . list - 40 - ( $ . browser . mozilla ? 16 : 12 ) ;
return width ;
}
2010-07-05 16:14:12 +00:00
2010-06-24 13:11:46 +00:00
//FIXME: how to properly overwrite functions without replacing them
var super _launch = app . launch ;
app . launch = function ( ) {
app . request ( 'hello' , function ( result ) {
app . user = result . data . user ;
if ( app . user . group != 'guest' ) {
app . menu . getItem ( 'status' ) . options ( 'title' , "User: " + app . user . username ) ;
app . menu . getItem ( 'login' ) . options ( 'title' , 'Logout' ) ;
}
} ) ;
super _launch ( ) ;
} ;
2010-07-05 16:14:12 +00:00
return ;
2010-06-24 13:11:46 +00:00
2010-07-05 16:17:38 +00:00
2010-06-24 13:11:46 +00:00
var loadingIcon = new Ox . LoadingIcon ( {
size : "medium"
} )
. css ( {
marginLeft : "4px"
} ) ;
2010-07-05 16:17:38 +00:00
2010-06-24 13:11:46 +00:00
app . menu = new Ox . MainMenu ( {
extras : [
new Ox . Input ( {
autocomplete : function ( option , value , callback ) {
var field = option . substring ( 6 ) . toLowerCase ( ) ;
2010-07-01 08:49:53 +00:00
if ( typeof ( callback ) == 'undefined' ) {
callback = value ;
value = null ;
}
Ox . debug ( 'app.menu.find.autocomplete: option: ' , option , 'value: ' , value , ', callback:' , callback ) ;
Ox . debug ( 'app.menu.find.autocomplete: field: ' , field ) ;
2010-06-24 13:11:46 +00:00
if ( field == 'all' ) {
callback ( [ ] ) ;
2010-07-01 08:49:53 +00:00
} else if ( value ) {
2010-06-24 13:11:46 +00:00
value = value . toLowerCase ( ) ;
//var order = $.inArray(field, ['year', 'date'])?'-':'';
app . request ( 'find' , {
query : {
conditions : [
{
key : field ,
value : value ,
operator : '~'
}
]
} ,
list : 'all' ,
2010-06-30 08:44:26 +00:00
sort : [ { key : field , operator : '' } ] ,
2010-06-24 13:11:46 +00:00
keys : [ field ] ,
range : [ 0 , 10 ]
} , function ( result ) {
var items = $ . map (
result . data . items ,
function ( item , i ) { return item . title ; }
) ;
callback ( items ) ;
} ) ;
}
} ,
clear : true ,
highlight : false ,
id : "find" ,
2010-07-05 12:36:12 +00:00
label : [
{ id : "all" , title : "Find: All" } ,
{ id : "title" , title : "Find: Title" } ,
{ id : "director" , title : "Find: Director" } ,
{ id : "country" , title : "Find: Country" } ,
{ id : "year" , title : "Find: Year" } ,
{ id : "language" , title : "Find: Language" } ,
{ id : "writer" , title : "Find: Writer" } ,
{ id : "producer" , title : "Find: Producer" } ,
{ id : "cinematographer" , title : "Find: Cinematographer" } ,
{ id : "editor" , title : "Find: Editor" } ,
{ id : "actor" , title : "Find: Actor" } ,
{ id : "character" , title : "Find: Character" } ,
{ id : "name" , title : "Find: Name" } ,
{ id : "genre" , title : "Find: Genre" } ,
{ id : "keyword" , title : "Find: Keyword" } ,
{ id : "summary" , title : "Find: Summary" } ,
{ id : "dialog" , title : "Find: Dialog" }
] ,
2010-06-24 13:11:46 +00:00
labelWidth : 96
} ) . width ( 320 ) ,
loadingIcon
] ,
menus : [
{
2010-06-24 13:18:33 +00:00
id : "pandoraMM" ,
2010-06-24 13:11:46 +00:00
title : site . name ,
items : [
{ id : "about" , title : "About " + site . name } ,
{ } ,
{ id : "faq" , title : "Frequently Asked Questions" } ,
{ id : "tos" , title : "Terms of Service" } ,
{ id : "sas" , title : "Security Advisory System" } ,
{ } ,
{ id : "contact" , title : "Contact" } ,
{ } ,
{ id : "technology" , title : "Technology" } ,
{ id : "source" , title : "Source Code" } ,
{ id : "report" , title : "Report a Bug..." } ,
]
} ,
{
id : "user" ,
id : "user" ,
title : "User" ,
items : [
{ id : "status" , title : "User: not logged in" , disabled : true } ,
{ } ,
{ id : "accunt" , title : "Account" , disabled : true } ,
{ id : "preferences" , title : "Preferences" , disabled : true } ,
{ } ,
{ id : "login" , title : "Login" } ,
]
} ,
{
id : "file" ,
title : "File" ,
items : [
{ id : "load" , keyboard : "control o" , title : "Open" } ,
{ id : "save" , keyboard : "control a" , title : "Save" } ,
{ id : "save_ad" , keyboard : "shift control s" , title : "Save As..." }
]
} ,
{
id : "edit" ,
title : "Edit" ,
items : [
{ id : "undo" , keyboard : "control z" , title : "Undo" } ,
{ id : "redo" , keyboard : "shift control z" , title : "Redo" } ,
{ } ,
{ id : "cut" , keyboard : "control x" , title : "Cut" } ,
{ id : "copy" , keyboard : "control c" , title : "Copy" } ,
{ id : "paste" , keyboard : "control v" , title : "Paste" } ,
{ id : "delete" , keyboard : "delete" , title : "Delete" } ,
{ } ,
{ id : "select_all" , keyboard : "control a" , title : "Select All" } ,
{ id : "select_none" , keyboard : "shift control a" , title : "Select None" } ,
{ id : "invert_selection" , keyboard : "alt control a" , title : "Invert Selection" } ,
]
} ,
{
id : "sort" ,
title : "Sort" ,
items : [
{ id : "sort_movies" , title : "Sort Movies by" , items : [
{ checked : true , group : "sort_movies" , id : "title" , title : "Title" } ,
{ checked : false , group : "sort_movies" , id : "director" , title : "Director" } ,
] } ,
{ id : "order_movies" , title : "Order Movies" , items : [
{ checked : false , group : "order_movies" , id : "ascending" , title : "Ascending" } ,
{ checked : true , group : "order_movies" , id : "descending" , title : "Descending" } ,
] }
]
} ,
{
id : "help" ,
title : "Help" ,
items : [
{ id : "help" , keyboard : "control h" , title : "Help" }
]
}
] ,
size : "large"
} ) ;
var pageDialog = function ( title , page ) {
2010-07-01 08:49:53 +00:00
Ox . debug ( title , page ) ;
2010-06-24 13:11:46 +00:00
var $dialog = new Ox . Dialog ( {
title : title ,
buttons : [
{
value : "Ok" ,
click : function ( ) { $dialog . close ( ) ; }
}
]
} )
. append ( page )
. open ( ) ;
} ;
//this should be: mainMenu.bind('click_about', function(event) {
2010-07-01 08:49:53 +00:00
app . menu . bindEvent ( 'click_about' , function ( ) {
2010-06-24 13:11:46 +00:00
pageDialog ( 'About ' + site . name , site . pages . about ) ;
} ) ;
2010-07-01 08:49:53 +00:00
app . menu . bindEvent ( 'click_faq' , function ( ) {
2010-06-24 13:11:46 +00:00
pageDialog ( app . menu . getItem ( 'faq' ) . options ( 'title' ) [ 0 ] ,
site . pages . faq ) ;
} ) ;
2010-07-01 08:49:53 +00:00
app . menu . bindEvent ( 'click_tos' , function ( ) {
2010-06-24 13:11:46 +00:00
pageDialog ( app . menu . getItem ( 'tos' ) . options ( 'title' ) [ 0 ] ,
site . pages . tos ) ;
} ) ;
2010-07-01 08:49:53 +00:00
app . menu . bindEvent ( 'click_sas' , function ( ) {
2010-06-24 13:11:46 +00:00
pageDialog ( app . menu . getItem ( 'sas' ) . options ( 'title' ) [ 0 ] ,
site . pages . sas ) ;
} ) ;
OxForm = function ( options , self ) {
var self = self || { } ,
that = new Ox . Element ( { } , self )
. defaults ( {
elements : [ ] ,
} )
. options ( options || { } )
. addClass ( "OxForm" ) ,
length = self . options . elements . length ;
$ . each ( self . options . elements , function ( i , v ) {
that . append ( Ox . Container ( ) . css ( { 'margin' : '5px' } ) . append ( v ) ) ;
} ) ;
that . values = function ( ) {
var values = { } ;
$ . each ( self . options . elements , function ( i , v ) {
values [ v . $input . attr ( 'name' ) ] = v . $input . val ( ) ;
} ) ;
return values ;
}
return that ;
} ;
2010-07-01 08:49:53 +00:00
app . menu . bindEvent ( 'click_contact' , function ( ) {
2010-06-24 13:11:46 +00:00
var labelWidth = 64 ;
var inputWidth = 380 ;
var u = new Ox . Input ( {
label : "Your Email" ,
labelWidth : labelWidth ,
name : 'email' ,
size : 'medium'
} ) . width ( inputWidth ) . addClass ( "margin" ) ;
if ( app . user && app . user . preferences . email ) {
u . val ( app . user . preferences . email ) ;
}
var form = new OxForm ( {
elements : [
u ,
new Ox . Input ( {
label : "Subject" ,
labelWidth : labelWidth ,
name : "subject" ,
size : "medium"
} ) . width ( inputWidth ) . addClass ( "margin" ) ,
new Ox . Input ( {
label : "Message" ,
labelWidth : labelWidth ,
type : "textarea" ,
size : "medium" ,
name : "message"
} ) . width ( 380 ) . height ( 176 ) . addClass ( "margin" )
]
} ) ;
var $dialog = new Ox . Dialog ( {
title : "Contact" ,
width : 424 ,
height : 320 ,
buttons : [
{
value : "Cancel" ,
click : function ( ) { $dialog . close ( ) ; }
} ,
{
value : "Contact" ,
click : function ( ) {
app . request ( 'contact' , form . values ( ) ,
function ( result ) {
if ( result . status . code == 200 ) {
$dialog . close ( ) ;
} else {
$dialog . append ( result . status . text ) ;
}
} ) ;
}
}
]
} )
. append ( form )
. open ( ) ;
} ) ;
2010-07-01 08:49:53 +00:00
app . menu . bindEvent ( 'click_technology' , function ( ) {
2010-06-24 13:11:46 +00:00
pageDialog ( app . menu . getItem ( 'technology' ) . options ( 'title' ) [ 0 ] ,
site . pages . technology ) ;
} ) ;
2010-07-01 08:49:53 +00:00
app . menu . bindEvent ( 'click_source' , function ( ) {
2010-06-24 13:11:46 +00:00
pageDialog ( app . menu . getItem ( 'source' ) . options ( 'title' ) [ 0 ] ,
site . pages . source ) ;
} ) ;
2010-07-01 08:49:53 +00:00
app . menu . bindEvent ( 'click_report' , function ( ) {
2010-06-24 13:11:46 +00:00
pageDialog ( app . menu . getItem ( 'report' ) . options ( 'title' ) [ 0 ] ,
site . pages . report ) ;
} ) ;
app . logout = function ( ) {
this . request ( 'logout' ) ;
this . user = { } ;
this . menu . getItem ( 'logout' ) . toggle ( ) ;
this . menu . getItem ( 'status' ) . options ( 'title' , "User: not logged in" ) ;
} ;
2010-07-01 08:49:53 +00:00
app . menu . bindEvent ( 'click_logout' , function ( event , data ) {
2010-06-24 13:11:46 +00:00
app . logout ( ) ;
} ) ;
2010-07-05 12:35:51 +00:00
2010-07-01 08:49:53 +00:00
app . menu . bindEvent ( 'click_login' , function ( element ) {
2010-06-24 13:11:46 +00:00
var labelWidth = 64 ;
var inputWidth = labelWidth + 200 ;
var loginForm = new OxForm ( {
elements : [
new Ox . Input ( {
label : "Username" ,
labelWidth : labelWidth ,
name : 'username' ,
size : 'medium'
} ) . addClass ( "margin" ) . width ( inputWidth ) ,
new Ox . Input ( {
label : 'Password' ,
labelWidth : labelWidth ,
name : 'password' ,
type : 'password' ,
size : 'medium'
} ) . addClass ( "margin" ) . width ( inputWidth )
]
} ) . css ( {
'padding-top' : '48px' ,
} ) ;
var submit = function ( ) {
app . request ( 'login' , loginForm . values ( ) , function ( result ) {
if ( result . status . code == 200 ) {
$dialog . close ( ) ;
app . user = result . data . user ;
app . menu . getItem ( 'status' ) . options ( title , "User: " + app . user . username ) ;
app . menu . getItem ( 'login' ) . toggle ( ) ;
} else {
$dialog . append ( 'Login failed ' + result . status . text ) ;
}
} ) ;
}
var d = new Ox . Container ( ) ;
var registerInfo = new Ox . Panel ( ) ;
2010-07-05 12:28:43 +00:00
registerInfo . append ( Ox . Element ( ) . css ( { 'margin-left' : '4px' } ) . append ( '<br>Forgot your password? <a href="">Recover Password</a><br>Dont have an account? <a href="">Register Now</a>' ) ) ;
2010-06-24 13:11:46 +00:00
var panel = Ox . SplitPanel ( {
elements : [
{
element : loginForm ,
} ,
{
element : registerInfo ,
size : 80
}
] ,
orientation : "vertical"
} ) . appendTo ( d ) ;
var $dialog = new Ox . Dialog ( {
title : "Login" ,
width : inputWidth + 24 ,
height : 184 ,
buttons : [
[ ] , [
{
value : "Cancel" ,
click : function ( ) { $dialog . close ( ) ; }
} ,
{
value : "Login" ,
click : submit
}
]
]
} )
. append ( d )
. open ( ) ;
} ) ;
var bottomPanel = Ox . Toolbar ( { size : "small" } )
. css ( {
zIndex : 2 ,
MozBoxShadow : "0 0 4px rgb(0, 0, 0)" ,
WebkitBoxShadow : "0 0 4px rgb(0, 0, 0)"
} )
. append (
$ ( "<div/>" )
. addClass ( "bottom" )
. html ( site . url + " - a rather unique kind of movie database." )
) ;
var mainSplitPanel = Ox . SplitPanel ( {
elements : [
{
element : app . menu ,
size : 24
} ,
{
element : middleSplitPanel
} ,
{
element : bottomPanel ,
size : 24
}
] ,
orientation : "vertical"
} ) . appendTo ( $body ) ;
var listPanel = new Ox . CollapsePanel ( {
title : "Lists"
} ) . appendTo ( sidePanel ) ;
listPanel . $content . html ( "Nouvelle Vague<br/>Hollywood 40's<br/>Pirate Cinema Berlin" )
var historyPanel = new Ox . CollapsePanel ( {
title : "Search History"
} ) . appendTo ( sidePanel ) ;
historyPanel . $content . html ( "Paris<br/>Matirx<br/>Godard" )
/ *
var tabbar = new Ox . Tabbar ( {
values : [ "Info" , "Scenes" , "Timeline" , "Map" , "Admin" ] ,
selected : 0 ,
} ) . appendTo ( mainPanel )
* /
var content = new Ox . Container ( )
. appendTo ( mainPanel ) ;
/ *
tabbar . bind ( 'OxButtonToggle' , function ( event , data ) {
2010-07-01 08:49:53 +00:00
Ox . debug ( 'tabbar selected' ) ;
Ox . debug ( data . value ) ;
2010-06-24 13:11:46 +00:00
if ( data . value == 'Info' ) {
content . html ( 'this is for testing purposes only, lets get down to it...' ) ;
} else if ( data . value == 'Scenes' ) {
content . html ( 'what a wonderfull scene' ) ;
} else if ( data . value == 'Timeline' ) {
content . html ( 'here we will see a timeline' ) ;
} else if ( data . value == 'Map' ) {
content . html ( 'Here be a map of dragons' ) ;
} else if ( data . value == 'Admin' ) {
content . html ( 'Here be admin' ) ;
}
} ) ;
* /
2010-07-01 08:49:53 +00:00
app . results = new Ox . TextList ( {
columns : [ {
2010-06-28 07:50:00 +00:00
align : "left" ,
id : "title" ,
operator : "+" ,
title : "Title" ,
2010-06-30 08:44:26 +00:00
visible : true ,
2010-06-28 07:50:00 +00:00
width : 160
} ,
{
align : "left" ,
id : "director" ,
operator : "+" ,
title : "Director" ,
2010-06-30 08:44:26 +00:00
visible : true ,
2010-06-28 07:50:00 +00:00
width : 160
} ,
{
align : "right" ,
id : "year" ,
operator : "-" ,
title : "Year" ,
2010-06-30 08:44:26 +00:00
visible : true ,
2010-06-28 07:50:00 +00:00
width : 80
2010-06-30 08:44:26 +00:00
}
2010-07-01 08:49:53 +00:00
] ,
request : function ( options ) {
app . request ( "find" , $ . extend ( options , {
query : {
conditions : [ ] ,
2010-07-14 15:25:20 +00:00
operator : "," // fixme: should be &
2010-07-01 08:49:53 +00:00
}
} ) , options . callback ) ;
} ,
id : "results" ,
sort : [ {
key : "year" ,
operator : "-"
} ]
} ) . appendTo ( content ) ;
2010-07-05 12:35:51 +00:00
app . menu . bindEvent ( 'submit_find' , function ( event , data ) {
2010-07-01 08:49:53 +00:00
app . results . options ( {
2010-06-28 07:50:00 +00:00
request : function ( options ) {
app . request ( "find" , $ . extend ( options , {
2010-07-01 08:49:53 +00:00
query : {
key : data . option . substr ( 6 ) . toLowerCase ( ) ,
value : data . value ,
operator : "~"
}
2010-06-28 07:50:00 +00:00
} ) , options . callback ) ;
} ,
} ) ;
} ) ;
2010-06-24 13:11:46 +00:00
app . launch ( ) ;
} ) ;
2010-07-01 08:49:53 +00:00