/*
=head1 NAME

takkle.view.page.forum

=head1 DESCRIPTION

Base class for all pages

=head1 INHERITS FROM

takkle.view.page

=head1 METHODS

=over 4

*/

var _thread = {
	threadId:null,
	currentForumId:null,
	replyCount:null,
	ownerId:null,
	htmlSource:null
};

_thread.constructor = function(params) {
	for(var i in params) {
		this[i] = params[i];
	}
};

_thread.addLoggedInEvents = function(user_id) {
	if (this.ownerId == user_id) {
		var my_node = $E('.forumFoot','thread_holder_' + this.threadId);
		var self = this;
		new Element('a', { 
			'href' : '#', 
			'onclick' : 'return false;' 
			} ).setHTML('Remove').injectInside(my_node).addEvent('click', 
				function() { 
					page.remove({threadId: self.threadId,forumId: self.currentForumId }); 
				});
	}
};

_thread.getNode = function() {
	return $('thread_holder_' + this.threadId);
};

dojo.provide( 'takkle.view.controls.thread' );
dojo.declare( 'takkle.view.controls.thread', null, _thread );

/*
=item * obj = new( params )

=back

*/
dojo.provide( 'takkle.view.page.forum' );
dojo.declare( 'takkle.view.page.forum', takkle.view.page, {
	threadHash:{},
	threadArray:[],
	currentSort:null,
	currentUserId:null,
	constructor: function ( params ) {
        this.params = params;

		// set instance data
		this.mkAccessor('forumId');
		this.setForumId(params.forumId);
		var my_user = App.get_user();
		if (my_user) { 
			this.currentUserId = my_user.id;
		}
    },
	initThread: function( params ) {
		var thread = new takkle.view.controls.thread(params);
		this.threadHash["thread"+thread.threadId] = thread;
		var thread_hash = {};
		
		thread.addLoggedInEvents(this.currentUserId);
		//thread_hash["thread" + thread.threadId] = thread;
		this.threadArray.push(thread);
	},
	loadThread: function( id ) {
		var thread = $('thread_holder_' + id);
		page.initThread(this.getObjectFromProps(thread,['replyCount','ownerId','threadId','currentForumId']));
	},
	loadThreads: function ( params ) {
		$$('.forumLanding').each(function(cmt){
			page.loadThread(cmt.getProperty('threadId'));
		});
		this.currentSort = 'date';
	},
	sortByColumn: function (a,b,sortColumn,isReverse) {
		var x = (a[sortColumn]) ? a[sortColumn] : 0;
		var y = (b[sortColumn]) ? b[sortColumn] : 0;
		//var x = Date.parse(a.createdDate).getTime();
		//var y = Date.parse(b.createdDate).getTime();
		if (isReverse) {
			return ((x < y) ? 1 : ((x > y) ? -1 : 0));
		} else {
			if (x < y) {
				var tmp = a.getNode().clone();
				a.getNode().remove();
				tmp.injectAfter(b.getNode());
			} else if (x > y) {
				var tmp = b.getNode().clone();
				b.getNode().remove();
				tmp.injectAfter(a.getNode());
			}
			return ((x < y) ? -1 : ((x > y) ? 1 : 0));
		}
	},
	sortObjects: function ( sort_type ) {
		console.log('presort');
		console.debug(this.threadArray);
		var self = this;	
		var oldThreadArray = this.threadArray;
		this.threadArray.sort(
			function(a,b) {
				return self.sortByColumn(a,b,sort_type);
			}
		);	
		//$('threadList').innerHTML = '';
		//var oldHTML = [];
		//for(i=0;i<this.threadArray.length;i++) {
		//	this.threadArray[i]	
		//}
		console.log('postsort');
		console.debug(this.threadArray);
	},
	sort: function ( params ) {
		if (!params.type) {
			throw('no sort type passed to sort');
		}
		return;
		// form args
		var args;
		if (params.type == 'date') {
			args = { type: 'date' };
			//this.sortObjects('stampCreatedDate');
		} else if (params.type == 'activity') {
			args = { type: 'activity' };
			//this.sortObjects('lastUpdateDate');
		} else if (params.type == 'replies') {
			args = { type: 'replies' };
			//this.sortObjects('replyCount');
		} else {
			throw('invalid type: ' + params.type);
		}
		
		this.showLoaderPopup({ message: 'Sorting' });
		// send request
		var self = this;
		server.request({ 
			path: API.getApiPath(this.uriFor('/forum', this.getForumId(), 'thread', 'sort')),
			onComplete: function(resp) { self.handleResponse(resp) },
			onError: function(resp) { self.handleError(resp) },
			args: args
		});	
		
	},
    handleResponse: function ( response ) {
		console.debug(response);
		if (!response.message)
			response.message = 'Done';
		this.hideLoaderPopup({ message: response.message });
		var container = dojo.byId('threadList');
		if (!container) {
			throw('can not find thread list');
		}
		container.innerHTML = response.fragment;
		page.loadThreads();
	},
	removeForumTopic: function( thread_id ) {
		this.hideLoaderPopup({ message: 'Your forum has been removed - go create a new one!' });
		var my_node = $('thread_holder_' + thread_id);
		my_node.remove();
	},
    handleError: function ( response ) {
		if (!response.message)
			response.message = 'There was an error';
		this.hideLoaderPopup({ message: response.message });
		console.debug(response);
	},
	remove: function ( params ) {
		// validate
		if (!params.threadId) {
			throw('Must pass thread id');
		}
		var curForumId = params.forumId;
		if (!curForumId || curForumId == "") curForumId = this.getForumId();

		if (!curForumId || curForumId == "") {
			throw('Must pass forum id');
		}
		// cast the vote
		var self = this;
		this.showLoaderPopup({ message: 'Removing' });
		server.request({ 
			path: API.getApiPath(this.uriFor('/people/deactivate_topic')),
			onComplete: function(resp) { self.removeForumTopic(params.threadId) },
			onError: function(resp) { self.handleError(resp) },
			args: { thread_id : params.threadId, forum_id: curForumId }
		});
    }
});

/*
=back

=cut
*/
