if (typeof CrmFuse == 'undefined') CrmFuse = {};
if (typeof CrmFuse.UriManager == 'undefined') CrmFuse.UriManager = {};

CrmFuse.ready = false;
CrmFuse.formLoaded = false;

function _navigate(hash) {
	if (!CrmFuse.ready) {
		setTimeout(function(){
			_navigate(hash);
		}, 100);
		return;
	}

	if (CrmFuse.UriManager.getHash().length > 2) {
	 	return;
	}

	top.location.replace(top.location.href + '#' + hash);	//1st load history issue
}

function _delayedLoad() {
	if (!CrmFuse.formLoaded) {
		setTimeout(function(){
			_delayedLoad();
		}, 100);
		return;
	}
	setTimeout(CrmFuse.loadFormData, 1000);
}


jQuery(document).ready(function() {
	jQuery('#ajax-loading')
		.ajaxStart(function(){
			jQuery(this).show();
		})
		.ajaxError(function(){
			jQuery(this).hide();
		})
		.ajaxStop(function(){
			jQuery(this).hide();
		});
		
	jQuery(document).click(function(e){
		if (e.target.type == 'radio') {
			CrmFuse._calculate();
		}
	});
	
	CrmFuse.contentArea = jQuery('#content-placeholder');
	CrmFuse.formHeader = jQuery('<div class="form-header"></div>');
	CrmFuse.contentArea.before(CrmFuse.formHeader);
	
	CrmFuse.messageArea = jQuery('#messages-placeholder');
	CrmFuse.userPages = jQuery('<div class="user-pages"></div>');
	CrmFuse.contentArea.after(CrmFuse.userPages);
	
	CrmFuse.formButtons = null;
	CrmFuse._stepsData = {};
	CrmFuse._pages = {};
	
	CrmFuse._autoSaveInt = null;
	
	CrmFuse.showFormButtons = function() {
		if (CrmFuse.formButtons == null) {
			CrmFuse.formButtons = jQuery('<div class="form_buttons">'+
				'<input type="button" class="save_draft" name="save_draft" value="Save draft" /> ' + 
				'<input type="button" class="complete_document" name="complete_document" value="Complete document and generate PDF" />' +
				'</div>');
			CrmFuse.formButtons.insertAfter(CrmFuse.contentArea)
				.clone().insertBefore(CrmFuse.contentArea);
			jQuery('input.save_draft').click(CrmFuse.saveDraft);
			jQuery('input.complete_document').click(CrmFuse.completeDocument);
		}
		jQuery('.form_buttons').show();
	};

	CrmFuse._getPageByStepId = function (stepId) {
		for (var i in CrmFuse._pages) {
			if (CrmFuse._pages[i].stepId == stepId) {
				return CrmFuse._pages[i];
			}
		}
		return null;
	};
	
	CrmFuse._getValues = function() {
		for (var i in CrmFuse._pages) {
			CrmFuse._stepsData[CrmFuse._pages[i].stepId] = jQuery(':input', CrmFuse._pages[i].element).serialize();
		}
		return CrmFuse._stepsData;
	};
	
	CrmFuse._getFormState = function() {
		var value = jQuery('.form-status').text();
		return value.toLowerCase();
	};
	
	CrmFuse.saveDraft = function() {
		CrmFuse._saveForm('draft');
	};
	
	CrmFuse.completeDocument = function() {
		clearInterval(CrmFuse._autoSaveInt);
		CrmFuse._saveForm('complete');
	};
	
	CrmFuse._saveForm = function(action) {
		jQuery.post('/CrmFuse/form.php?save='+action,
				CrmFuse._getValues(),
				function(response) {
					CrmFuse.formHeader.html(response);
					CrmFuse.updateBreadCrumb();
					if (action == 'complete') {
						jQuery('#msg-mask').show()
						var sm = jQuery('#system-message')
						sm.find('span').text('Document Completed').end().fadeIn('slow')

						setTimeout(function(){
							sm.fadeOut('slow', function(){
								jQuery('#msg-mask').hide()
								var pdfLink = jQuery('#download_pdf_link').attr('href')
								if (typeof pdfLink != 'undefined') {
									top.location.href = pdfLink
								}
							})
						}, 3000)
					}
				}
		);
	};
	
	CrmFuse.updateBreadCrumb = function() {
		setTimeout(function(){
			jQuery('div.form_breadcrumbs span.active').text(jQuery('div:visible li.actli', CrmFuse.contentArea).text())
		}, 10);
	};

	CrmFuse._autoSavePeriod = 30000;
	CrmFuse.autoSave = function() {
		if (CrmFuse._getFormState() == 'in progress' &&
			CrmFuse.ready && CrmFuse.formLoaded) {
			CrmFuse._saveForm('auto');
		}
	}	
	
	CrmFuse._restoreStepData = function() {
		var stepId = CrmFuse.UriManager.getHash().split('/')[1];

		if (typeof CrmFuse._stepsData[stepId] != 'undefined') {
			var stepContainer = CrmFuse._getPageByStepId(stepId);
			var data = CrmFuse._stepsData[stepId];
			if (stepContainer) {
				CrmFuse._processDataLoading(data.split('&'), stepContainer.element)
			}
			
/*			if (jQuery('div:visible input[@name=num_of_factors]', CrmFuse.contentArea).length > 0) {
				CrmFuse._calculate()
			}*/
		}
	}
	
	CrmFuse._processDataLoading = function(fields, container) {
		var i = 0;
		
		(function() {
			var j;
			
			for (j = i; (j < fields.length && (j - 10 < i)); j++) {
		 		var pair = fields[j].split('=');
		 		var inp = jQuery(':input[@name="' + pair[0] + '"]', container);
		 		if (inp.attr('type')) {
			 		switch (inp.attr('type').toLowerCase()) {
			 			case 'radio':
		 					jQuery(':input[@name="' + pair[0] + '"][@value="' + pair[1] + '"]', container)
		 						.attr('checked', 'checked');
		 					break;
		 				
			 			case 'checkbox':
			 				break;
		 			
			 			case 'text':
			 			default:
		 					inp.val(decodeURIComponent(pair[1]).replace(/\+/g, ' '));
		 					break;
	 				}
 				}
			}
			
			i = j;
			if (j < fields.length) {
				setTimeout(arguments.callee, 0);
			}
		})();
	}
	
	CrmFuse._calculate = function() {
		var numFacts = jQuery('div:visible input[@name=num_of_factors]', CrmFuse.contentArea);
		var avgFacts = jQuery('div:visible input[@name=avg_of_factors]', CrmFuse.contentArea);
		
		if (numFacts.length + avgFacts.length < 2) {
			return
		}

		var count = 0;
		var sum = 0;
		
		var rows = jQuery('div:visible table.formtable tr', CrmFuse.contentArea);
		for (var i=0; i < rows.length; i++) {
			var inputs = jQuery('input[@type=radio][@checked]', rows[i]).serialize().split('&');

			if (inputs.length == 2) {
				count++;
				var weight = inputs[0].split('=')[1];
				var value = inputs[1].split('=')[1] - 1;
				var product = isNaN(weight*value) ? 0 : weight*value;
				sum += product;

				jQuery('input.calculated', rows[i]).val(product);
			}
		};
			
		numFacts.val(count);
		var avg = Math.floor((sum/count)*100)
		if (isNaN(avg)) avg = 0;
		avg = avg/100;
		avgFacts.val(CrmFuse._toDec(avg)); //leaving 2 digits in fractional part

		setTimeout(function(){CrmFuse._calculateSummaryFields(avg*count)}, 2);
	}
	
	CrmFuse._calculateSummaryFields = function(avgValue) {
		// calculations for step Summary
		avgValue = CrmFuse._toDec(avgValue);
		var stepId = CrmFuse.UriManager.getHash().split('/')[1];
		var stepContainer = CrmFuse._getPageByStepId('step-summary');

		if (stepContainer == null || typeof (stepContainer) == 'undefined') { //step isn't loaded yet, changing in loaded data
			if (typeof CrmFuse._stepsData['step-summary'] == 'undefined') {
				CrmFuse._stepsData['step-summary'] = '';
			}
			
			var data = CrmFuse._stepsData['step-summary'].split('&');
			var found1 = false, found2 = false, total=0, overallIndex=-1;
			for (var i=0; i < data.length; i++) {
				var pair = data[i].split('=');
				if (pair[0] == stepId+'_value') {
					data[i] = stepId+'_value=' + encodeURIComponent(avgValue);
					found1 = true;
				} else if (pair[0] == stepId+'_description') {
					data[i] = stepId+'_description=' + encodeURIComponent(CrmFuse._getValueDescription(avgValue));
					found2 = true;
				}

				if (pair[0].match(/_value$/)) {
					var tp = parseFloat(pair[1]);
					if (!isNaN(tp))	total += tp;
				}
				if (pair[0] == 'overall_risk') {
					if (overallIndex < 0) {
						overallIndex = i;
					} else {
						delete(data[i]); //removing duplicates
					}
				}
			}

			if (!found1) {
				data.push(stepId+'_value=' + encodeURIComponent(avgValue));
			}
			if (!found2) {
				data.push(stepId+'_description=' + encodeURIComponent(CrmFuse._getValueDescription(avgValue)));
			}
			if (overallIndex < 0) {
				data.push('overall_risk='+(CrmFuse._toDec(total/5)));
			} else {
				data[overallIndex] = 'overall_risk='+(CrmFuse._toDec(total/5));
			}
				
			CrmFuse._stepsData['step-summary'] = data.join('&');
		} else {
			jQuery('#'+stepId+'_value').val(avgValue);
			jQuery('#'+stepId+'_description').val(CrmFuse._getValueDescription(avgValue));
			CrmFuse._updateSummaryPage();
		}
	}
	
	CrmFuse._updateSummaryPage = function() {
		var inputs = jQuery('.summary-table .calct');
		var total = 0;
		
		for(var i=0; i<inputs.length; i++) {
			var v1 = parseFloat(jQuery(inputs[i]).val());
			if (!isNaN(v1)) {
				total += v1;
			}
		}
		if (isNaN(total)) total = 0;

		jQuery('#overall_risk').val(CrmFuse._toDec(total/5));
	}
	
	CrmFuse._toDec = function(floatVal) {
		var p = floatVal.toString().split('.');
		return p.length == 2 ? (p[0] + '.' + (p[1].substr(0, 2))) : floatVal;
	}
	
	CrmFuse._getValueDescription = function(val) {
		if (val <= 20) return 'Low';
		if (val <= 50 ) return 'Medium';
		return 'High';
	}

	CrmFuse._dataReady = false;
	CrmFuse.loadFormData = function() {
		jQuery.post('/CrmFuse/form.php?load', {}, function(response) {
			var data = eval("(" + response + ")");
			if (data.steps) {
				CrmFuse._stepsData = data.steps;
				CrmFuse._restoreStepData();	//current step
				CrmFuse._dataReady = true;
			}
		});
	}
	
	CrmFuse.switchToPages = function() {
		CrmFuse.userPages.show();
		CrmFuse.formHeader.hide();
		CrmFuse.contentArea.hide();
		clearInterval(CrmFuse._autoSaveInt);
		CrmFuse._autoSaveInt = null;
	}

	CrmFuse.switchToForms = function() {
		CrmFuse.userPages.hide();
		CrmFuse.formHeader.show();
		CrmFuse.contentArea.show();
		if (CrmFuse._autoSaveInt == null) {
			CrmFuse._autoSaveInt = setInterval(CrmFuse.autoSave, CrmFuse._autoSavePeriod);
		}
	}
	
	CrmFuse.loadPage = function(page) {
		if (page == '') window.location.reload();

		var id = 'page-'+page.replace('/', '_');
		var parts = page.split('/');
		
		CrmFuse.messageArea.empty();
		
		if (parts.length && (parts[0] == 'user' || parts[0] == 'password' || parts[0] == 'start' || parts[0] == 'dashboard')) {
			CrmFuse.userPages.load('/CrmFuse/page.php', {pageId: page});
			if (CrmFuse.formButtons) jQuery('.form_buttons').hide();
			CrmFuse.switchToPages();
		} else {
			CrmFuse.switchToForms();
			var loaded = true;
			if (typeof CrmFuse._pages[page] == 'undefined') {
				var newPage = jQuery('<div id="'+id+'"></div>');
				CrmFuse.contentArea.append(newPage);
				CrmFuse._pages[page] = {'id': id, element: newPage, stepId: parts.length == 2 ? parts[1] : ''};
				newPage.load('/CrmFuse/page.php', {pageId: page}, function() {
					setTimeout(CrmFuse._restoreStepData, 1);
					jQuery('input.calculated').keypress(function(evt) {
						evt.stopPropagation();
						return false
					})
				});
				loaded = false;
				CrmFuse.formHeader.load(
					'/CrmFuse/form.php?header=1&r=' + new Date().getTime() + '&p='+parts[1]//, 
					//CrmFuse.updateBreadCrumb
				);
			}
			
			//hiding all, but active
			jQuery('div', CrmFuse.contentArea).hide().css('visibility','hidden');
			jQuery('#'+id).show().css('visibility','visible');
			CrmFuse.showFormButtons();
			CrmFuse.formLoaded = true;
			if (loaded) CrmFuse.updateBreadCrumb();
		}
	};
	
	CrmFuse._authQueryActive = false
	CrmFuse.switchLoginItem = function() {
		if (CrmFuse._authQueryActive) return
		CrmFuse._authQueryActive = true
		
		jQuery.get('/CrmFuse/auth.php?islogged=1', function(r) {
			var response = eval("(" + r + ")")
			var text = 'Login'
			var href = '/dashboard'
			
			if (response.isLogged) {
				text = 'Logout'
				href = '/CrmFuse/logout.php'
			}
			
			jQuery('#login_logout_link').text(text).attr('href', href)
			jQuery('#dashboard_link').css('display', '')
			CrmFuse._authQueryActive = false
		})
	}
	
	var UriManager = {
		currentHash: '',
		_listeners: [],
		_interval: null,
		
		init: function() {
			this.currentHash = this.getHash();
			if (this.currentHash != '') {
				CrmFuse.loadPage(this.currentHash);
			}
			
			var self = this;
			this._interval = setInterval(function(){
				self._poll.call(self);
			}, 100)
		},
		
		pause: function() {
			clearInterval(this._interval);
		},
		
		resume: function() {
			this.init();
		},
		
		addListener: function(fn) {
			this._listeners.push(fn);
		},
		
		_poll: function() {
			var newHash = this.getHash();
			if (this.currentHash != newHash) {
				this.currentHash = newHash;

				//notifying listeners
				for (var i=0; i<this._listeners.length; i++) {
					this._listeners[i](newHash);
				}
			}
		},
		
		getHash: function() {
			var h = top.location.hash;
			return h.length ? h.substr(1) : h;
		},
		
		setHash: function(hash) {
			top.location.hash = hash;
		}
	};
	
	CrmFuse.UriManager = UriManager;
	CrmFuse.UriManager.init();
	
	CrmFuse.UriManager.addListener(function(hash){
		// distinct pages from form steps
		CrmFuse.loadPage(hash);
	});
	
	CrmFuse.ajaxResponse = function(response) {
		response = eval("(" + response + ")");

		if (response.success) {
			CrmFuse.UriManager.setHash(response.redirectUrl);
			CrmFuse.messageArea.hide().empty();
			if (response.redirectUrl.match(/form/)) {
			 	_delayedLoad();
			}
		} else if (response.message){
			CrmFuse.messageArea.html(response.message).show();
		}
	}
	
	CrmFuse.login = function() {
		var email = jQuery('#login-email').val();
		var password = jQuery('#login-password').val();	
		jQuery.post('/CrmFuse/auth.php', {'email': email, 'password': password}, 
			function(r) {
				CrmFuse.ajaxResponse(r)
				var response = eval("(" + r + ")")
				if (response.success) {
					CrmFuse.switchLoginItem()
				}
		});
		
		return false; //prevent form submit
	}
	
	CrmFuse.logout = function() {
		jQuery.post('/CrmFuse/auth.php?logout', {}, 
			function(r) {
				var response = eval("(" + r + ")")
				if (response.success) {
					location.href = '/'
				}
			}
		);
		
		return false; //prevent form submit
	}

	CrmFuse.forgotPassword = function() {
		var email = jQuery('input[@name="forgot_email"]').val();		
		jQuery.post('/CrmFuse/auth.php', {'forgot_password': 'yes', 'email': email}, CrmFuse.ajaxResponse);
		
		return false;
	}
	
	CrmFuse.setPassword = function(recover) {
		if (typeof recover == 'undefined') recover = false

		var p1 = jQuery('input[@name="new_password"]').val();
		var p2 = jQuery('input[@name="new_password2"]').val();
		
		jQuery('div.error').remove()
		
		if (p1 != p2) {
			jQuery('input[@name="new_password2"]').after('<div class="error">Passwords do not match</div>')
			return false;
		}
		
		if (p1.length < 3) {
			jQuery('input[@name="new_password"]').after('<div class="error">Password is too short</div>')
			return false;
		}
		
		if (recover) {
			jQuery.post('/CrmFuse/auth.php', {recover: 'true', password: p1}, CrmFuse.ajaxResponse)
		} else {
			jQuery.post('/CrmFuse/auth.php', {recover: 'false', password: p1}, function(r) {
				response = eval("(" + r + ")")
				if (response.success) {
					jQuery('div.newPassword').html('Your password was changed successfully!')
					jQuery('div.newPasswordForm').hide()
					setTimeout(function(){
						CrmFuse.UriManager.setHash('dashboard')
					}, 3000)
				} else {
					jQuery('div.newPassword').html('There was an error changing your password!')
				}
			});
		}

		return false;		
	}
	
	CrmFuse.recoverPassword = function() {
		CrmFuse.setPassword(true)
		return false;
	}

	CrmFuse.register = function() {
		var data = {}
		jQuery(':input[@name^=reg_]', CrmFuse.userPages).each(function (index) {
			data[this.name.substr(4)] = this.value
		})
		
		jQuery('div.error').remove() // cleaning up all errors, if any

		jQuery.post('/CrmFuse/register.php', data, function(response) {
			response = eval("(" + response + ")")
			
			if (response.success) {
				CrmFuse.UriManager.setHash(response.redirectUrl)
				CrmFuse.switchLoginItem()
			} else {
				jQuery.each(response.errors, function(i) {
					jQuery(':input[@name=reg_' + i + ']', CrmFuse.userPages)
						.after('<div class="error">'+response.errors[i]+'</div>')
				})
			}
		})
		
		return false
	}
	
	CrmFuse.cancelEditProfile = function() {
		CrmFuse.UriManager.setHash('dashboard')
		return false
	}
	
	CrmFuse.editProfile = function() {
		var data = {}
		jQuery(':input[@name^=profile_]', CrmFuse.userPages).each(function (index) {
			data[this.name.substr(8)] = this.value
		})
		
		jQuery('div.error').remove() // cleaning up all errors, if any

		jQuery.post('/CrmFuse/auth.php?profile', data, function(response) {
			response = eval("(" + response + ")")
			
			if (response.success) {
				CrmFuse.UriManager.setHash(response.redirectUrl)
			} else {
				jQuery.each(response.errors, function(i) {
					jQuery(':input[@name=profile_' + i + ']', CrmFuse.userPages)
						.after('<div class="error">'+response.errors[i]+'</div>')
				})
			}
		})
		
		return false
	}
	
	CrmFuse.changePassword = function() {
		var data = {}
		data['old_password'] = jQuery('input[@name=old_password]').val()
		data['new_password'] = jQuery('input[@name=new_password]').val()
		data['new_password2'] = jQuery('input[@name=new_password2]').val()
		
		jQuery('div.error').remove() // cleaning up all errors, if any

		jQuery.post('/CrmFuse/auth.php?password', data, function(response) {
			response = eval("(" + response + ")")
			
			if (response.success) {
				CrmFuse.UriManager.setHash(response.redirectUrl)
			} else {
				jQuery.each(response.errors, function(i) {
					jQuery(':input[@name=' + i + ']', CrmFuse.userPages)
						.after('<div class="error">'+response.errors[i]+'</div>')
				})
			}
		})
		
		return false;
	}
	
	function rand(max) {
		return Math.floor(Math.random() * (max + 1))
	}
	
	CrmFuse._generatePassword = function() {
		var chars = "ABCDEFGHIJKLMNPQRSTUVWXYZ".split('')
		var password = chars[rand(chars.length) - 1]
		for (var i = 0; i < 6; i++, password += ('' + rand(9)));
		return password
	}

	function debugUriChange(newHash) {
		if (typeof console != 'undefined' && console.log) {
			console.log('Hash changed: ' + newHash);
		} else {
			alert('Hash changed: ' + newHash);
		}
	}

	CrmFuse.ready = true;
});

