/**
* @class FeedViewer.FeedWindow
* @extends Ext.window.Window
*
* Shows a dialog for creating and validating a new feed.
*
* @constructor
* Create a new Feed Window
* @param {Object} config The config object
*/
Ext.define('FeedViewer.FeedWindow', {
extend: 'Ext.window.Window',
alias: 'widget.feedwindow',
plain: true,
resizable: false,
modal: true,
closeAction: 'hide',
defaultFocus: '#feed',
defaultFeeds: [
['http://rss.cnn.com/rss/edition.rss', 'CNN Top Stories'],
['http://sports.espn.go.com/espn/rss/news', 'ESPN Top News'],
['http://news.google.com/news?ned=us&topic=t&output=rss', 'Sci/Tech - Google News'],
['http://rss.news.yahoo.com/rss/software', 'Yahoo Software News']
],
initComponent: function(){
var me = this;
me.addEvents(
/**
* @event feedvalid
* @param {FeedViewer.FeedWindow} this
* @param {String} title
* @param {String} url
* @param {String} description
*/
'feedvalid'
);
me.form = Ext.create('widget.form', {
bodyPadding: '12 10 10',
border: false,
unstyled: true,
items: [{
anchor: '100%',
itemId: 'feed',
fieldLabel: 'Enter the URL of the feed to add',
labelAlign: 'top',
msgTarget: 'under',
xtype: 'combo',
store: this.defaultFeeds,
getInnerTpl: function(){
return '
{field1}
{field2}
';
}
}]
});
Ext.apply(me, {
width: 500,
title: 'Add Feed',
iconCls: 'feed',
layout: 'fit',
items: me.form,
buttons: [{
xtype: 'button',
text: 'Add Feed',
scope: me,
handler: me.onAddClick
}, {
xtype: 'button',
text: 'Cancel',
scope: me,
handler: me.hide
}]
});
me.callParent(arguments);
},
/**
* React to the add button being clicked.
* @private
*/
onAddClick: function(addBtn) {
addBtn.disable();
var url = this.form.getComponent('feed').getValue();
this.form.setLoading({
msg: 'Validating feed...'
});
Ext.Ajax.request({
url: 'feed-proxy.php',
params: {
feed: url
},
success: this.validateFeed,
failure: this.markInvalid,
scope: this
});
},
/**
* React to the feed validation passing
* @private
* @param {Object} response The response object
*/
validateFeed: function(response) {
this.form.setLoading(false);
this.down('button[text=Add Feed]').enable();
var dq = Ext.DomQuery,
url = this.form.getComponent('feed').getValue(),
xml,
channel,
title;
try {
xml = response.responseXML;
channel = xml.getElementsByTagName('channel')[0];
if (channel) {
title = dq.selectValue('title', channel, url);
this.fireEvent('feedvalid', this, title, url);
this.hide();
return;
}
} catch(e) {
}
this.markInvalid();
},
/**
* React to the feed validation failing
* @private
*/
markInvalid: function(){
this.down('button[text=Add Feed]').enable();
this.form.setLoading(false);
this.form.getComponent('feed').markInvalid('The URL specified is not a valid RSS2 feed.');
}
});