|
|
|
var CouchPotato = new Class({
|
|
|
|
|
|
|
|
Implements: [Options],
|
|
|
|
|
|
|
|
defaults: {
|
|
|
|
page: 'movie',
|
|
|
|
action: 'index',
|
|
|
|
params: {}
|
|
|
|
},
|
|
|
|
|
|
|
|
pages: [],
|
|
|
|
|
|
|
|
tabs: [
|
|
|
|
{'href': '/movie/', 'title':'Gimmy gimmy gimmy!', 'label':'Wanted'},
|
|
|
|
{'href': '/manage/', 'title':'Do stuff to your existing movies!', 'label':'Manage'},
|
|
|
|
{'href': '/feed/', 'title':'Which wanted movies are released soon?', 'label':'Soon'},
|
|
|
|
{'href': '/log/', 'title':'Show recent logs.', 'class':'logLink', 'label':'Logs'},
|
|
|
|
{'href': '/config/', 'title':'Change settings.', 'id':'showConfig'}
|
|
|
|
],
|
|
|
|
|
|
|
|
initialize: function(options) {
|
|
|
|
var self = this;
|
|
|
|
self.setOptions(options);
|
|
|
|
|
|
|
|
self.c = $(document.body)
|
|
|
|
|
|
|
|
self.route = new Route(self.defaults);
|
|
|
|
self.api = new Api(self.options.api_url)
|
|
|
|
|
|
|
|
History.addEvent('change', self.createPage.bind(self));
|
|
|
|
History.handleInitialState();
|
|
|
|
|
|
|
|
self.createLayout()
|
|
|
|
self.createNavigation()
|
|
|
|
|
|
|
|
self.c.addEvent('click:relay(a)', self.openPage.bind(self))
|
|
|
|
},
|
|
|
|
|
|
|
|
openPage: function(e){
|
|
|
|
var self = this;
|
|
|
|
(e).stop()
|
|
|
|
|
|
|
|
var url = e.target.get('href')
|
|
|
|
History.push(url)
|
|
|
|
},
|
|
|
|
|
|
|
|
createNavigation: function(){
|
|
|
|
var self = this
|
|
|
|
|
|
|
|
self.tabs.each(function(tab){
|
|
|
|
new Element('li').adopt(
|
|
|
|
new Element('a', {
|
|
|
|
'href': tab.href,
|
|
|
|
'title': tab.title,
|
|
|
|
'text': tab.label
|
|
|
|
})
|
|
|
|
).inject(self.navigation)
|
|
|
|
})
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
createLayout: function(){
|
|
|
|
var self = this;
|
|
|
|
|
|
|
|
self.c.adopt(
|
|
|
|
self.header = new Element('div.header').adopt(
|
|
|
|
self.navigation = new Element('ul.navigation'),
|
|
|
|
self.add_form = new Element('div.add_form')
|
|
|
|
),
|
|
|
|
self.content = new Element('div.content'),
|
|
|
|
self.footer = new Element('div.footer')
|
|
|
|
)
|
|
|
|
},
|
|
|
|
|
|
|
|
createPage: function(url) {
|
|
|
|
var self = this;
|
|
|
|
|
|
|
|
self.route.parse(url);
|
|
|
|
var page_name = self.route.getPage().capitalize();
|
|
|
|
var action = self.route.getAction();
|
|
|
|
var params = self.route.getParams();
|
|
|
|
|
|
|
|
var pg = self.pages[page_name]
|
|
|
|
if(!pg){
|
|
|
|
pg = new Page[page_name]();
|
|
|
|
pg.setParent(self)
|
|
|
|
self.pages[page_name] = pg;
|
|
|
|
}
|
|
|
|
pg.open(action, params)
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
getApi: function(){
|
|
|
|
return this.api
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
var PageBase = new Class({
|
|
|
|
|
|
|
|
Implements: [Options],
|
|
|
|
|
|
|
|
initialize: function(options) {
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
open: function(action, params){
|
|
|
|
var self = this;
|
|
|
|
p('Opening: ' +self.getName() + ', ' + action + ', ' + Object.toQueryString(params));
|
|
|
|
|
|
|
|
try {
|
|
|
|
self[action+'Action'](params)
|
|
|
|
}
|
|
|
|
catch (e){
|
|
|
|
self.errorAction(e)
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
errorAction: function(e){
|
|
|
|
p('Error, action not found', e);
|
|
|
|
},
|
|
|
|
|
|
|
|
getName: function(){
|
|
|
|
return this.name
|
|
|
|
},
|
|
|
|
|
|
|
|
setParent: function(parent){
|
|
|
|
this.parent = parent
|
|
|
|
},
|
|
|
|
|
|
|
|
getParent: function(){
|
|
|
|
return this.parent
|
|
|
|
},
|
|
|
|
|
|
|
|
api: function(){
|
|
|
|
return this.parent.getApi()
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
var Api = new Class({
|
|
|
|
|
|
|
|
url: '',
|
|
|
|
|
|
|
|
initialize: function(url){
|
|
|
|
var self = this
|
|
|
|
|
|
|
|
self.url = url
|
|
|
|
self.req = new Request.JSON({
|
|
|
|
'method': 'get'
|
|
|
|
})
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
request: function(type, params, data){
|
|
|
|
var self = this;
|
|
|
|
|
|
|
|
self.req.setOptions({
|
|
|
|
'url': self.createUrl(type, params),
|
|
|
|
'data': data
|
|
|
|
})
|
|
|
|
self.req.send()
|
|
|
|
},
|
|
|
|
|
|
|
|
createUrl: function(action, params){
|
|
|
|
return this.url + (action || 'default') + '/?' + Object.toQueryString(params)
|
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
var Route = new Class({
|
|
|
|
|
|
|
|
defaults: {},
|
|
|
|
page: '',
|
|
|
|
action: 'index',
|
|
|
|
params: {},
|
|
|
|
|
|
|
|
initialize: function(defaults){
|
|
|
|
var self = this
|
|
|
|
self.defaults = defaults
|
|
|
|
},
|
|
|
|
|
|
|
|
parse: function(url_string){
|
|
|
|
var self = this;
|
|
|
|
|
|
|
|
var current = History.getPath().replace(/^\/+|\/+$/g, '')
|
|
|
|
var url = current.split('/')
|
|
|
|
|
|
|
|
self.page = (url.length > 0) ? url.shift() : self.defaults.page
|
|
|
|
self.action = (url.length > 0) ? url.shift() : self.defaults.action
|
|
|
|
|
|
|
|
self.params = self.defaults.params
|
|
|
|
if(url.length > 1){
|
|
|
|
var key
|
|
|
|
url.each(function(el, nr){
|
|
|
|
if(nr%2 == 0)
|
|
|
|
key = el
|
|
|
|
else if(key) {
|
|
|
|
self.params[key] = el
|
|
|
|
key = null
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
return self
|
|
|
|
},
|
|
|
|
|
|
|
|
getPage: function(){
|
|
|
|
return this.page
|
|
|
|
},
|
|
|
|
|
|
|
|
getAction: function(){
|
|
|
|
return this.action
|
|
|
|
},
|
|
|
|
|
|
|
|
getParams: function(){
|
|
|
|
return this.params
|
|
|
|
},
|
|
|
|
|
|
|
|
get: function(param){
|
|
|
|
return this.params[param]
|
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
var p = function(){
|
|
|
|
if(typeof(console) !== 'undefined' && console != null)
|
|
|
|
console.log(arguments)
|
|
|
|
}
|