var forum_app = {
	infoPane:'',
	grid_discussion:'',
	grid_topic:'',
	grid_search:'',
	gridPager_discussion:'',
	gridPager_topic:'',
	gridPager_search:'',
	discussion:'',
	topic:'',
	initialised:false,
	
	init:function(){
		forum_app.discussion = new Object();
		forum_app.topic = new Object();
		forum_app.infoPane = new cfkit_InfoPane('forum'),
		forum_app.grid_discussion = new Grid();
		forum_app.grid_topic = new Grid();
		forum_app.grid_search = new Grid();
		forum_app.gridPager_discussion = new Grid_Pager();
		forum_app.gridPager_topic = new Grid_Pager();
		forum_app.gridPager_search = new Grid_Pager();
		forum_app.grid_discussion.init('discussionGrid',20);
		forum_app.grid_topic.init('topicGrid',20);
		forum_app.grid_search.init('searchGrid',20);
		forum_app.gridPager_discussion.init('discussionPager',forum_app.grid_discussion,'forum_app.gridPager_discussion');
		forum_app.gridPager_topic.init('topicPager',forum_app.grid_topic,'forum_app.gridPager_topic');
		forum_app.gridPager_search.init('searchPager',forum_app.grid_search,'forum_app.gridPager_search');
		dojo.byId('topic_REQUEST_ID').value = cfkit_util.createGUID();
		dojo.byId('post_REQUEST_ID').value = cfkit_util.createGUID();
		
		if(!CFKIT_GLOBAL.authenticated){
			cfkit_util.display('signIn',true);
			cfkit_util.display('newTopicBtn',false);
			cfkit_util.display('newTopic',false);
			cfkit_util.display('newPost',false);
		}else{
			cfkit_util.display('signIn',false);
		}
		anchor.init();
		forum_app.show('forum');
		forum_app.initialised = true;
		return;
	},
	
	refresh:function(mode){
		switch(mode){
			case 'discussion':
				forum_app.loadTopicList(forum_app.discussion.DISCUSSIONGUID);
			break;
			case 'topic':
				forum_app.loadTopic(forum_app.topic.TOPICID);
			break;
		}
		return;
	},
	
	show:function(mode){
		forum_app._drawBread(mode);
		
		switch(mode){
			case 'forum':
			forum_app._forum();
			break;
			case 'discussion':
			forum_app._discussion();
			break;
			case 'topic':
			forum_app._topic();
			break;
			case 'search_result':
			forum_app._searchResult();
			break;
		}
		forum_app.updateContainer();
		return;
	},
	
	openTopicWriter:function(){
		cfkit_util.display('newTopic',true);
		forum_app.updateContainer();
		return;
	},
	
	closeTopicWriter:function(){
		cfkit_util.display('newTopic',false);
		return;
	},
	
	_forum:function(){
		cfkit_util.display('page_forum',true);
		cfkit_util.display('page_discussion',false);
		cfkit_util.display('page_topic',false);
		cfkit_util.display('page_search',false);
		cfkit_util.display('newTopic',false);
		cfkit_util.display('newPost',false);
		cfkit_util.display('frmTopicSrch',true);
		return;	
	},
	
	_discussion:function(){
		dojo.byId('discussion_head').innerHTML = forum_app.discussion.TITLE;
		cfkit_util.display('page_forum',false);
		cfkit_util.display('page_discussion',true);
		cfkit_util.display('page_topic',false);
		cfkit_util.display('page_search',false);
		cfkit_util.display('newTopic',false);
		cfkit_util.display('newPost',false);
		cfkit_util.display('frmTopicSrch',false);
		if(forum_app.discussion.IS_SOLO || !CFKIT_GLOBAL.authenticated){
			cfkit_util.display('newTopicBtn',false);
		}else{
			cfkit_util.display('newTopicBtn',true);
		}
		
		return;
	},
	
	_topic:function(){
		dojo.byId('topic_head').innerHTML = forum_app.topic.SUBJECT;
		cfkit_util.display('page_forum',false);
		cfkit_util.display('page_discussion',false);
		cfkit_util.display('page_topic',true);
		cfkit_util.display('page_search',false);
		cfkit_util.display('newTopic',false);
		cfkit_util.display('frmTopicSrch',false);
		if(CFKIT_GLOBAL.authenticated) cfkit_util.display('newPost',true);
		return;
	},
	
	_searchResult:function(){
		cfkit_util.display('page_forum',false);
		cfkit_util.display('page_discussion',false);
		cfkit_util.display('page_topic',false);
		cfkit_util.display('page_search',true);
		cfkit_util.display('newTopic',false);
		cfkit_util.display('newPost',false);
		cfkit_util.display('frmTopicSrch',true);
		return;
	},
	
	_drawBread:function(mode){
		switch(mode){
			case 'search_result':
			dojo.byId('crumb_a1').innerHTML = '';
			dojo.byId('crumb_a2').innerHTML = '';
			dojo.byId('crumb_0').style.display = 'inline';
			dojo.byId('crumb_1').style.display = 'none';
			dojo.byId('crumb_2').style.display = 'none';
			if(forum_app.initialised){
				anchor.clear();
			}
			break;
			
			case 'forum':
			dojo.byId('crumb_a1').innerHTML = '';
			dojo.byId('crumb_a2').innerHTML = '';
			dojo.byId('crumb_0').style.display = 'none';
			dojo.byId('crumb_1').style.display = 'none';
			dojo.byId('crumb_2').style.display = 'none';
			if(forum_app.initialised){
				anchor.clear();
			}
			break;
			
			case 'discussion':
			//dojo.byId('discussionImg').src = '/gfx/global/forum/discussionType_' + forum_app.discussion.DISCUSSIONTYPEID + '.png';
			dojo.byId('discussionImg').className = 'discussionLogo_' + forum_app.discussion.DISCUSSIONTYPEID;
			dojo.byId('topic_discussionGUID').value = forum_app.discussion.DISCUSSIONGUID;
			dojo.byId('crumb_a1').innerHTML = forum_app.discussion.TYPE + ', ' + forum_app.discussion.TITLE;
			dojo.byId('crumb_a2').innerHTML = '';
			dojo.byId('crumb_0').style.display = 'inline';
			dojo.byId('crumb_1').style.display = 'inline';
			dojo.byId('crumb_2').style.display = 'none';
			anchor.setVar('DISCUSSIONGUID',forum_app.discussion.DISCUSSIONGUID);
			anchor.setVar('TOPICID',0);
			break;
			
			case 'topic':
			//dojo.byId('topicImg').src = '/gfx/global/forum/discussionType_' + forum_app.discussion.DISCUSSIONTYPEID + '.png';
			dojo.byId('topicImg').className = 'discussionLogo_' + forum_app.discussion.DISCUSSIONTYPEID;
			dojo.byId('crumb_a1').innerHTML = forum_app.discussion.TYPE + ', ' + forum_app.discussion.TITLE;
			dojo.byId('crumb_a2').innerHTML = forum_app.topic.SUBJECT;
			dojo.byId('crumb_0').style.display = 'inline';
			dojo.byId('crumb_1').style.display = 'inline';
			dojo.byId('crumb_2').style.display = 'inline';
			anchor.setVar('DISCUSSIONGUID',forum_app.discussion.DISCUSSIONGUID);
			anchor.setVar('TOPICID',forum_app.topic.TOPICID);
			break;
		}

		return;
	},
	
	loadTopicList:function(discussion_guid){
		forum_app.infoPane.busy();
		dojo.xhrPost({
			url : "/cfkit_forum/server/api.cfm",
			handleAs : "json",
			load : forum_app.loadTopicListOK,
			error : forum_app.callbackError,
			content: {'REQUEST_ID':cfkit_util.createGUID(),'METHOD':'TOPIC_LIST','DISCUSSIONGUID':discussion_guid,'sort_desc':1}
		});
		return;
	},
	
	loadTopicListOK:function(data,ioArgs){
		forum_app.gridPager_discussion.updateData(data.TOPIC);
		forum_app.discussion = data.DISCUSSION;
		forum_app.show('discussion');
		forum_app.infoPane.hide();
		return;
	},

	loadTopic:function(topicID){
		forum_app.infoPane.busy();
		dojo.xhrPost({
			url : "/cfkit_forum/server/api.cfm",
			handleAs : "json",
			load : forum_app.loadTopicOK,
			error : forum_app.callbackError,
			content: {'REQUEST_ID':cfkit_util.createGUID(),'METHOD':'GET_TOPIC','TOPICID':topicID,'sort_desc':0}
		});
		return;
	},
	
	loadTopicOK:function(data,ioArgs){
		dojo.byId('post_topicID').value = data.TOPIC.TOPICID;
		forum_app.gridPager_topic.updateData(data.TOPIC.POST);
		forum_app.topic = data.TOPIC;
		forum_app.discussion = data.DISCUSSION;
		forum_app.show('topic');
		forum_app.infoPane.hide();
		return;
	},
	
	saveTopic:function(){
		forum_app.infoPane.busy();
		dojo.xhrPost({
			form: "frmTopic",
			url : "/cfkit_forum/server/api.cfm",
			handleAs : "json",
			load : forum_app.saveTopicOK,
			error : forum_app.callbackError
		});
	},

	saveTopicOK:function(data,ioArgs){
		if(data.STATUS !=2){
			forum_app.infoPane.msg(data.MSG.DISPLAYTXT,-1);
		}else{
			dojo.byId('topic_comment').value = '';
			forum_app.refresh('discussion');
		}
		if(data.STRACTION.AWARDED && window.parent.cfkit_award != undefined){
			window.parent.cfkit_award.display(data.STRACTION);
		}
		dojo.byId('topic_REQUEST_ID').value = cfkit_util.createGUID();
		return;
	},	

	savePost:function(){
		forum_app.infoPane.busy();
		dojo.xhrPost({
			form: "frmPost",
			url : "/cfkit_forum/server/api.cfm",
			handleAs : "json",
			load : forum_app.savePostOK,
			error : forum_app.callbackError
		});
	},

	savePostOK:function(data,ioArgs){
		if(data.STATUS !=2){
			forum_app.infoPane.msg(data.MSG.DISPLAYTXT,-1);
		}else{
			dojo.byId('post_comment').value = '';
			forum_app.refresh('topic');
		}
		
		if(data.STRACTION.AWARDED && window.parent.cfkit_award != undefined){
			window.parent.cfkit_award.display(data.STRACTION);
		}
		dojo.byId('post_REQUEST_ID').value = cfkit_util.createGUID();
		return;
	},
	
	callbackError:function(data,ioArgs){
		console.log(data);
		forum_app.infoPane.msg('Error Contacting Server',-1);
		return;
	},
	
	updateContainer:function(){
		if(window.parent.forumChangeEvent == undefined) return;/* The parent does NOT implement a forumChangeEvent handler. */
		if(typeof window.parent.forumChangeEvent != 'function') return;
		window.parent.forumChangeEvent();
		return;
	},

	search:function(){
		forum_app.infoPane.busy();
		dojo.xhrPost({
			form: "frmTopicSrch",
			url : "/cfkit_forum/server/api.cfm",
			handleAs : "json",
			load : forum_app.searchOK,
			error : forum_app.callbackError,
			content: {'REQUEST_ID':cfkit_util.createGUID(),'METHOD':'TOPIC_SEARCH'}
		});
		return;
	},
	
	searchOK:function(data,ioArgs){
		console.log(data);
		if(data.STATUS !=2){
			forum_app.infoPane.msg(data.MSG.DISPLAYTXT,-1);
			return;
		}
		forum_app.gridPager_search.updateData(data.RESULT_SET);
		forum_app.show('search_result');
		forum_app.infoPane.hide();
		return;
	}
}

/*
This object is used to read and write URL style parameters to the anchor part of a URL.
Using this technique we have method of passing parameters in the URL without talking to the server.
Another use is createing special URLs with javascript without reloading a page, thus allowing
us to create bookmarks and URLs which will remeber an AJAX applications state based on the URL.
eg. The user can open an AJAX based forum thread and bookmark the location of the thread. When the
user returns using the bookmark we can bring the AJAX page to the point the user was at when he bookmarked the page.

NOTE: window.location.hash (is not consistent accross browsers FF eg. returns the # as part of the string and safari does not.
we therfore just munge the hash ourself.

Copyright: Marcel Scherzer 2009.
*/
var anchor = {
	vars:new Object(),
	src:window.top.location.href,
	init:function(){
		// Only parse on page load, prevent from manipulating vars after the page is loaded.
		anchor._parse();
		return;
	},
	_getAnchorString:function(){
		var regex = new RegExp('#.*');
		var results = regex.exec(anchor.src);
		results = (results != null) ? results[0] : '#';
		return results.substr(1);
	},
	_parse:function(){
		var value = anchor._getAnchorString();
		var aPairs = value.split('&');
		if (aPairs == null) return;
		for(var i=0;i<aPairs.length;i++){
			var aTmp = aPairs[i].split('=');
			if(aTmp.length = 2){
				anchor.vars[aTmp[0]] = aTmp[1];
			}
		}
		return;
	},
	_updateURL:function(){
		var regex = new RegExp('[^#]*');
		var script_name = regex.exec(anchor.src);
		var value = '#';
		for (var name in anchor.vars){
			if(name != ''){
				value = value + name + '=' + anchor.vars[name] + '&';
			}
		}
		window.top.location.href = script_name + value;
		return;
	},
	getVar:function(name){
	  	return anchor.vars[name];
	},
	setVar:function(name,value){
		anchor.vars[name] = value;
		anchor._updateURL();
		return;
	},
	clear:function(){
		anchor.vars = new Object();
		anchor._updateURL();
		return;
	}
}