var SCRIPT_NAME = 'process.projectplanner.php';
var COOKIE_NAME = 'STORM_PROJECT_PLANNER_PLAN';

function DEBUG(str){
	//alert(str);
}

/*************************
 * HELPER BITS AND PIECES
 *************************/


jQuery.fn.delay = function(time,func){
    return this.each(function(){
        setTimeout(func,time);
    });
};


function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

function Querystring() {
	this.params = {};
	
	var qs = location.search.substring(1, location.search.length);
	if (qs.length == 0) return;

	var args = qs.split('&');
	
	for (var i = 0; i < args.length; i++) {
		var arg = args[i].split('=');
		var name = arg[0];
		var value = (arg.length==2) ? arg[1] : name;
		
		this.params[name] = value;
	}
}

Querystring.prototype.get = function(key) {
	return this.params[key];
}

/*************************
 * LET'S GET STARTED
 *************************/

$(document).ready(
	function(){
		var step = parseInt($('#step').val());
		
		// Start, Navigate, Finish
		$('#btnNext').click(
			function(){
				incrementStep();
				ajax_save();
			}
		);
		$('#btnPrev').click(
			function(){
				decrementStep();	
			}
		);
		$('#btnGetStarted').click(
			function(){
				incrementStep();
				ajax_newplan();
			}
		);
		$('#btnFinish').click(
			function(){
				ajax_submit();
			}
		);
		
		// Save + Resume
		$('#btnSave').click(
			function(){ 
				if(validateSave()){
					ajax_save();
					ajax_savedetails();
				}
			}
		);
		$('#btnCancelSave').click(
			function(){ 
				$('#pp_buttons').show();
				setActiveStep(parseInt($('#step').val()));
			}
		);
		$('#btnResume').click(
			function(){ 
				if(validateResume()){
					ajax_loadplan();
				};
			}
		);
		$('#btnCancelResume').click(
			function(){ 
				$('#pp_buttons').show();
				setActiveStep(0);
			}
		);
		
		// Success Messages
		$('#btnSuccessBack').click(
			function(){ 
				$('#pp_buttons').show();
				setActiveStep(parseInt($('#step').val()));
			}
		);
		
		// Loaded incorrect plan, start again
		$('#btnStartNew').click(
			function(){ 
				ajax_startnew();
			}
		);
		$('#btnStartSecond').click(
			function(){
				ajax_startsecond();
			}
		);
		
		// Main nav
		$('#pp_progress ol li').each(
			function(i){
				$(this).click(
					function(){
						setActiveStep(i);
					}
				);
			}
		);
		
		$('#pp_planner input:text, #pp_planner input:password').addClass('text');
		$('#pp_planner input:text, #pp_planner textarea, #pp_planner input:password')
			.bind('focus', function(){ $(this).addClass('active_text'); })
			.bind('blur', function(){ $(this).removeClass('active_text'); });
			
		$('#pp_planner textarea').autoResize({
				animateDuration : 200,
				extraSpace : 30
		}).trigger('change');
			
		$('#pp_help div').hide();	
		$('a.helptip').each(
			function(){
				$(this).click(
					function(){
						showHelpTip($(this).attr('rel'));
					}
				);
			}
		);
		
		
		// setup the project planner
		setActiveStep(step);
		
	}
);

function incrementStep(){
	setActiveStep(parseInt($('#step').val()) + 1);
}

function decrementStep(){
	setActiveStep(parseInt($('#step').val()) - 1);
}

function setActiveStep(step){
	setMenuItem(step);
	setContentPanel(step);
	setButtons(step);
	showHelpTip('step_' + step);
	$('#step').val(step);
}

function setMenuItem(step){
	$('#pp_progress ol li').removeClass('active');
	$('#pp_progress ol li').eq(step).addClass('active');
}

function setContentPanel(step){
	$('#pp_planner fieldset').hide();
	$('#pp_planner fieldset').eq(step).fadeIn(250);
}

function setButtons(step){
	$('#pp_buttons').show();
	
	switch(step){
		case 0:
			
			//This is the first screen
			hideButtons();

			$('#btnGetStarted').show();
			
			if(!isStorm()){
				$('#btnSaveResume').show();
				$('#btnSaveResume').text('Resume saved plan');
				$('#btnSaveResume').unbind('click');
				$('#btnSaveResume').click(
					function(){
						showResumePlan();
					}
				);
			}
			
		break;	
		case 9:
			//This is the last screen
			hideButtons();
			
			$('#btnPrev').show();
			
			if(!isStorm()){
				$('#btnFinish').show();
				$('#btnSaveResume').show();
			}
		break;
		default:
			hideButtons();
			if(!isStorm()) $('#btnSaveResume').show();
			$('#btnNext').show();
			$('#btnPrev').show();
		
			displaySaveButton();
		break;
	}
}

function displaySaveButton(){
	if(!isStorm()){
		DEBUG('display save button');
		if($('#last_saved').val() == '0' || $('#isanonymous').val() == '1'){
			$('#btnSaveResume').text('Save my plan');
			$('#btnSaveResume').unbind('click');
			$('#btnSaveResume').click(
				function(){
					showSavePlan();
				}
			);
		}
		else
		{
			$('#btnSaveResume').text('Autosaved: ' + $('#last_saved').val());
			$('#btnSaveResume').unbind('click');
		}
	}
}

function hideButtons(){
	$('#pp_buttons a, #pp_buttons input').hide();
}


function showSavePlan(){
	$('#pp_buttons').hide();
	$('#pp_planner fieldset').hide();
	$('#pp_planner fieldset#save_plan').fadeIn(250);
	
	$('#pp_planner fieldset#save_plan .text').bind('keypress', 
		function(e) {
			var code = e.keyCode || e.which;
			if(code == 13) {
				$('#btnSave').click();
			}
		});
}

function showResumePlan(){
	$('#pp_buttons').hide();
	$('#pp_planner fieldset').hide();
	$('#pp_planner fieldset#resume_plan').fadeIn(250);
	
	$('#pp_planner fieldset#resume_plan .text').bind('keypress', 
		function(e) {
			var code = e.keyCode || e.which;
			if(code == 13) {
				$('#btnResume').click();
			}
		});
}

function showSuccess(msg){
	$('#pp_buttons').hide();
	$('#pp_planner fieldset').hide();
	$('#pp_planner fieldset#success_messages .successmessage').hide();
	$('#pp_planner fieldset#success_messages').show();
	$('#pp_planner fieldset#success_messages #success_' + msg).fadeIn(250);
}




function showHelpTip(ctrl){
	$('#pp_help div').hide();
	$('#pp_help #help_' + ctrl).show();
}

function isStorm(){
	return $('#step').hasClass('readonly');
}

/************************
 * AJAX STATUS MSGS
 ************************/

function showAjaxSuccess(msg){
	$('#messages div').hide();
	$('#success').html(msg);
	$('#success').show();
	$('#success').delay(5000, function(){ $('#success').fadeOut(2000); });
}

function showAjaxError(msg){
	$('#messages div').hide();
	$('#error').html(msg);
	$('#error').show();
	$('#error').delay(6000, function(){ $('#error').fadeOut(2000); });
}

function startLoading(text){
	$('#messages div').hide();
	if(text != null){
		$('#loading').text(text);
	}
	else
	{
		$('#loading').text('Please wait. Loading...');
	}
	
	$('#loading').show();
}

function finishLoading(){
	$('#loading').fadeOut(1200);
}

/**************************
 * VALIDATION FUNCTIONS
 **************************/

function validateSave(){

	var email = $('#txtSave_Email').val();
	var pass  = $('#txtSave_Password').val();
	var pass2 = $('#txtSave_Password2').val();
	var errors = new Array();
	
	if(!validEmail(email)){
		errors.push("The email address you entered is not valid");
	}
	
	if(pass.length <= 5){
		errors.push("Your password should be at least 6 characters");
	}
	else
	{
		if(pass != pass2){
			errors.push("The two passwords do not match");
		}
	}
	
	if(errors.length > 0){
		showErrors('save_error', errors);
		return false;
	}

	return true;
}


function validateResume(){

	var email = $('#txtResume_Email').val();
	var pass  = $('#txtResume_Password').val();
	var errors = new Array();
	
	if(!validEmail(email)){
		errors.push("The email address you entered is not valid");
	}
	
	if(pass.length <= 5){
		errors.push("Your password should be at least 6 characters");
	}
	
	if(errors.length > 0){
		showErrors('resume_error', errors);
		return false;
	}

	return true;
}


function validEmail(email){
	var r = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i;
	if(r.test(email)){
		return true;
	}
	return false;
}

function showErrors(ctrl, errors){
	$('#' + ctrl).empty().append('<ul><li>' + errors.join('</li><li>') + '</li></ul>');
}


/**************************
 * AJAX FUNCTIONS
 **************************/
 
function ajax_newplan(){
	startLoading();
	var q = new Querystring();
	if(q.get('plan_key') == null){
		var ck = readCookie(COOKIE_NAME);
		if(ck == null){
			DEBUG('INSERTING A NEW PLAN');
			var referer = document.referrer;
			$.post(SCRIPT_NAME, 'action=new_plan&referer='+referer,function(data){ finishLoading(); checkForError(data); });
		}
		else
		{
			DEBUG("LOADING FOR ANON with key=" + ck);
			$.post(SCRIPT_NAME, 'action=load_for_anon&cookie_key='+ck,function(data){ finishLoading(); finishLoadAnon(populateForm(data)); });
		}
	}
	else
	{
		// Load plan for storm to review, disable inputs and change button meanings.
		DEBUG("LOADING PLAN FOR STORM key="+ q.get('plan_key'));
		$.post(SCRIPT_NAME, 'action=load_for_storm&cookie_key='+q.get('plan_key'),
			function(data){ 
				finishLoading();
			
				var error = getError(data);
				
				if(error == null){
					finishLoadForStorm(populateForm(data)); 
				}
				else{
					showAjaxError("Error loading plan for review: "+ error);
				}
			}
		);
	}
}

function ajax_save(){
	
	var data = new Array();
	data.push('action=update_plan');
	data.push('cookie_key='+readCookie(COOKIE_NAME));
	data.push('stepnum='+$('#step').val());
	
	$('#pp_planner input:text, #pp_planner select, #pp_planner textarea').each(
		function(){
			data.push($(this).attr("id") + '=' + $(this).val());
		}
	);
	
	$('#pp_planner input:checkbox:checked').each(
		function(){
			data.push($(this).attr("id") + '=1');
		}
	);
	
	DEBUG(data.join('&'));
	
	$.post(SCRIPT_NAME, data.join('&'), function(data){ checkForError(data); });
	
}

function ajax_loadplan(){
	startLoading();
	
	var data = new Array();
	data.push('action=load_for_user');
	data.push('email=' + $('#txtResume_Email').val());
	data.push('password=' + $('#txtResume_Password').val());
	
	$.post(SCRIPT_NAME, data.join('&'), function(data){ finishLoading(); finishResumePlan(getError(data), data); });
}

function ajax_savedetails(){
	startLoading("Saving. Please Wait.");
	
	var data = new Array();
	data.push('action=convert_for_user');
	data.push('cookie_key='+readCookie(COOKIE_NAME));
	data.push('email=' + $('#txtSave_Email').val());
	data.push('password=' + $('#txtSave_Password').val());
	data.push('can_contact=' + $('#chkSave_StormContact').attr("checked"));
	
	$.post(SCRIPT_NAME, data.join('&'), function(data){ 
											finishLoading(); 
											$('#isanonymous').val('0'); // Not anonymous anymore
											finishSavePlan(getError(data)); 
										}
									);
}


function ajax_startnew(){
	startLoading();
	
	// Loaded an unwanted anonymous plan, so discard and start a new one
	var data = new Array();
	data.push('action=discard_anon_plan');
	data.push('cookie_key='+readCookie(COOKIE_NAME));

	$.post(SCRIPT_NAME, data.join('&'), function(data){ finishLoading(); finishStartNew(populateForm(data)); });
}

function ajax_startsecond(){
	startLoading();
	
	// Loaded a saved plan, but want to start a new one
	$.post(SCRIPT_NAME, 'action=start_second_plan',function(data){ finishLoading(); finishStartNew(populateForm(data)); });

}

function ajax_submit(){
	startLoading("Submitting plan. Please wait.");
	var data = new Array();
	data.push('action=submit_plan');
	data.push('cookie_key='+readCookie(COOKIE_NAME));
	
	$.post(SCRIPT_NAME, data.join('&'), function(data){ finishLoading(); finishSubmitPlan(getError(data)); });
}


/**************************
 * AJAX CALLBACKS
 **************************/

function populateForm(strplan){

	DEBUG(strplan);

	var plan;
	
	if(typeof(strplan) == 'string'){
		plan = eval('(' + strplan + ')');
	}
	else{
		plan = strplan;
	}

	$('#isanonymous').val(plan.isanonymous);
	if(plan.isanonymous == '0'){
		$('#last_saved').val(plan.last_saved);
	}
	displaySaveButton();

	for (field in plan.data){

		var ctrl = field.substring(3,0).toLowerCase();
		if(ctrl == 'txt' || ctrl == 'ddl'){
			$("#" + field).val(plan.data[field]);
		}
		else if(ctrl == 'chk')
		{
			if(plan.data[field] == 1){
				$('#' + field).attr('checked', true);
			}
		}
	}
	
	return null;
}

function finishSavePlan(error){
	if(error == null){
		showAjaxSuccess("Your plan has been saved successfully");
		showSuccess('saved');
	}
	else{
		showErrors('save_error', [error]);
	}
}

function finishResumePlan(error, data){
	if(error == null){
		var plan = eval('(' + data + ')');
		populateForm(plan);
		setActiveStep(plan.max_step);
		showAjaxSuccess("Your plan has been loaded successfully");
	}
	else{
		showErrors('resume_error', ['We could not find a project plan for that email/password combination.']);
	}
}

function finishLoadAnon(ignore){
	if($('#isanonymous').val() == '1'){
		$('#loaded_anonymous').show();
	}
	else{
		$('#loaded_saved_auto').show();
	}
}

function finishStartNew(ignore){
	$('#loaded_anonymous').hide();
	$('#loaded_saved_auto').hide();
	$('#isanonymous').val('1');
	$('#last_saved').val('0');
	displaySaveButton();
}

function finishSubmitPlan(error){
	if(error == null){
		
		$('#pp_buttons').hide();
		$('#pp_planner fieldset').hide();
		$('#pp_planner fieldset#next_steps').fadeIn(250);
		
		showAjaxSuccess("Thank you! Your plan has been submitted successfully");
	}
	else{
		showErrors('submit_error', [error]);
	}
}

function finishLoadForStorm(ignore){
	
	// There are twice as many textareas as you think cos the autoresize script clones them
	$('#pp_planner textarea').each(
		function(){
			if($(this) != null && $(this).attr('id') != '' && $(this).attr('id') != null){
				$(this).replaceWith('<span class="textarea_replacement">' + $(this).val().replace(new RegExp( "\\n", "g" ), "<br />") + '</span>');
			}
			else
			{
				$(this).replaceWith('');
			}
			//alert('call keydown on' + $(this).attr("id"));
			//$(this).keydown(); 
			//$(this).trigger('change');
		}
	);
	

	
	$('#pp_planner input, #pp_planner select').attr('disabled', true).addClass('readonly');
	

	
	$('#btnSaveResume').hide();
	$('#btnNext').unbind('click');
	$('#btnNext').click(
		function(){
			incrementStep();
		}
	);
}

function checkForError(strdata){
	var data = eval('(' + strdata + ')');
	if(data.iserror == 1){
		showAjaxError(data.message);
	}
	else
	{
		if($('#isanonymous').val() == '0'){
			$('#last_saved').val(data.response_date)
			displaySaveButton();
		}
	}
}

function getError(strdata){
	try{
		DEBUG(strdata);
		var data = eval('(' + strdata + ')');
		if(data.iserror == 1){
			return data.message;
		}
		return null;
	}
	catch(err){
		return "An internal error occured: " + err;
	}
}
