/**
 * Timer control
 *
 * @author Sergei (Weavora team)
 */

var timerFetchInterval = 30000;
var fetchActiveTimerId = 0;

var startButtonImage = '/images/control_play_blue.png';
var pauseButtonImage = '/images/control_pause_blue.png';
var postButtonImage = '/images/bullet_go.png';

var allClients = new Array();
var allActivities = new Array
var defaultProjectsSelect = '';

function fetchActiveTimerData()
{
	clearTimeout(fetchActiveTimerId);

	jQuery.ajax({
		url: "/server_handler.php",
		type: "POST",
		data: {
			use_common: true,
			page: "ajax_get_active_timer_data"
		},
		dataType: "json",

		success: function(response) {
			if (response == '' || response == '0' || response.error) {
				clearTimerData();
				// if no active timers found
				if (response.error == 3 && jQuery('.timers-table .new-timer-row').length == 0)
					// then hide timers tab
					jQuery(".timers-container h4, .timers-table").hide();
				return;
			}
			onActiveTimerUpdate(response);
		},

		complete: function(xmlHttpRequest, textStatus) {
			//alert(xmlHttpRequest.responseText + ' ' + textStatus);
		},

		error: function(xmlHttpRequest, textStatus, errorThrown) {
			//alert(xmlHttpRequest.responseText + ' ' + textStatus + ' ' + errorThrown);
		}
	});

	fetchActiveTimerId = setTimeout('fetchActiveTimerData()', timerFetchInterval);
}

function clearTimerData() {
	jQuery(document).attr("title", '1Time');
	jQuery("#li_timer_tab").html('').hide();
	
}

function onActiveTimerUpdate(data) {
	updateWindowTitleByTimer(data);
	updateTabByTimer(data);
	updateListTimer(data);
}

function updateWindowTitleByTimer(data) {
	var defaultTitle = '1Time';
	var title = '';

	if (data.timerStatus == 1) {
		title = data.timerValue + ' - ' + data.projectName + ' - ' + defaultTitle;
	}
	else {
		title = defaultTitle;
	}

	jQuery(document).attr("title", title);
}

function updateTabByTimer(data) {
	var controls = '';

	if (data.timerStatus == 1) {
		controls += '<img src="' + pauseButtonImage + '" id="'
			+ data.timerId + '" title="Pause Timer" class="btn_pause_tab" />';
	}
	else {
		controls += '<img src="' + startButtonImage + '" id="'
			+ data.timerId + '" title="Run Timer" class="btn_run_tab" />';
	}

	controls += '<img src="' + postButtonImage + '" id="' + data.timerId + '"  rel="/timesheet/timer_post/'
		+ data.employeeId + '/' + data.timerId + '/" title="Post Timer" class="btn_post_tab" />';

	var text = '<span>' + '<span class="time">' + data.timerValue + '</span>' + ' - ' + data.projectName + '</span>';
	jQuery("#li_timer_tab").html('<div id="tab_timer">' + text + ' - ' + controls + '</div>').show();
}

function updateListTimer(data) {
	jQuery('.btn_pause, .btn_run').each(function() {
		var timerId = jQuery(this).attr('id');

		if (timerId == data.timerId) {
			var timerRow = jQuery(this).closest('tr');
			timerRow.find('.timer-time').html('<strong>' + data.timerValue + '</strong>');
		}

		if ((timerId == data.timerId) && (data.timerStatus == 1)) {
			pauseControl = '<img src="' + pauseButtonImage + '" id="' + timerId
				+ '" title="Pause Timer" class="btn_pause" />';
			jQuery(this).replaceWith(pauseControl);
		}
		else {
			playControl = '<img src="' + startButtonImage + '" id="' + timerId
				+ '" title="Run Timer" class="btn_run" />';
			jQuery(this).replaceWith(playControl);
		}
	});
}

function runTimer(id)
{
	if (isNaN(id)) {
		return;
	}

	jQuery.post(
		"/server_handler.php",
		{
			page: "ajax_timer_continue",
			timer_id: id
		},
		function() {
			fetchActiveTimerData();
		}
	);
}

function pauseTimer(id)
{
	if (isNaN(id)) {
		return;
	}

	jQuery.post(
		"/server_handler.php",
		{
			page: "ajax_timer_pause",
			timer_id: id
		},
		function() {
			fetchActiveTimerData();
		}
	);
}

function loadAllData()
{
	jQuery.ajax({
		url: "/server_handler.php",
		type: "POST",
		data: {
			use_common: true,
			page: "ajax_get_all_data"
		},
		dataType: "json",

		success: function(response) {
			if (response == '' || response == '0' || response.error) {
				return;
			}
			onAllDataRetrieve(response);
		}
	});
}

function onAllDataRetrieve(data)
{
	var i, j = 0;

	if (data.hasOwnProperty('clients')
		&& (data.clients.constructor === Array || data.clients.constructor === Object))
	{
		for (i in data.clients) {
			if (data.clients.hasOwnProperty(i)) {
				clientData = new Array(data.clients[i].id, data.clients[i].name);
				allClients.push(clientData);
			}
		}
	}

	if (data.hasOwnProperty('activities')
		&& (data.activities.constructor === Array || data.activities.constructor === Object))
	{
		for (j in data.activities) {
			if (data.activities.hasOwnProperty(j)) {
				activityData = new Array(data.activities[j].id, data.activities[j].name);
				allActivities.push(activityData);
			}
		}
	}
}

function setProjectsOptions(rowControl, options)
{
	jControl = jQuery(rowControl);

	var selectRow = jControl.closest('tr');
	if (selectRow.length == 0) {
		return;
	}

	var projectsContainer = selectRow.find('.new-timer-projects');
	if (projectsContainer.length != 1) {
		return;
	}

	var projectsSelectContainer = projectsContainer.find('select');
	if (projectsSelectContainer.length != 1) {
		projectsContainer.html('<select class="new-timer-project-select"></select>');
		projectsSelectContainer = projectsContainer.find('select');
	}

	projectsSelectContainer.html(options);
	//projectsSelectContainer.focus();
}

function loadProjectsDataByClient(clientId, container)
{
	jQuery.ajax({
		url: "/server_handler.php",
		type: "POST",
		data: {
			use_common: true,
			page: "ajax_get_all_data",
			client: clientId
		},
		dataType: "json",

		success: function(response) {
			var select = populateProjectsSelect(response);
			setProjectsOptions(container, select);
		}
	});
}

function populateProjectsSelect(data)
{
	select = '<option value="-1">- Select Project -</option>';

	if (data == '' || data == '0' || data.error) {
		select += '</select>';
		return select;
	}

	if (data.hasOwnProperty('projects')
		&& (data.projects.constructor === Array || data.projects.constructor === Object))
	{
		var i = 0;
		for (i in data.projects) {
			if (data.projects.hasOwnProperty(i)) {
				select += '<option value="' + data.projects[i].id + '">'
					+ data.projects[i].name + '</option>';
			}
		}
	}

	return select;
}

function onTimerClientChange(select) {

	jSelect = jQuery(select);

	var selectRow = jSelect.closest('tr');
	if (selectRow.length == 0) {
		return;
	}

	var projectsContainer = selectRow.find('.new-timer-projects');
	if (projectsContainer.length != 1) {
		return;
	}

	var selectValue = jSelect.val();

	if (selectValue == -1) {
		setProjectsOptions(projectsContainer, defaultProjectsSelect);
		return;
	}
	else if (selectValue == 0) {
		setProjectsOptions(projectsContainer, '<option value="0">Unbillable</option>');
		return;
	}

	setProjectsOptions(projectsContainer, defaultProjectsSelect);
	loadProjectsDataByClient(selectValue, projectsContainer);
}

function onTimerClientBlur(select) {
	if (jQuery.browser.msie) {
		onTimerClientChange(select);
	}
}

function onTimerProjectChange(select) {

}

function onInlineEditableFieldClick(field)
{
	jField = jQuery(field);
	
	// if field has been marked as editable
	if (jField.hasClass('timer-inline-edit')) {
		// and field contains editable controls
		if (jField.find('input, textarea, select').length > 0) {
			// then do nothing
			return;
		}
		else {
			// else uncheck field as already editable
			jField.removeClass('timer-inline-edit');
		}
		
	}

	var timerId = jField.closest('tr').find('.btn_delete_timer').attr('id');

	if (jField.hasClass('timer-activity')) {
		onInlineActivityEdit(field, timerId);
	}
	else if (jField.hasClass('timer-description')) {
		onInlineDescriptionEdit(field, timerId);
	}
	else if (jField.hasClass('timer-time')) {
		onInlineTimeEdit(field, timerId);
	}
}

function onInlineActivityEdit(field, timerId)
{
	var i = 0;
	jField = jQuery(field);
	jField.removeClass('timer-inline-hover').addClass('timer-inline-edit');

	var currentItemText = jField.text();
	var activitiesSelect = '<select class="timer-inline-activity-select">';
	activitiesSelect += '<option value="0">- Select Activity -</option>';
	for (i = 0; i < allActivities.length; i++) {
		activitiesSelect += '<option value="' + allActivities[i][0]  + '"'
			+ ((allActivities[i][1] == currentItemText) ? ' selected="selected"' : '')
			+ '>' + allActivities[i][1] + '</option>';
	}
	activitiesSelect += '</select>';
	jField.html(activitiesSelect);

	jQuery('.timer-inline-activity-select').focus();
	jQuery('.timer-inline-activity-select').select();

	jQuery('.timer-inline-activity-select').blur(function() {
		
		var jSelect = jQuery(this);
		var selectedValue = jSelect.val();
		var selectedItemText = '';

		if (selectedValue == null || selectedValue == undefined 
			|| selectedValue == '' || selectedValue == '-1')
		{
			selectedValue = 0;
		}

		if (selectedValue > 0) {
			selectedItemText = jSelect.find('option:selected').text();
		}

		updateTimerField(timerId, 'task_id', selectedValue);

		var modifiedField = jSelect.closest('td');
		modifiedField.removeClass('timer-inline-edit');
		modifiedField.html(selectedItemText);
	});
}

function onInlineDescriptionEdit(field, timerId)
{
	jField = jQuery(field);
	jField.removeClass('timer-inline-hover').addClass('timer-inline-edit');

	var textarea = '<textarea class="timer-inline-description-textarea" rows="3">'
		+ jField.text() + '</textarea>';
	jField.html(textarea);

	jField.find('textarea').focus();

	jQuery('.timer-inline-description-textarea').blur(function() {

		var jTextarea = jQuery(this);
		var textValue = jTextarea.val();

		updateTimerField(timerId, 'description', textValue);

		var modifiedField = jTextarea.closest('td');
		modifiedField.removeClass('timer-inline-edit');
		modifiedField.html(textValue);
	});
}

function onInlineTimeEdit(field, timerId)
{
	jField = jQuery(field);
	jField.removeClass('timer-inline-hover').addClass('timer-inline-edit');

	var currentValue = jField.text();

	var input = '<input type="text" value="' + jField.text() + '" class="timer-inline-time-input" />';
	jField.html(input);
	jField.find('input').focus();

	jQuery('.timer-inline-time-input').blur(function() {

		var jInput = jQuery(this);
		var textValue = jInput.val();

		if (textValue.match("^[0-2]?[0-9]:[0-9]{2}$")) {
			updateTimerField(timerId, 'accumulated_time', textValue);
		}
		else {
			textValue = currentValue;
		}

		var modifiedField = jInput.closest('td');
		modifiedField.removeClass('timer-inline-edit');
		modifiedField.html('<strong>' + textValue + '</strong>');
	});
}

function updateTimerField(timerId, fieldName, fieldValue)
{
	jQuery.post(
		"/server_handler.php",
		{
			page: "ajax_timer_field_update",
			id: timerId,
			field: fieldName,
			value: fieldValue
		}
	);
}

function disableControls(rowControl) {
	var timerRow = rowControl.closest('tr');
	timerRow.find('.new-timer-activity-select').attr("disabled", "disabled");
	timerRow.find('.new-timer-description textarea').attr("disabled", "disabled");
}

function enableControls(rowControl) {
	var timerRow = rowControl.closest('tr');
	timerRow.find('.new-timer-activity-select').removeAttr("disabled").focus();
	timerRow.find('.new-timer-description textarea').removeAttr("disabled");	
}

function saveTimer(applyButton)
{
	var controlsSelectors = [
		'.new-timer-client-select',
		'.new-timer-project-select',
		'.new-timer-activity-select',
		'.new-timer-description textarea',
		'.new-timer-time input'
	];
	var values = [];

	jApplyButton = jQuery(applyButton);
	var timerRow = jApplyButton.closest('tr');

	var value = '';
	for (var i = 0; i < controlsSelectors.length; i++) {
		var control = timerRow.find(controlsSelectors[i]);
		value = (control.length == 1) ? control.val() : '';
		values.push(value);
	}

	if (values[0] == '0') {
		values[1] = '0';
	}

	var error_str = '';
	if (values[0] == null || values[0] == undefined || values[0] == '' || values[0] == '-1') {
		error_str += "Please select a CLIENT before adding a timer <br>";
	}
	if (values[1] == null || values[1] == undefined || values[1] == '' || values[1] == '-1') {
		error_str += "Please select a PROJECT before adding a timer <br>";
	}

	if (error_str != "") {
		showErrorBox(error_str);
		return false;
	}
	else {
		showErrorBox('');
	}

	jQuery.ajax({
		url: "/server_handler.php",
		type: "POST",
		data: {
			use_common: true,
			page: "ajax_timer_add",
			client: values[0],
			project: values[1],
			task: values[2],
			description: values[3],
			time: values[4]
		},
		dataType: "json",

		success: function(data) {
			if (data.hasOwnProperty('data')) {
				timerRow.replaceWith(data.data);
			}
			fetchActiveTimerData();
		}
	});

	return true;
}

function showErrorBox(text) {
	if (text != "") {
		text = '<div>' + text + '</div>';
		jQuery('#timersErrorBox').html(text).fadeIn(500);
	}
	else {
		jQuery('#timersErrorBox').html('').hide();
	}
}

jQuery(function() {

	// get timers of this user
	jQuery.post(
		"/server_handler.php",
		{
			use_common: true,
			page: "ajax_timer_get"
		},
		function(data) {
			if (data.indexOf('No timers found') != -1 && data.indexOf('<tr class="no-timers-row odd">') != -1)
			{
				// hide timers table header if there are no timers
				jQuery(".timers-container h4, .timers-table").hide();
			} 
			else {
				// show timers table header if it was invisible
				jQuery(".timers-container h4, .timers-table").show();
				// put timers in list
				jQuery(".timers-table .timers-header-row").after(data);
			}
				
		}
	);
	
	jQuery(".btn_run_tab").live("click", function() {
		var timer_id = this.id;
		runTimer(timer_id);
	});

	jQuery(".btn_pause_tab").live("click", function() {
		var timer_id = this.id;
		pauseTimer(timer_id);
	});

	jQuery(".btn_post_tab").live("click", function() {
		var _link = jQuery(this).attr("rel");
		window.location = _link;
	});


	jQuery(".btn_run").live("click", function() {
		var timer_id = this.id;
		runTimer(timer_id);
	});

	jQuery(".btn_pause").live("click", function() {
		var timer_id = this.id;
		pauseTimer(timer_id);
	});

	jQuery(".btn_post").live("click", function() {
		var _link = jQuery(this).attr("rel");
		window.location = _link;
	});

	jQuery(".btn_delete_timer").live("click", function() {
		var id = this.id;
		var jDeleteButton = jQuery(this);

		jQuery.post(
			"/server_handler.php",
			{
				page: "ajax_timer_delete",
				timer_id: id
			},
			function() {
				jDeleteButton.closest('tr').fadeOut(1000, function() {
					jQuery(this).remove();
				});
				fetchActiveTimerData();
			}
		);
	});

	var inlineEditableFields = [
		'.timer-row .timer-activity',
		'.timer-row .timer-description',
		'.timer-row .timer-time',
	];

	for (var i = 0; i < inlineEditableFields.length; i++) {
		jQuery(inlineEditableFields[i]).live('mouseover', function() {
			if (!jQuery(this).hasClass('timer-inline-edit')) {
				jQuery(this).addClass('timer-inline-hover');
			}
		});

		jQuery(inlineEditableFields[i]).live('mouseout', function() {
			jQuery(this).removeClass('timer-inline-hover');
		});

		jQuery(inlineEditableFields[i]).live('click', function() {
			onInlineEditableFieldClick(this);
		});
	}

	jQuery(".new-timer-row .new-timer-client-select").live("change", function() {
		onTimerClientChange(this);
	});

	jQuery(".new-timer-row .new-timer-project-select").live("change", function() {
		//onTimerProjectChange(this);
	});

	jQuery(".new-timer-row .new-timer-apply-button").live("click", function() {
		saveTimer(this);
	});

	jQuery(".new-timer-row .new-timer-delete-button").live("click", function() {
		jQuery(this).closest('tr').remove();
		
		if (jQuery('.timers-table tr').length <= 1)
			jQuery(".timers-container h4, .timers-table").hide();
	});

	fetchActiveTimerData();
});
