/*
 * Javascript class to handle legislative bodies section
 *
 * Author: Lucas Pedley
 * Copyright Me
 */
var Legislative = new function() {
	//config options
	this.debug = true;
	
	//holding vars
	this.currentYear = '';
	this.cleanMenu   = '';
	this.msg         = '';
	
	/**
	 * Initilize the legislative class
	 */
	this.init = function(){
		var self = Legislative;
		try{
			if(!$('agendaYear') || typeof $('agendaYear') == 'undefined'){
				return;
			}
			//load a specified agenda onload, typically a post edit/add event
			if(document.getElementById('msgAgendaId')){
				var msgAgendaId = $('msgAgendaId');
				self.loadAgenda(msgAgendaId.value);
				self.msg = $('message').innerHTML;
			}
		}catch(ex){
			self.doDebug(ex);
		}	
		var year = $('agendaYear').value;		
		
		//hold on to a copy of original clean menu
		self.cleanMenu = $('agenda_menu').innerHTML;
		self.loadYear(year);		
	};
	/**
	 * Navigation menu refresh with new year
	 * @param string yr
	 * @return null
	 */
	this.loadYear = function(yr){
		var self = Legislative;
		if(self.currentYear == yr){
			return;
		}
		if(yr == 'neg'){
			yr = parseInt(self.currentYear) - 1;
		}
		if(yr == 'pos'){
			yr = parseInt(self.currentYear) + 1;
		}
		//prevent from going too low or too high
		var agendaYrObj = $('agendaYear');
		var len = agendaYrObj.length;
		var bounds = false;
		for (var i=0; i<len; i++) {
			if(agendaYrObj[i].value.indexOf(yr) == 0){
				//within bounds
				bounds = true
				break;
			}
		}
		if(!bounds){
			//alert('out of bounds');
			return;
		}
		
		//reset menu
		$('agenda_menu').innerHTML = self.cleanMenu;
		try{
			var minuteExist = new Array();
			agendaCollection.each(
				function(yearArr){
					var year = yearArr[0];
					
					if(year == yr){
						//alert(year +' matches '+ yr);
						yearArr[1].each(
							function(moArr){
								var monthBrick = $('m_'+moArr[0]);
								var monthId = moArr[0];
								var meeting = 0;
								var liParts = $A();
								//alert('monthId: m_'+moArr[0]);
								
								moArr[1].each(		  
									function(meetDtArr){
										var agendaId    = meetDtArr[0];
										var agendaDate  = meetDtArr[1].get('agendaDate');
										var minutesExst = meetDtArr[1].get('minuteExist');
										//minuteExist[year][monthId][agendaId] = meetDtArr[1].get('minuteExist');
										//alert(agendaDate+','+agendaId);
										var liElem = 	Builder.node('li', [
													 		Builder.node('a',{href:'javascript:void(0)',onclick:"Legislative.loadAgenda('"+agendaId+"','"+minutesExst+"')"},
																[agendaDate])
														]);
											
										liParts[meeting] = liElem;
										meeting++;
										
									}
								);								
								
								if(meeting > 0){
									//add sub menu
									var ulList = Builder.node('ul',{id:'mSub_'+monthId},[liParts]);
									//monthBrick.insert({'after' : ulList});
									monthBrick.appendChild(ulList);
									//add submenu indicator
									var spanIndicator = Builder.node('span',{style:'float:right'},['>>']);
									$('mSpan'+moArr[0]).appendChild(spanIndicator);
								}
/**/								
							}
						);
					}					
				}
			);
			self.toggleSubMenu();
		}catch(ex){
			self.doDebug(ex);
		}
		self.currentYear = yr;
		agendaYrObj.value = yr;
	};
	/**
	 * Show / Hide a sub-menu
	 * @param node
	 */
	this.toggleSubMenu = function(id) {
		var self = Legislative;
		if(typeof id == 'undefined'){
			//hide all
			for(var i=0; i < 12; i++){
				var monthNode = $('mSub_'+i);
				if(monthNode && typeof monthNode != 'undefined'){
					Effect.SlideUp(monthNode);
				}
			}
		}
		else{
			for(var i=0; i < 12; i++){
				var monthNode = $('mSub_'+i);
				if(monthNode && typeof monthNode != 'undefined'){
					if(id == i && monthNode.style.display == "none"){
						Effect.SlideDown(monthNode);
					}
					if(id != i && monthNode.style.display != "none"){
						Effect.SlideUp(monthNode);
					}
				}
			}
		}
		
	};
	/**
	 * Generic ajax failure method
	 * @param serverData
	 */
	this.loadAjaxFailure = function(serverData){
		var self = Legislative;
		var msg = "An error occured while receiving data. ";
		alert(msg);
	
	};
	 
	/**
	 * Load an agenda via an ajax call
	 * @param integer, agendaId
	 */
	this.loadAgenda = function(agendaId, minute){
		var self = Legislative;
		//alert(site_url);
		var options = {
			method		: 'post',
			parameters  : 'agendaId='+agendaId,
			onSuccess   : Legislative.loadAgendaSuccess,
			onFailure   : Legislative.loadAjaxFailure
		};
		self.showLoading(true);
		new Ajax.Request(site_url+'/meeting/ajax_loadAgenda', options);
		//clear minute id
	};
	/**
	 * Load Agenda and any minutes and comments
	 * @param object transport
	 */
	this.loadAgendaSuccess = function(transport){
		var self = Legislative;
		//alert(transport.responseText);
		self.showLoading(false);
		try{
			var json  = transport.responseText.evalJSON();
			var perm  = json.perm;
			var lBody = json.body;
			if(typeof json.agenda != 'undefined'){
				var agendaOutputObj = self.buildAgendaDisplay(json.agenda,perm);	
				$('agenda').update(agendaOutputObj);
				$('agendaDetail').innerHTML = json.agenda.agenda_detail;
			}
			if(typeof json.minute != 'undefined'){
				var minuteOutputObj = self.buildMinuteDisplay(json.minute,perm);	
				$('minute').update(minuteOutputObj);
				$('minute').show();
				$('minuteDetail').innerHTML = json.minute.minute_detail;
			}else{
				$('minute').update();
				$('minute').hide();
				if( $('minuteId')){
					$('minuteId').value = '';
					$('addMinute').show();
					$('editMinuteSpan').hide();
					$('editMinute').disabled = true;					
					$('delMinuteSpan').hide();
					$('delMinute').disabled = true;					
				}
			}
			if(document.getElementById('comment')){
				//logged in alert('div exists');
				if(typeof json.comment != 'undefined'){
					var commentOutputObj = self.buildCommentDisplay(json.comment);	
					$('comment').update(commentOutputObj);
				}else{
					$('comment').update();
					$('comment').hide();	
				}
			}
			if(self.msg == ''){
				$('message').update();
			}else{
				self.msg = '';	
			}
		}catch(ex){
			self.doDebug(ex);
		}
	};
	/**
	 * Builds agenda display
	 * @param object agenda
	 * @param object perm
	 * @return object
	 */
	this.buildAgendaDisplay = function(agenda,perm){
		var self = Legislative;
		var out = new Array();
		if(typeof agenda.message != "undefined"){
			out[0] = Builder.node('p',[agenda.message]);	
		}else{
			out[0] = Builder.node('h3',[agenda.agenda_type+' Meeting ('+agenda.dayWeek+' '+agenda.month+' '+agenda.day+', '+agenda.year+')']);
			out[1] = Builder.node('div',{id:'agendaDetail', className:'agendaDetail'});
		}
		if(perm.add){
			$('agendaAdminDiv').show();
			$('agendaIdAdd').value = agenda.agenda_id;
		}
		if(perm.edit){
			$('agendaIdEdit').value = agenda.agenda_id;
			$('minuteAgendaId').value = agenda.agenda_id;
			$('editAgendaSpan').show();
			if(perm.del){
				$('delAgendaSpan').show();
			}
		}
		if(perm.add){
			$('addMinute').disabled = false;	
		}
		var elem = Builder.node('div',[out]);
		return elem;
	};
	/**
	 * Builds minute display
	 * @param object minute
	 * @param object perm
	 * @return object
	 */
	this.buildMinuteDisplay = function(minute,perm){
		var self = Legislative;
		//alert('building minutes');
		var out = new Array();
		out[0] = Builder.node('h3',[minute.minute_title]);
		out[1] = Builder.node('div',{className:'minuteDetail'},[
					Builder.node('div',{className:'infoLabel3'},['Members Attending:']),
					Builder.node('span',{id:'minuteAttend'},[minute.minute_attend]),
					
				]);
		out[2] = Builder.node('div',{className:'minuteDetail'},[
					
					Builder.node('div',{className:'infoLabel3'},['Members Absent:']),
					Builder.node('span',{id:'minuteAbsent'},[minute.minute_absent])
				]);
		out[3] = Builder.node('div',{id:'minuteDetail',className:'minuteDetail2'});
					
		if(perm.edit){
			$('minuteId').value = minute.minute_id;
			$('editMinuteSpan').show();
			$('editMinute').disabled = false;
			if(perm.del){
				$('delMinuteSpan').show();
				$('delMinute').disabled = false;
			}
			$('addMinute').hide();
		}
		
		var elem = Builder.node('div',[out]);
		return elem;
	};
	/**
	 * Builds comment display
	 * @param object comment
	 * @param object perm
	 * @return object
	 */
	this.buildCommentDisplay = function(comment){
		var self = Legislative;
		alert('building comments');
	};
	/**
	 * Display or hide a waiting message to user
	 * @param boolean showModal
	 */
	this.showLoading = function(showModal){
		var self = Legislative;
		if(showModal){
			new Effect.Center('popupDiv');
			$('modalDiv').show();
			$('popupDiv').show();
		}else{
			$('modalDiv').hide();
			$('popupDiv').hide();
		}
	};
	/**
	 * Agenda form meeting type other select action
	 * @param object selectList
	 * @param string typeId
	 */
	this.toggleOther = function(selectList,typeId){
		var self = Legislative;
		var index = selectList.selectedIndex;
		var val   = selectList.value;
		var text  = selectList.options[index].text;
		$(typeId).value = text;
		//alert(selectList.value);
		if(val == 'Other'){
			$(typeId).style.display = 'inline';
		}else{
			$(typeId).style.display = 'none';
		}
	}
	/**
	 * delete confirmation 
	 * @param string txt
	 * @param object curForm
	 */
	this.doDeleteConfirm = function(txt,curForm) {
		var self = Legislative;
		if(confirm('Are you sure you wish to delete this '+txt+'?')){	
			curForm.submit();
		}else{
			
			return false;
		}
	};
	this.doDeleteConfirmB = function(txt,curForm,curField) {
		var self = Legislative;
		if(confirm('Are you sure you wish to delete this '+txt+'?')){	
			if(typeof curForm.curField != 'undefined'){
				curForm.removeChild(curField);
			}
			var delObj = Builder.node('input',{type:'hidden',name:curField});
			curForm.appendChild(delObj);
			curForm.submit();
		}else{
			
			return false;
		}
	};
	/**
	 * debugging method
	 * @param string exception
	 */
	this.doDebug = function(exception){
		var self = Legislative;
		if(self.debug){
			alert(exception);	
		}
	};
};
Event.observe(window,'load', Legislative.init);

function varDump(variable, maxDeep)
{
    var deep = 0;
    var maxDeep = maxDeep || 0;

    function fetch(object, parent)
    {
        var buffer = '';
        deep++;

        for (var i in object) {
            if (parent) {
                objectPath = parent + '.' + i;
            } else {
                objectPath = i;
            }

            buffer += objectPath + ' (' + typeof object[i] + ')';

            if (typeof object[i] == 'object') {
                buffer += "\n";
                if (deep < maxDeep) {
                    buffer += fetch(object[i], objectPath);
                }
            } else if (typeof object[i] == 'function') {
                buffer += "\n";
            } else if (typeof object[i] == 'string') {
                buffer += ': "' + object[i] + "\"\n";
            } else {
                buffer += ': ' + object[i] + "\n";
            }
        }

        deep--;
        return buffer;
    }

    if (typeof variable == 'object') {
        return fetch(variable);
    }

    return '(' + typeof variable + '): ' + variable + "\n";
}
