/*
	PRF.js
	
	@job:	Portfolio Review Form
	@loc:	scripts/
*/

var PRF	=	{
	name:			"Portfolio Review Form",
	chart:			"",
	count:			1,
	startCount:		1,
	disabled:		false,
	
	fields:			Array("address", "postcode", "owner", "value", "debt", "lender", "interest", "rent"),
	classes:	{	//	Tag Classes; change these if they're provoking conflicts with pre-existing CSS
					deleteBtn:	"delButton",
					asset:		"prf_asset"
				},
	
	//	Returns TRUE if all the fields in an asset row are blank.
	rowEmpty: function(obj){
		var inputs	=	$(obj[0]).children("td").children("input");
		var input;
		var value;
		for(var i = 0; i < inputs.length; i++){
			if($(inputs[i]).val())
				return false;
		}
		return true;
	},
	
	//	Removes the asset field if it was found to be empty.
	clear: function(obj){
		if(PRF.rowEmpty(obj))
			obj.remove();
	},
	
	//	Inserts a Delete Button in the lsat cell of the designated table row.
	addDeleteBtn: function(obj, index){
		var id		=	"prf_asset_"+index+"_del";
		var cell	=	"	<td><button class=\""+PRF.classes.deleteBtn+"\" type=\"button\" name=\"" + id + "\" id=\"" + id + "\">&#x2716;</button></td>\n";
		obj.append(cell);
	},
	
	//	Removes unwanted nodes from DOM that were intended for use with script-disabled browsers.
	fix: function(){
		var review	=	($("#prf.review").length > 0);
		if(!review){
			$("#prf_assets .t_subhead").append("<td class=\"col_add\">&nbsp;</td>");
			$("#prf_assets .t_head td").attr("colspan", 9);
		}
		
		$("#prf_controls").removeClass("hidden");
		var assets	=	$(".prf_asset");
		
		//	Insert a new cell for delete button, and remove extra Asset rows
		var row;
		for(var i = 0; i < assets.length; i++){
			row	=	$("#prf_asset_"+(i+1));
			if(i > PRF.startCount && !review){
				if(PRF.rowEmpty(row))	PRF.clear(row);
				else					PRF.addDeleteBtn(row, i);
			}
			else PRF.addDeleteBtn(row, i);
		}
		
		PRF.hideCustom();
		
		//	Disable the "Submit" button until the user's agreed to the terms.
		//	*	Note: IE seems to have "issues" picking up the dispatched event the first couple times it's fired.
		//		So we'll set the event to be dispatched from the enclosing label tag's Clicked event.
		var version	=	Number(jQuery.browser.version);
		if(jQuery.browser.msie)	$("#prf_agree_h").click(PRF.consent);
		else					$("#prf_agree").change(PRF.consent);
		
		//	Update the Submit button based on the checkbox's initial value.
		PRF.consent();
	},
	
		//	Conceals custom answer fields until they're needed
		//	*	E.g., from "Other (Please specify...)" type options
		hideCustom: function(){
			var customs	=	Array(
				Array("prf_relation", "Other"),
				Array("prf_strategy", "Other (please specify)"),
				Array("prf_invest_pricerange", "Exact (please specify)")
			);
			
			var fieldID, field, custom;
			for(var i = 0; i < customs.length; i++){
				fieldID	=	customs[i][0];
				field	=	$("#" + fieldID);
				custom	=	$("#" + fieldID + "_o");
				
				custom.attr("title", customs[i][1]);
				if(custom.attr("title") != field.val())
					custom.hide();
				
				field.change(function(val){
					var target	=	$(val.currentTarget);
					var otherID	=	target.attr("id") + "_o";
					var other	=	$("#" + otherID);
					
					if(target.val() != other.attr("title"))
						other.hide();
					else{
						other.show();
						other.focus();
					}
				});
			}
		},
		
		//	Toggles the Submit button based on whether or not the user's chosen to give their consent or not.
		consent: function(val){
			var agree	=	$("#prf_agree");
			$("#prf_submit").attr("disabled", (agree[0].checked ? "" : "disabled"));
		},
	
	//	Returns an XHTML string composed of a new table row with asset fields.
	row: function(index){
		var out	 	=	"\n";
		var name;
		out		+=	"		<tr class=\""+PRF.classes.asset+"\" id=\"prf_asset_" + index + "\">\n";
		for(var i = 0; i < PRF.fields.length; i++){
			name	=	PRF.fields[i];
			out	+=	"			<td><input type=\"text\" value=\"\"	class=\"prf_asset_"+name+"\"	name=\"prf_asset_"	+	index	+ "_"+name+"\"	id=\"prf_asset_"	+	index	+	"_"+name+"\" /></td>\n"; }
		out		+=	"			<td><button class=\""+PRF.classes.deleteBtn+"\" type=\"button\" name=\"prf_asset_"					+	index	+ "_del\" id=\"prf_asset_"			+	index	+	"_del\">&#x2716;</button></td>\n";
		out		+=	"		</tr>\n";
		return out;
	},
	
	
	//	Called when Asset stack has been modified
	update: function(){
		var assets	=	$("#prf ."+PRF.classes.asset);
		var count	=	assets.length;
		var row, rowID, index;
		
		var field, fieldID, delBtn;
		for(var i = 0; i < count; i++){
			row		=	$(assets[i]);
			index	=	i+1;
			rowID	=	"prf_asset_"+index;
			row.attr("id", rowID);
			
			for(var f = 0; f < PRF.fields.length; f++){
				$("#"+rowID+" .prf_asset_"+PRF.fields[f]).each(function(num, node){
					fieldID	=	rowID+"_"+PRF.fields[f];
					$(node).attr("id", fieldID);
					$(node).attr("name", fieldID);
				});
			}
			delBtn	=	$("#"+rowID+" ."+PRF.classes.deleteBtn);
			delBtn.attr("id", rowID+"_del");
			delBtn.attr("name", rowID+"_del");
			
			//	If we're down to the last row, don't bind any event listeners, and disable the button for the user
			if(count < 2){
				delBtn.unbind("click", PRF.remove);
				delBtn.attr("disabled", "disabled");
			}
			
			//	Otherwise, bind the handler normally
			else{
				delBtn.bind("click", PRF.remove);
				delBtn.attr("disabled", "");
			}
		}
	},
	
	
	//	Adds a new Asset row to the Assets table.
	add: function(obj){
		$("#prf_controls").before(function(){ return PRF.row(PRF.count+1); });
		$("#prf_asset_"+(PRF.count+1)+"_del").click(PRF.remove);
		PRF.update();
	},
	
	
	//	Deletes a row from the assets table.
	remove: function(obj){
		var target	=	$(obj).attr("target");
		var cell	=	$(target).parent();	//	Enclosing TD
		var row		=	cell.parent();		//	Top-level Table Row
		row.remove();
		PRF.update();
	},
	
	
	//	Collectively toggles a column of checkboxes
	//	*	Triggered from the onClick handler of some column header labels.
	toggleColumn: function(obj, offset){
		var target	=	$(obj).attr("target");
		var cell	=	$(target).parent();	//	Enclosing TD
		var row		=	cell.parent();		//	Top-level Table Row
		
		//	Declare the master checkbox status
		var status	=	$(target).attr("checked");
			status	=	(status == undefined || status == "false") ? true : false;
		var setVal	=	status == true ? "false" : "true";
		$(target).attr("checked", status);
		
		
		var index	=	(typeof(offset) == "undefined") ? cell.prevAll("td").length : offset;
		
		var table	=	row.parent();			//	Containing Table Element
		var rows	=	table.children("tr");	//	Total number of rows
		var checkbox, checked, cells;
		for(var i = 0; i < rows.length; i++){
			row			=	rows[i];
			cells		=	$($(row).children("td"));
			target		=	$(cells[index]);
			
			if(target.length > 0)
				target.children("input[type='checkbox']").attr("checked", status);
		}
		return false;
	},
	
	//	Configures Event Listeners on DOM
	//	*	Note: This excludes the onClick handlers for the Asset Row's delete buttons. These are controlled from
	//		the update() method to reapply listeners with each change of the Assets stack.
	applyListeners: function(){
		$("#prf_asset_add").click(PRF.add);
		$("label[for='prf_insure_life_a1']").click(PRF.toggleColumn);
		$("label[for='prf_insure_life_a2']").click(PRF.toggleColumn);
	},
	
	//	Scrolls the window to the specified DOM element passed to the PRF.jumpTo property.
	scrollTarget:		null,
	shouldScroll:		true,
	
	checkScroll: function(){
		if(PRF.shouldScroll && typeof(PRF.scrollTarget) != "undefined"){
			setTimeout(function(){$(("#" + PRF.scrollTarget)).scrollTo(1000);}, 1500);
		}
	},
	
	
	disable: function(){
		$("input, textarea, select").attr("disabled", "disabled");
	},
	
	
	addPrint: function(){
		$("#prf").prepend('<a class="prf_print" href="#print"><span>Print</span></a>');
		$("#prf .prf_print").click(function(){
			window.print();
			return false;
		});
	},
	
	
	//	Bootstrap Function : Triggered from DOM's Loaded handler.
	init: function(){
		if($("#prf").hasClass("review") == false){
			PRF.fix();
			PRF.applyListeners();
			PRF.update();
			PRF.checkScroll();
		}
		else{
			PRF.addPrint();
			PRF.disable();
		}
	}
}

//	jQuery scrollTo method. Credit goes to Aaron Schmidt.
//	*	URL: http://www.learningjquery.com/2007/09/animated-scrolling-with-jquery-12/comment-page-1#comment-13214
jQuery.fn.extend({
	scrollTo : function(speed, easing){
		return this.each(function(){
			var targetOffset = $(this).offset().top;
			$('html,body').animate({scrollTop: targetOffset}, speed, easing);
		});
	}
});

$(document).ready(function(){
	PRF.init();
});
