/*
Section: urspin.module.js
*/


/*
	Class: URSPIN.ModuleFactory
*/
URSPIN.ModuleFactory = {
	createModule: function (o) {
		var m = null;
		switch (o.type) {
		case 'feed':
			m = new URSPIN.FeedModule(o);
			break;
		default:
			m = new URSPIN.Module(o);
			break;
		}
		return m;
	}
};



/*
	Class: URSPIN.Module
*/
URSPIN.Module = new Class({
	
	options: {
		'moduleID': null,
		'userModuleID':null,
		'title':null,
		'type':'feed',
		'draggable':true,
		'contentType':'text-plain',
		'content':null,
		'contentWidth':'100',
		'contentWidthUnit':'%',
		'contentHeight':null,
		'contentHeightUnit':'px',
		'column':null,
		'row':null,
		'minimized':false,
		'settings':null
    },

	isSettingsOpened:false,
	settingsEffect:null,
	settingsEffectOptions: {'duration':150,'transition':Fx.Transitions.Expo.easeInOut},
	settingsEffectOpenedParams:null,
	settingsEffectClosedParams:{'height':0},
	settingsEffectOpenedParams:null,
	
	minimizeEffect:null,
	minimizeEffectOptions: {'wait':false,'duration':200,'transition':Fx.Transitions.linear},
	minimizeEffectCloseParams:{'height':0},
	minimizeEffectOpenParams:null,	

	titleEl: null,
	settingsEl: null,
	contentEl: null,
	
	
	isReadyToLoadContent: false,
	isContentFirstLoad: true,
	
	typeColor: {
		'feed':'orange',
		'podcast':'purple',
		'application':'blue',
		'photo':'green',
		'video':'red',
		'music':'light-blue'
	},
	
		
	/*
		Method: initialize
		
		Constructor
		
		<div class="mod mod-clr-light-blue mod-type-default">

			<div class="mod-title-bar">
				<div class="mod-title-bar-c">
					<div class="mod-icn">
						<img src="a/images/add_stuff/dir/icon_sm/music.png"/>
					</div>
					<div class="mod-title"/>
					<div class="mod-oper">
						<a class="remove" href="javascript:void(0);">
							<div/>
						</a>
						<a class="mini" href="javascript:void(0);">
							<div/>
						</a>
						<a class="set" href="javascript:void(0);">
							<div/>
						</a>
					</div>
					<div class="cb"/>
				</div>
				<div class="mod-title-bar-l"/>
				<div class="mod-title-bar-r"/>
			</div>

			<div class="mod-con-w">
				<div class="mod-set"/>

				<div class="mod-con"/>

				<div class="mod-ftr">
					<div class="mod-ftr-c"/>
					<div class="mod-ftr-l"/>
					<div class="mod-ftr-r"/>
				</div>
			</div>
		</div>
	*/
	initialize: function (options) {
		this.setOptions(options);
		var mod = new Element('div',{'class':'mod'});
		mod.addClass(['mod-type-', this.options.type].join(''));
		// mod.addClass('mod-clr-' + this.typeColor[this.options.type]);

		/*
			Title bar
		*/
		this.titleBar = new Element('div',{'class':'mod-title-bar'});
		this.titleBar.addEvent('mousedown', this.titleBarMouseDown.bindWithEvent(mod));
		mod.adopt(this.titleBar);

		var titleBarC = new Element('div',{'class':'mod-title-bar-c'});
		this.titleBar.adopt(titleBarC);

		// titleBarC.adopt(new Element('div',{'class':'mod-icn'})
		// 	.adopt(new Element('img',{
		// 		'src':'a/images/add_stuff/dir/icon_sm/' + this.options.type + '.png'
		// 	}))
		// );

		titleBarC.adopt(new Element('div',{'class':'mod-icn'}));



		// var titleExtra
		// 	= ' (mi:' + this.options['moduleID']
		// 	+ ',umi:' + this.options['userModuleID']
		// 	+ ',ct:' + this.options['contentType'] + ')';
		titleBarC.adopt(new Element('div',{'class':'mod-title'}).setText(this.options.title));
		
		var oper = new Element('div',{'class':'mod-oper'});
		titleBarC.adopt(oper);

		/*
			Title bar remove button
		*/
		this.titleBarRemove = new Element('span',{'class':'remove','href':'javascript:void(0);'});
		this.titleBarRemove.adopt(new Element('div'));
		this.titleBarRemove.addEvents({
			'mousedown':URSPIN.eatEvent,
			'click':this.removeFromContentArea.bindWithEvent(mod)
		});
		oper.adopt(this.titleBarRemove);

		/*
			Title bar minimize button
		*/
		this.titleBarMini = new Element('span',{'class':'mini','href':'javascript:void(0);'});
		this.titleBarMini.adopt(new Element('div'));
		this.titleBarMini.addEvents({
			'mousedown':URSPIN.eatEvent,
			'click':this.toggleMinimize.bind(mod)
		});
		oper.adopt(this.titleBarMini);

		/*
			Title bar settings button
		*/
		this.titleBarSet = new Element('span',{'class':'set','href':'javascript:void(0);'});
		this.titleBarSet.adopt(new Element('div'));
		this.titleBarSet.addEvents({
			'mousedown':URSPIN.eatEvent,
			'click':this.toggleSettings.bind(mod)
		});
		oper.adopt(this.titleBarSet);

		titleBarC.adopt(new Element('div',{'class':'cb'}));

		this.titleBar.adopt(new Element('div',{'class':'mod-title-bar-l'}));
		this.titleBar.adopt(new Element('div',{'class':'mod-title-bar-r'}));



		this.modConW = new Element('div',{'class':'mod-con-w'});
		mod.adopt(this.modConW);
		

		/*
			Settings
		*/
		this.settingsEl = new Element('div',{'class':'mod-set'});
		this.modConW.adopt(this.settingsEl);

		this.modConW1 = new Element('div',{'class':'mod-con-w-1'});
		this.modConW.adopt(this.modConW1);



		/*
			Content
		*/
		this.contentEl = new Element('div',{'class':'mod-con'});
		this.modConW1.adopt(this.contentEl);

		this.contentEl.setStyles({
			'width':(this.options.contentWidth) ?  (this.options.contentWidth + this.options.contentWidthUnit) : '100%',
			'height':(this.options.contentHeight) ? (this.options.contentHeight + this.options.contentHeightUnit) : 'auto'
		});

		// if ($type(this.options.content) == 'element') {
		// 	this.contentEl.adopt(this.options.content);
		// } else {
		// 	this.contentEl.adopt(
		// 		new Element('div',{'class':'mod-con-all-txt'})
		// 			.setHTML(this.options.content)
		// 	);
		// }

		/*
			Footer
		*/
		this.modConW.adopt(
			new Element('div',{'class':'mod-ftr'})
				.adopt(new Element('div',{'class':'mod-ftr-c'}))
				.adopt(new Element('div',{'class':'mod-ftr-l'}))
				.adopt(new Element('div',{'class':'mod-ftr-r'}))
		);

		$extend(mod, this);

		if (this.options.minimized) {
			this.minimize.call(mod, true);
		}

		if (mod.options.userModuleID) {
			mod.isReadyToLoadContent = true;
		}
		
		return mod;

	},
	
	removeFromContentArea: function (e) {
		var ca = this.getContentArea();
		if ($defined(ca)) {
			ca.removeModule(this);
		}
	},
	
	toggleSettings: function (e) {
		if (!$defined(this.settingsEffect)) {
			this.settingsEffect = this.settingsEl.effects(this.settingsEffectOptions);
			this.settingsEffect.set(this.settingsEffectClosedParams);
		}

		if (this.options.minimized) {
			this.toggleMinimize();
		}

		if (this.isSettingsOpened) {
			this.settingsEffect.start(this.settingsEffectClosedParams);
			this.isSettingsOpened = false;
			this.titleBarSet.removeClass('set-2');
		} else {
			if (this.isReadyToLoadContent) {
				
				if (!this.settingsBuilt) {

					function saveSetting(el) {
						var n = el.getProperty('name');
						if (el.getProperty('type') != 'checkbox') {
							var v = el.getProperty('value');
						} else {
							var v = el.getProperty('checked') ? 1 : 0;
						}
						// console.log('settings changed', n, v);

						this.options.settings[n].value = v;
						var data = {};							
						data[n] = v;
						data['cmd'] = 'updateModuleSettings';
						data['uMID'] = this.options.userModuleID;

						new XHR().send('services/wt/user/',Object.toQueryString(data));
						this.isContentFirstLoad = true;
						this.refreshContent();
					};

					this.settingsBuilt = true;
					this.settingsEl.empty();

					var x = new Element('div',{'class':'menu-item menu-item-submenu-open'});
					x.adopt(new Element('span',{'class':'menu-item-submenu-icon'}));
					x.adopt(new Element('span',{'class':''}).setText(URSPIN.l10n.getString('ui.module.settings.contentsettingstitle')));
				
					this.settingsEl.adopt(x);

					var f = new Element('div',{'class':'mod-set-s-w-t'});
					this.settingsEl.adopt(f);
					f.adopt(new Element('div',{'class':'mod-set-s-w-t-c'}));
					f.adopt(new Element('div',{'class':'mod-set-s-w-t-l'}));
					f.adopt(new Element('div',{'class':'mod-set-s-w-t-r'}));

					var f = new Element('div',{'class':'mod-set-s-w'});
					this.settingsEl.adopt(f);
				
					var hasContentSettings = false;

					for (var settingName in this.options.settings) {
						var setting = this.options.settings[settingName];

						if (!setting.visible) {
							continue;
						}

						hasContentSettings = true;
						var x = new Element('div',{'class':'mod-set-s'});
						f.adopt(x);

						x.adopt(new Element('label',{'class':'tfl','for':''}).setText(setting.displayName));

						var tfw = new Element('div',{'class':'tf-w'});
						x.adopt(tfw);
						switch (setting.type) {
						case 'number-range':
							var s = new Element('select',{'class':'setting-form-el','name':setting.name});
							tfw.adopt(s);
							var dv = setting.defaultValue.split(';');
							var cur = dv[2];
							if ($chk(setting.value)) {
								if (setting.value.split(';').length == 1) {
									cur = setting.value;
								}

							}

							for (var i = dv[0]; i <= dv[1]; i++) {
								s.adopt(new Element('option',{'value':i,'selected':(i == cur ? 'selected' : null)}).setText(i));
							}
							s.addEvent('change', saveSetting.pass([s], this));
							break;
						case 'text':
						case '':
							var inp = new Element('input',{'class':'setting-form-el textinput','id':'','type':'text','name':setting.name,'value':setting.value||setting.defaultValue||''});
							tfw.adopt(new Element('div',{'class':'tf-c'}).adopt(inp));
							tfw.adopt(new Element('div',{'class':'tf-l'}));
							tfw.adopt(new Element('div',{'class':'tf-r'}));
							x.adopt(new Element('div',{'class':'cb'}));
							// inp.addEvent('change', saveSetting.pass([inp], this));

							var x = new Element('div',{'class':'mod-set-s'});
							f.adopt(x);
							x.adopt(new Element('div',{'class':'tf-w'}).adopt(URSPIN.Webtop.buildButton({'text':'Save','onClick':saveSetting.pass([inp], this)})));
							break;
						case 'boolean':
							do {
								var id = [this.options.userModuleID, '_set_bool_', $random(1, 10000)].join('');
							} while ($defined($(id)));
							var inp = new Element('input',{'class':'bool','id':id,'type':'checkbox','name':setting.name,'checked':setting.value});
							tfw.adopt(inp);
							inp.addEvent('change', saveSetting.pass([inp], this));
							// tfw.adopt(new Element('label',{'for':id}).setText());
							break;
						case 'enum-small':
						case 'enum-large':
						default:
							throw 'Unsupported module setting type';
						}

						x.adopt(new Element('div',{'class':'cb'}));
					} // for

					if (!hasContentSettings) {
						f.adopt(new Element('div').setText(URSPIN.l10n.getString('ui.module.settings.nocontentsettings')));
					}
					
					var f = new Element('div',{'class':'mod-set-s-w-b'});
					this.settingsEl.adopt(f);
					f.adopt(new Element('div',{'class':'mod-set-s-w-b-c'}));
					f.adopt(new Element('div',{'class':'mod-set-s-w-b-l'}));
					f.adopt(new Element('div',{'class':'mod-set-s-w-b-r'}));
					
				}
				
				
				

				if (this.settingsEl.getLast()) {
					var h = this.settingsEl.getLast().getCoordinates().bottom - this.settingsEl.getCoordinates().top;

					this.settingsEffectOpenedParams = {'height':h + 13};

					this.settingsEffect.start(this.settingsEffectOpenedParams);
					this.isSettingsOpened = true;
					this.titleBarSet.addClass('set-2');
				}
			}
		}
	},

	minimizeEffectOnStart: function () {
		if (this.options.minimized) {
			this.modConW1.setStyle('display','block');
			// this.modConW.setStyle('display','block');
			this.options.minimized = false;
		} else {
			this.minimizeEffectOpenParams = this.modConW1.getStyles('height');
			// this.minimizeEffectOpenParams = this.modConW.getStyles('height');
			console.log(this.minimizeEffectOpenParams);
			this.minimizeEffect.set(this.minimizeEffectOpenParams);
			this.options.minimized = true;
		}
	},
	
	minimizeEffectOnComplete: function () {
		var uri = 'services/wt/user/';
		var data = {
			'cmd':'updateModule',
			'uMID':this.options.userModuleID,
			'op':'min'
		};


		if (this.options.minimized) {
			this.modConW1.setStyle('display', 'none');
			data['min'] = 1;
		} else {
			if (!window.ie) {
				this.modConW1.setStyle('height', '');
			}
			data['min'] = 0;
		}


		var xhr = new XHR();

		xhr.send(uri, Object.toQueryString(data));
	},
	
	setupMinimizeEffect: function () {
		if (!$defined(this.minimizeEffect)) {
			this.minimizeEffectOptions.onStart = this.minimizeEffectOnStart.bind(this);
			this.minimizeEffectOptions.onComplete = this.minimizeEffectOnComplete.bind(this);
			this.minimizeEffect = this.modConW1.effects(this.minimizeEffectOptions);
			// this.minimizeEffect = this.modConW.effects(this.minimizeEffectOptions);
		}
	},

	minimize: function (noAnimate) {
		this.titleBarMini.addClass('mini-2');
		// this.titleBarSet.setStyle('display','none');
		this.setupMinimizeEffect();

		if (noAnimate) {
			this.minimizeEffect.set(this.minimizeEffectCloseParams);
			this.modConW1.setStyle('display','none');
			// this.modConW.setStyle('display','none');
		} else {
			this.minimizeEffect.start(this.minimizeEffectCloseParams);
		}
	},

	restore: function () {
		this.titleBarMini.removeClass('mini-2');
		// this.titleBarSet.setStyle('display','');
		
		this.setupMinimizeEffect();
		this.minimizeEffect.start(this.minimizeEffectOpenParams);
	},


	toggleMinimize: function (e) {
		if (this.options.minimized) {
			this.restore();
		} else {
			this.minimize();
		}
	},

	getContentArea: function () {
		// go up the ancestor tree looking for this module's parent
		// content area
		// should only go up 1 or 2 levels
		var contentArea = this.getParent();
		while ($defined(contentArea)) {
			if (contentArea.$URSPIN_isContentArea) {
				return contentArea;
			}
			
			if ($type(contentArea.getParent) == 'function') {
				contentArea = contentArea.getParent();
			} else {
				break;
			}
		}
		
		return null;
	},

	titleBarMouseDown: function (e) {
		if (this.options.draggable && !$defined(this.drag)) {

			this.drag = this.makeDraggable({
				'snap':10,
				'handle':this.titleBar,
				'onBeforeStart':this.dragBeforeStart.bind(this),
				'onStart':this.dragStart.bind(this),
				'onSnap':this.dragSnap.bind(this),
				'onComplete':this.dragComplete.bind(this)
			});
			// reset the changes made by makeDraggable()
			// otherwise safari and opera will layout modules on top of each
			// other
			this.setStyles({'position':'','left':'','top':''});
			this.drag.start(e);
		}
	},
	
	dragEmptyDrop: function () {
		this.remove();
	},

	dragBeforeStart: function () {
		// console.log('onBeforeStart');

		// Drag.Base and Drag.Move sets some paramters based on th
		// element's properties.

		// Use onBeforeStart to set these properties so that the drag works
		// the way we want (specifically we want the drag code to modify the
		// position using absolute positioning)


		var contentArea = this.getContentArea() || URSPIN.getWebtop().getTabManager().getCurrentTab().getContentArea();
		if ($defined(contentArea)) {
			this.drag.droppables = $$(contentArea.getElements('.col'), '.droppable');
		} else {
			this.drag.droppables = $$('.droppable');
		}
		

		this.setStyles({
			'position':'absolute',
			'left':this.getLeft() - this.getParent().getLeft(),
			'top':this.getTop() - this.getParent().getTop()
		});
		


	},
	
	dragStart: function () {
		// console.log('onStart');
		// clear the changes made in dragBeforeStart
		this.setStyles({'position':'','left':'','top':''});
	},

	dragSnap: function () {
		// console.log('onSnap');
		
		this.drag.droppables = $$('.col', '.droppable');
		
		this.dragDirty = true;

		this.setStyles({
			'position':'absolute',
			'width':this.offsetWidth
		});

		// mod-drag applies the translucent effect and changes z-index
		this.addClass('mod-drag');

		// create wire preview (module outline)
		this.wirePreview = this.wirePreview || new Element('div',{'class':'mod-wire-preview'});
		this.wirePreview.setStyles({'height':(this.offsetHeight - 4)});
		this.wirePreview.injectAfter(this);

		
		// drag-cover elements are designed to cover things that can affect
		// dragging, such as iframes
		// save in this.dragCover so we can set reverse in cleanUpDrag()
		// TODO: only need to activate the .drag-covers of visible elements
		this.dragCover = $$('.drag-cover');
		this.dragCover.setStyle('display','block');
	},
	
	dragComplete: function () {
		// console.log('dragComplete');
		this.cleanUpDrag();
	},
	
	cleanUpDrag: function () {
	
		if (this.dragDirty) {
			// console.log('cleanUpDrag');
			if ($defined(this.dragCover)) {
				this.dragCover.setStyle('display','none');
				this.dragCover = null;
			}
		
		
			// reset the mod's styles
			this.removeClass('mod-drag');
			this.setStyles({'position':'','left':'','top':'','width':''});

			// remove the wire preview if it's still inside an element
			if ($defined(this.wirePreview)) {
				if ($defined(this.wirePreview.getParent())) {
					this.wirePreview.remove();
				}
				this.wirePrview = null;
			}
			this.dragDirty = false;
		}
	},

	refreshContent: function () {
		// console.log('module.refreshContent', this);
		if (!this.isReadyToLoadContent) {
			return;
		}

		if (this.isContentFirstLoad) {
			this.isContentFirstLoad = false;	
			this.contentEl.empty();		
			this.setContent(this.options.content, this.options.contentType);
		}
	},
	
	setContent: function (content, contentType) {
		contentType = contentType || 'text-plain';
		if ($chk(content)) {
			this.contentEl.empty();
			this.onContentLoadingStart();

			var c = new Element('div',{'class':['mod-con-type-', contentType].join('')});
			this.contentEl.adopt(c);

			if (contentType == 'uri-iframe') {
				c.adopt(new Element('div',{'class':'drag-cover'}));
				c.adopt(new Element('iframe',{
					'src':content,
					'width':'100%',
					'height':this.options.contentHeight,
					'allowTransparency':'true',
					'scrolling':'no',
					'frameborder':'0'
				}).addEvent('load', function () {
					this.onContentLoadingStop();
				}.bind(this)));
				// this.onContentLoadingStop();
			} else if (contentType == 'text-html') {
				c.setHTML(content);
				this.onContentLoadingStop();
			} else {
				c.setText(content);
				this.onContentLoadingStop();
			}
		}
		
	},
	
	onContentLoadingStart: function () {
		this.contentEl.empty();
		this.contentEl.adopt(new Element('div',{'class':'mod-con-throbber'}));
	},

	onContentLoadingStop: function () {
		$(this.contentEl).getElements('.mod-con-throbber').each(function (el) {
			el.remove();
		});
	},
	
	movedTo: function (userTabID, col, row, newModOrder) {
		
		// console.log('module.movedTo', arguments);
		var data = {
			'cmd':'updateModule',
			'op':'mv',
			'mID':this.options.moduleID,
			'uMID':this.options.userModuleID,
			'uTID':userTabID,
			'c':col,
			'r':row,
			'modOrder':newModOrder
		};
		
		if (!this.options.userModuleID) {
			// module is a new module
			if (this.options.moduleID == 1 && this.options.settings && this.options.settings.feedURI) {
				data['feedURI'] = this.options.settings.feedURI.value;
			}
		}

		var xhr = new XHR({'onSuccess':function (text, xml) {
			if (text && text.length > 0) {
				var data = Json.evaluate(text);
				if (data.newModule) {
					this.setOptions(data.newModule);
					this.isReadyToLoadContent = true;
					this.refreshContent();
				}
			}
		}.bind(this)});
		xhr.send('services/wt/user/', Object.toQueryString(data));
	}
});

URSPIN.Module.implement(new Options, new Events);


URSPIN.FeedModule = URSPIN.Module.extend({

	options: {
		'settings':{
			'feedURI':{
				'value':null				
			},
			'numEntries':{
				'value':6
			}
			
		}
    },


	refresher: null,
	initialize: function (options) {
		options.moduleID = 1;
		this.setOptions(options);

		var el = this.parent(options);
		
		el.getElement('.mod-title').setHTML(URSPIN.l10n.getString('ui.basic.loading'));
		
		return el;
	},
	
	refreshContent: function () {
		if (!this.isReadyToLoadContent) {
			return;
		}
		if (this.isContentFirstLoad) {
			this.isContentFirstLoad = false;
			
			// FIX something is wrong with the next line
			// error msg: this.getElement is not a function
			// referencing 'this' seems to fix error, WTF?

			this;
			this.getElement('.mod-con').setStyle('height', '50px');
			this.onContentLoadingStart();
			
			if (!$defined(this.refresher)) {
				this.refresher = this.refreshContent.periodical(1 * 60 * 60 * 1000, this); // hour
			}
		} else {
		}

		if (this.options.settings.feedURI.value) {
			var numEntries = this.options.settings.numEntries.value;
			if ($chk(this.options.settings.numEntries.value)) {
				var spl = this.options.settings.numEntries.value.split(';');
				if (spl.length > 1) {
					numEntries = spl[2] || this.options.settings.numEntries.defaultValue.split(';')[2] || 6;
				}
			}

			new XHR({'method':'get','onSuccess':this.setContent.bind(this)}).send('services/wt/proxy/feed/', Object.toQueryString({'numEntries':numEntries, 'uri':this.options.settings.feedURI.value}));
		} else {
			this.setError(URSPIN.l10n.getString('ui.module.feed.error.load'));
		}

	},
	
	setContent: function (result) {

		this.onContentLoadingStop();
		this.getElement('.mod-con').setStyle('height', 'auto');
		this.getElement('.mod-con').empty();

		try {
			var result = Json.evaluate(result);
			// console.dir({'result':result});
		} catch (e) {
			var result  = {'error':'Json.evaluate'};
		}



		if (!result.error) {
			this.getElement('.mod-title').setHTML(result.feed.title);
			this.options.title = result.feed.title;
			this.feed = result.feed;

			var container = new Element('div',{'class':'entries'});

			this.getElement('.mod-con').adopt(container);

			var open = function (entry) {
				if (!entry.getElement('.summary')) {
					var entryData = this.feed.items[entry.getProperty('entryID')];
					var s = new Element('div',{'class':'summary'});
					entry.adopt(s);
					s.adopt(new Element('div',{'class':'summary-link'}).adopt(new Element('a',{'href':entryData.link,'target':'_blank'}).setHTML(URSPIN.l10n.getString('ui.module.feed.linktoorig'))));
									
					// s.adopt(new Element('div',{'class':'summary-date'}).setText(entryData['publishedDate']));
					var text = new Element('div',{'class':'summary-text'}).setHTML([(entryData['summary'] || entryData['description']), '<div class="cb"></div>'].join(''));

					// var m = this;

					text.getElements('a').each(function (el) {
						el.setProperty('target','_blank');
					});
					s.adopt(text);
									

					text.getElements('img').each(function (el) {
						el.setStyle('visibility','hidden');
						el.addEvent('load', function () {
							el.setStyle('visibility','visible');
							this.removeEvents('load');
							if (this.offsetWidth > 246) {
								this.removeProperty('width');
								this.removeProperty('height');
								this.setStyles({'width':'100%', 'padding':'0'});
								this.addClass('openpopup');
							}

						}.bindWithEvent(el));
					});
							
					text.getElements('object').each(function (el) {
						var w = el.getProperty('width');
						if (w > text.offsetWidth) {
							el.setProperty('width', text.offsetWidth);
							el.setProperty('height', (text.offsetWidth / w) * el.getProperty('height'));
						}
						
					});
					text.getElements('embed').each(function (el) {
						var w = el.getProperty('width');
						if (w > text.offsetWidth) {
							el.setProperty('width', text.offsetWidth);
							el.setProperty('height', (text.offsetWidth / w) * el.getProperty('height'));
						}
									
					});
				
				
				}

				entry.addClass('entry-opened');

			}.bind(this);

			for (var i = 0; i < result.feed.items.length; i++) {
				var entry = result.feed.items[i];
				
				var el = new Element('div',{'class':'entry','entryID':i});
				container.adopt(el);

				var h = new Element('div',{'class':'headline'});
				el.adopt(h);
				h.adopt(new Element('div',{'class':'headline-icn'}));
				h.adopt(new Element('a',{'class':'headline-txt', 'href':'javascript:void(0);'}).setHTML(entry.title));
				if (i == 0) {
					open(el);
				}
			}


			
			container.addEvent('click', function (e) {
				if (e.target.getParent().hasClass('headline')) {
					var entry = e.target.getParent().getParent();
					if (entry.hasClass('entry-opened')) {
						entry.removeClass('entry-opened');
						// var sum = entry.getElement('.summary');
						// if (sum) {
						// 	sum.remove();
						// }
					} else {
						open(entry);
					}

				}
				
			}.bindWithEvent(this));
		} else {
			// console.error('feed error: ', result.error);
			this.setError(URSPIN.l10n.getString('ui.module.feed.error.load'));
		}
	},
	
	removeFromContentArea: function (e) {
		this.parent(e);
		$clear(this.refresher);
	},
	
	setError: function (msg, options) {
		this.getElement('.mod-con').setHTML(['<div class="error-1"></div><div class="error-2">', msg, '</div>'].join(''));
	}
	
	
});