/*
* jason - Javascript based skin for xxv
* Copyright(c) 2009-2012, anbr
*
* http://projects.vdr-developer.org/projects/xxv
*
*/
/******************************************************************************/
Ext.xxv.TeleTextStore = function(name, channel) {
// create the data store
return new Ext.data.Store({
title: name
,baseParams:{cmd:'vt','channel':channel}
,autoLoad:{params:{start:0, limit:99}}
,reader: new Ext.xxv.jsonReader({
fields: [
{name: 'id', type: 'string'}
,{name: 'page', type: 'string'}
,{name: 'subpage', type: 'string'}
,{name: 'channel', type: 'string'}
,{name: 'prev', type: 'string'}
,{name: 'next', type: 'string'}
,{name: 'mtime', type: 'string'}
,{name: 'content', type: 'string'}
]
})
,proxy : new Ext.data.HttpProxy({
url: XXV.help.baseURL()
,method: 'POST'
})
});
};
Ext.xxv.TeleTextView = function(viewer, store, config) {
this.viewer = viewer;
Ext.apply(this, config);
this.store = store;
var tpl = new Ext.XTemplate(
''
,''
,'
'
,'{content}'
,'
'
,'
'
,''
,'
'
);
this.filter = new Ext.ux.grid.Search({
position:'owner'
,shortcutKey:null
,paramNames: {
fields:'cmd'
,all:'vt'
,cmd:'vs'
,query:'data'
}
});
Ext.xxv.TeleTextView.superclass.constructor.call(this, {
region: 'center'
,store: store
,tpl: tpl
,cls: 'x-panel-body' // workaround - add missing border
,style: 'overflow:auto'
,singleSelect: true
,overClass:'x-view-over'
,itemSelector:'div.thumb-wrap'
,loadMask:null
,listeners: {
'beforeselect' : {fn:function(view){ return view.store.getRange().length > 0; } }
,'selectionchange': {fn:this.doClick, scope:this, buffer:100}
}
,plugins: [
this.filter
]
}
);
this.store.on({
'beforeload' : this.onBeforeLoad
,'load' : this.onLoad
,'loadexception' : this.onLoadException
,scope:this
});
};
Ext.extend(Ext.xxv.TeleTextView, Ext.DataView, {
szTitle : "Teletext"
,szToolTip : "Display teletext pages"
,szLoadException : "Couldn't get teletext pages!\r\n{0}"
,onLoadException : function( scope, o, arg, e) {
this.viewer.loadMask.hide();
new Ext.xxv.MessageBox().msgFailure(this.szLoadException, e.message);
var tb = this.ownerCt.getTopToolbar();
tb.get('teletext-refresh').enable();
}
,onBeforeLoad : function( scope, params ) {
if(this.filter.getValue())
this.viewer.loadMask.show();
if(this.DetailsTransaction)
Ext.Ajax.abort(this.DetailsTransaction);
if(this.el && this.el.dom) {
var elem = this.el.dom.getElementsByTagName('a');
for (var j = 0; j < elem.length; j++) {
var node = Ext.fly(elem[j]);
node.removeAllListeners();
}
}
var tb = this.ownerCt.getTopToolbar();
tb.get('teletext-refresh').disable();
}
,onLoad : function( store, records, opt ) {
// replace all anchor to pages with callback
if(this.el && this.el.dom) {
var elem = this.el.dom.getElementsByTagName('a');
for (var j = 0; j < elem.length; j++) {
var url = Ext.urlDecode(elem[j].href);
if(url.page) {
elem[j].href = '#';
elem[j].id = url.page;
var node = Ext.fly(elem[j]);
node.on("click", function(e, ele){
e.stopEvent();
this.loadpage(ele.id);
},this);
}
}
}
if(store.title) {
this.ownerCt.SetPanelTitle(this.szTitle + " - " + store.title);
} else {
this.ownerCt.SetPanelTitle(this.szTitle);
}
var data = records[0].data;
var tb = this.ownerCt.getTopToolbar();
tb.get('teletext-number').setValue(data.page);
tb.get('teletext-first').setDisabled(data.prev == 0);
tb.get('teletext-prev').setDisabled(data.prev == 0);
tb.get('teletext-next').setDisabled(data.next == 0);
//tb.get('teletext-last').setDisabled(true);
tb.get('teletext-refresh').enable();
this.viewer.loadMask.hide();
}
,doClick : function(){
var selNode = this.getSelectedNodes();
if(selNode && selNode.length > 0){
var page = this.store.getById(selNode[0].id);
if(page) {
var tb = this.ownerCt.getTopToolbar();
tb.get('teletext-number').setValue(page.data.page);
}
}
}
,reload : function(name, channel) {
this.store.title = name;
this.store.baseParams.channel = channel;
this.moveFirst();
}
,loadpage : function(page) {
var f = this.filter.field.getValue();
if(f && f != '') {
this.filter.field.setValue('');
this.store.baseParams.cmd = 'vt';
}
if(page && page != 0)
this.store.load({params:{'page':page, start:0, limit:99}});
}
,moveFirst : function() {
var f = this.filter.field.getValue();
if(f && f != '') {
this.filter.field.setValue('');
this.store.baseParams.cmd = 'vt';
}
this.store.load({params:{start:0, limit:99}});
}
,movePrev : function() {
var node = this.getNode(0);
if(node) {
var record = this.store.getById(node.id);
if(record) {
this.loadpage(record.data.prev);
}
}
}
,moveNext : function() {
var node = this.getNode(0);
if(node) {
var record = this.store.getById(node.id);
if(record) {
this.loadpage(record.data.next);
}
}
}
,moveLast : function() {
}
,retryPage : function() {
var node = this.getNode(0);
if(node) {
var record = this.store.getById(node.id);
if(record) {
this.store.load({params:{'page':record.data.page, start:0, limit:99}});
return;
}
}
moveFirst();
}
,readPage : function(record){
var tb = this.ownerCt.getTopToolbar();
var input = tb.get('teletext-number');
var v = input.getValue(), pageNum;
if (!v || isNaN(pageNum = parseInt(v, 10))) {
input.setValue(record.data.page);
return false;
}
return pageNum;
}
,onPagingBlur : function(e){
var node = this.getNode(0);
if(node) {
var record = this.store.getById(node.id);
if(record) {
var tb = this.ownerCt.getTopToolbar();
tb.get('teletext-number').setValue(record.data.page);
}
}
}
,onPagingKeyDown : function(field, e){
var node = this.getNode(0);
if(!node) return;
var record = this.store.getById(node.id);
if(!record) return;
var k = e.getKey(), pageNum;
if (k == e.RETURN) {
e.stopEvent();
pageNum = this.readPage(record);
if(pageNum !== false){
this.loadpage(pageNum);
}
}else if (k == e.HOME) {
e.stopEvent();
this.moveFirst();
}else if (k == e.END) {
e.stopEvent();
this.moveLast();
}else if (k == e.UP || k == e.PAGEUP || k == e.DOWN || k == e.PAGEDOWN){
e.stopEvent();
if(k == e.DOWN || k == e.PAGEDOWN){
this.moveNext();
} else {
this.movePrev();
}
}
}
});
function createTeleTextView(viewer,id,name, channel) {
viewer.pageTeleText = new Ext.xxv.TeleTextView(
viewer,
new Ext.xxv.TeleTextStore(name, channel),
{ id: 'teletext-view-page' });
var tab = new Ext.xxv.Panel({
id: id
,iconCls:"teletext-icon"
,closable:true
,border:false
,layout:'border'
,stateful:true
,items:[ viewer.pageTeleText ]
,tbar:new Ext.Toolbar({
items: [
{
id: 'teletext-first' ,iconCls: 'x-tbar-page-first'
,tooltip: Ext.PagingToolbar.prototype.firstText
,scope: viewer.pageTeleText ,disabled:true
,handler: viewer.pageTeleText.moveFirst
},{
id: 'teletext-prev' ,iconCls: 'x-tbar-page-prev'
,tooltip: Ext.PagingToolbar.prototype.prevText
,scope: viewer.pageTeleText ,disabled:true
,handler: viewer.pageTeleText.movePrev
},'-',{
xtype: 'tbtext', text: Ext.PagingToolbar.prototype.beforePageText
},{
id: 'teletext-number'
,cls: "x-tbar-page-number"
,xtype: 'numberfield'
,allowDecimals: false
,allowNegative: false
,emptyText: Ext.PagingToolbar.prototype.emptyMsg
,enableKeyEvents: true
,selectOnFocus: true
,listeners: {
scope: viewer.pageTeleText,
keydown: viewer.pageTeleText.onPagingKeyDown,
blur: viewer.pageTeleText.onPagingBlur
}
},'-',{
id: 'teletext-next'
,iconCls: 'x-tbar-page-next'
,tooltip: Ext.PagingToolbar.prototype.nextText
,scope: viewer.pageTeleText ,disabled:true
,handler: viewer.pageTeleText.moveNext
},{
id: 'teletext-last'
,iconCls: 'x-tbar-page-last'
,tooltip: Ext.PagingToolbar.prototype.lastText
,scope: viewer.pageTeleText ,disabled:true
,handler: viewer.pageTeleText.moveLast
},'-',{
id: 'teletext-refresh'
,iconCls: 'x-tbar-loading'
,tooltip: Ext.PagingToolbar.prototype.refreshText
,scope: viewer.pageTeleText ,disabled:false
,handler: viewer.pageTeleText.retryPage
},'->'
]
})
});
viewer.add(tab);
return tab;
}