var g_task_array = new Array(); // for initial task information
var r_task_array = new Array(); // for information after time has been saved
var g_is_timer = false;
var g_is_task_time = false;
var g_person_id;
var g_year;
var g_week;
var g_timer;
var g_label;

var g_refID = 0;

var g_msg_displayed = false;

var tValReplaced;
var tValReplacedValue;

var tabIndex = 1;

var rowStatus = 'odd';

function addtimeRegularTime(person_id, year, week, timer, refID, label) {

    g_label = '';
    g_is_task_time = false;
    if (timer == undefined) {
        timer = '';
        g_is_timer = false;
    } else {
        g_is_timer = true;
		g_label = label;
        g_refID = refID;
    }

    // removed AJAX request
    addtimeRegularTimeProceed();
}

function addtimeRegularTimeProceed() {

	var dcM = new Date().getMonth() + 1;
	var dcD = new Date().getDate();
	var dcY = takeYear(new Date());

	g_task_array['id']         = 0;
	g_task_array['localid']    = 0;
	g_task_array['projectid']  = 0;
	g_task_array['project']    = '';
	g_task_array['moduleid']   = 0;
	g_task_array['module']     = '';
	g_task_array['title']      = '';
	g_task_array['person']     = 'Joe User';
	g_task_array['person_id']  = 1;
	g_task_array['person_group_id']  = 0;
	g_task_array['t_time']     = (ekTicker[g_refID].time/60/60);
	g_task_array['t_og_time']  = 1;
	g_task_array['date']       = dcM + '/' + dcD + '/' + dcY;

	g_task_array['clientid']   = 0;
	g_task_array['client']     = '';

	addtimeGo();
}
function addtimeGo() {

    // black out the background
    addtimeFadeBlack();
    addtimeSwitchForms(true);

    // reset the rounding variables
    tValReplaced = false;
    tValReplacedValue = 0;

    // other variables
    g_msg_displayed = false;

    // draw the window
    var timeWindow = document.createElement('div');
    var scrollTop = Math.max(document.documentElement.scrollTop, document.body.scrollTop);

    timeWindow.setAttribute('id','centerTable');
    timeWindow.style.left = '50%';
    timeWindow.style.marginLeft = '-200px';
    timeWindow.style.top = eval("'" + (scrollTop + 100) + "px';");
    timeWindow.style.display = 'none';
    document.body.appendChild(timeWindow);

    addtimeDrawFrame();
    addtimeCreateFormElementPerson();
    addtimeCreateFormElementDate();
    addtimeCreateFormElementTime();
    addtimeCreateFormElementClient();
    addtimeCreateFormElementProject();
    addtimeCreateFormElementTask();
    addtimeCreateFormElementModule();
    addtimeCreateFormElementWorktype();
    addtimeCreateFormElementBillable();
    addtimeCreateFormElementDescription();
    addtimeCreateFormElementSubmit();

    tabIndex = 1;

    new Effect.BlindDown('centerTable', {duration: 0.7});
    window.onscroll = addtimeCalcWindowLocationOnScrollEvent;

    setTimeout('addtimeGiveFocus()', 1000);

}
function addtimeGiveFocus() {
    document.forms['addTime'].f_addtimeDate.focus();
}
function addtimeSave() {

    $('addTimeSubmitButton').disabled = true;
    $('addTimeCloseButton').disabled = true;

    addtimeSaveProceed();
}
function addtimeSaveProceed() {

    $('addtimeMsg').innerHTML = 'Time was successfully saved.';
    $('addtimeMsg').style.display = 'block';
    $('addtimeMsgError').style.display = 'none';
    if (!g_msg_displayed) {
        new Effect.BlindDown('addtimeMsgContainer');
    }
    setTimeout('addtimeDestroy()',1500);

    // clear out the timers
    if (g_is_timer) {
        var timer = (g_is_task_time) ? g_task_array['localid'] : g_refID;
        ekTicker[timer].clearComplete();
    }

}
function addtimeRefresh() {
    if (document.location.href.toLowerCase().indexOf('/tasks/view/') != -1 ||
            document.location.href.toLowerCase().indexOf('module=tasks&action=view') != -1) {
        document.location.href = document.location.href + (document.location.href.indexOf('?') != -1 ? '&' : '?') + 't_showtime=1';
    } else {
        document.location.href = document.location.href;
    }
}
function addtimeDisplaySaveError(response) {

    $('addTimeSubmitButton').disabled = false;
    $('addTimeCloseButton').disabled = false;

    var xmlObj = response.responseXML;
	var errorMsg = xmlObj.getElementsByTagName('error')[0].firstChild.nodeValue.toString();

    $('addtimeMsgError').style.display = 'block';
    $('addtimeMsgError').innerHTML = errorMsg;
    if (!g_msg_displayed) {
        new Effect.BlindDown('addtimeMsgContainer');
    }
    g_msg_displayed = true;
}
function addtimeDestroy() {
    // get rid of events
    window.onscroll = null;
    window.calendar = null;
    new Effect.BlindUp('centerTable', {duration: 0.5});
    new Effect.Fade('addtimeBackground');
    setTimeout('addtimeDestroyComplete()',1500);
    g_focus_given = false;
}
function addtimeDestroyComplete() {
    if (document.getElementById('addtimeBackground')) $('addtimeBackground').parentNode.removeChild($('addtimeBackground'));
    if (document.getElementById('centerTable')) $('centerTable').parentNode.removeChild($('centerTable'));
    addtimeSwitchForms(false);
}
function addtimeCalcWindowLocationOnScrollEvent() {
    var scrollTop = Math.max(document.documentElement.scrollTop, document.body.scrollTop);

    $('centerTable').style.top = eval("'" + (scrollTop + 100) + "px';");
}
function addtimeFadeBlack() {

    var background = document.createElement("table");
    background.setAttribute('id', 'addtimeBackground');
    background.setAttribute('width', '100%');
    background.setAttribute('height', addtimeGetScreenHeight() + 40);
    background.style.display = 'none';
    var backgroundTr = background.insertRow(-1);
    var backgroundTd = backgroundTr.insertCell(-1);
    document.body.insertBefore(background, document.body.firstChild);

    new Effect.Appear('addtimeBackground', {to: 0.4});
}
function addtimeGetScreenHeight() {
    var height = 0;
    var heightPropertiesArray = new Array(document.body.clientHeight,document.documentElement.clientHeight,window.innerHeight);
    for (var i = 0; i < heightPropertiesArray.length; i++) {
        if (heightPropertiesArray[i] != undefined && heightPropertiesArray[i] > height) height = heightPropertiesArray[i];
    }
    return height;
}
function addtimeSwitchForms(in_disable) {
    for (var i = 0; i < document.forms.length; i++) {
        if (document.forms[i].name == 'addTime') continue;
        for (var j = 0; j < document.forms[i].elements.length; j++) {
            document.forms[i].elements[j].style.visibility = in_disable ? 'hidden' : 'visible';
        }
    }
}
function addtimeDrawFrame() {
    var contentHTML = '<div style="padding: 20px 0;"><h1>Add Time</h1>';
    contentHTML += (g_is_task_time) ? '<p><strong>#' + g_task_array['localid'] + ': ' + g_task_array['title'] + '</strong></p>' : '';
    contentHTML += '<form name="addTime" method="post" action="javascript:addtimeSave();">';
    contentHTML += '<div class="pinstripe" style="clear: left;">&nbsp;</div>';
    contentHTML += '<div id="addtimeMsgContainer" style="display: none;"><div id="addtimeMsg"></div><div id="addtimeMsgError"></div><div class="pinstripe" style="clear: left;">&nbsp;</div></div>';
    contentHTML += '<table cellpadding="0" cellspacing="1" border="0" class="fields stretch"><colgroup span="2"><col width="25%" /><col width="75%" /></colgroup>';
    contentHTML += '<tr><td id="addTimePersonHeader">Person</td><td id="addTimePerson">Person</td></tr>';
    contentHTML += '<tr><td id="addTimeDateHeader">Date</td><td id="addTimeDate">Date</td></tr>';
    contentHTML += '<tr><td id="addTimeTimeHeader">Time</td><td id="addTimeTime">Time</td></tr>';
    contentHTML += '<tr><td id="addTimeClientHeader">Client</td><td id="addTimeClient">Client</td></tr>';
    contentHTML += '<tr><td id="addTimeProjectHeader">Project</td><td id="addTimeProject">Project</td></tr>';
    contentHTML += '<tr><td id="addTimeTaskHeader">Task</td><td id="addTimeTask">Task</td></tr>';
    contentHTML += '<tr><td id="addTimeModuleHeader">Module</td><td id="addTimeModule">Module</td></tr>';
    contentHTML += '<tr><td id="addTimeWorktypeHeader">Worktype</td><td id="addTimeWorktype">Worktype</td></tr>';
    contentHTML += '<tr><td id="addTimeBillableHeader">Billable</td><td id="addTimeBillable">Billable</td></tr>';
    contentHTML += '<tr><td colspan="2" id="addTimeDescriptionHeader">Description of work<br />(Limit 255 characters. <span id="totalchars">' + (255 - g_label.length) + '</span> remaining.)</td></tr>';
    contentHTML += '<tr><td colspan="2" id="addTimeDescription"></td></tr>';
    contentHTML += '<tr><td colspan="2"><div class="pinstripe" style="clear: left;">&nbsp;</div></td></tr>';
    contentHTML += '<tr><td id="addTimeSubmit"></td><td id="addTimeClose" class="alignRight"></td></tr>';
    contentHTML += '</table>';
    contentHTML += '</form></div>';

    $('centerTable').innerHTML = contentHTML;

}
function addtimeCreateFormElementPerson() {
    $('addTimePerson').innerHTML = g_task_array['person'];
}
function addtimePopulateFormElementPerson(response) {
	var xmlObj = response.responseXML;
	var arrIDs = xmlObj.getElementsByTagName('id');
	var arrNames = xmlObj.getElementsByTagName('name');
	people = document.forms['addTime'].f_addtimePerson;

	var selected = 0;
	for(i = 0; i < arrIDs.length; i++) {
	    if (arrIDs.item(i).firstChild.nodeValue == g_task_array['person_id']) { selected = i; }
		people.options[i] = new Option(arrNames.item(i).firstChild.nodeValue.toString().unescapeHTML(), arrIDs.item(i).firstChild.nodeValue, selected);
	}
	people.options.selectedIndex = selected;

}
function addtimeCreateFormElementDate() {
    $('addTimeDateHeader').className = 'thvRequired';
    // [!] statify this image
    $('addTimeDate').innerHTML  = '<input type="text" id="f_addtimeDate" name="f_addtimeDate" size="10" maxlength="14" value="' + g_task_array['date'] + '" tabindex="' + (tabIndex++) + '" />&nbsp;';
    $('addTimeDate').innerHTML += '<img src="/i/icons/calendar.gif" width="19" height="15" border="0" alt="Select date" id="calendar_trigger_999" align="absmiddle" />';
    window.calendar = null;
    Zapatec.Calendar.setup({
      inputField  : "f_addtimeDate",        // ID of the input field
      button      : "calendar_trigger_999" // ID of the button
    });

}
function addtimeCreateFormElementTime() {
    $('addTimeTimeHeader').className = 'thvRequired';
    $('addTimeTime').innerHTML  = (g_is_timer && g_task_array['t_og_time'] > 0) ? '<div id="timerounderpos"><a id="time_rounder" href="" onclick="return roundTime(\'ftime\')">&#187; Round up</a></div>' : '';
    $('addTimeTime').innerHTML += '<input type="text" id="ftime" name="f_addtimeTime" size="6" value="" style="float: left;" tabindex="' + (tabIndex++) + '" />';
    $('addTimeTime').innerHTML += '<div class="tooltipIcon ttiCell"><a href="#" class="tooltip icon" rel="ttAddTime"><img src="/i/icons/tooltip.gif" width="17" height="17" border="0" alt="Tool Tip" name="tooltip_gen" /></a></div>';
    $('addTimeTime').innerHTML += '<div id="ttAddTime" class="tooltipText" style="width: 250px; margin-left: 70px;"><strong>What do I enter here?</strong><br />Time is entered as hours in the decimal format. For example, 1.25 is the equivalent of one hour and fifteen minutes, and .5 is the equivalent of half an hour.' + (g_is_timer ? '<br /><br />The Round Up feature can be used to round up the time to the nearest 1/8th of an hour.' : '') + '</div>';
    if (g_is_timer && g_task_array['t_og_time'] > 0) {
        $('ftime').value = (g_task_array['t_time']).toFixed(3);
    }
	tooltipPrepare();
}

function addtimeCreateFormElementClient() {
    $('addTimeClientHeader').className = 'thvRequired';
    $('addTimeClient').innerHTML = '<select name="f_addtimeClient" id="add_time_list_clients" onchange="populateProjectsDropdown(this);" tabindex="' + (tabIndex++) + '" style="width: 60%"><option value="0">Choose a client</option></select>';

    var uri = '/tour_timer.timer.php';
    var jx = new Ajax.Request(
        uri,
        {
            method: 'get',
            parameters: 'f_timer_action=clients',
            onSuccess: addtimePopulateFormElementClient,
            onFailure: addtimeDisplayError
        });
}

function addtimePopulateFormElementClient(response) {
	clients = $('add_time_list_clients');
	var firstOption = clients.options[0].text;
	clients.options.length = 0;
	var xmlObj = response.responseXML;
	var arrIDs = xmlObj.getElementsByTagName('id');
	var arrNames = xmlObj.getElementsByTagName('name');

	clients.options[0] = new Option(firstOption, 0);
	for(i = 0; i < arrIDs.length; i++) {
		var n = arrNames.item(i).firstChild.nodeValue.toString().unescapeHTML();
		n = n.length > 40 ? n.substring(0, 40) + '...' : n;
		clients.options[i + 1] = new Option(n, arrIDs.item(i).firstChild.nodeValue);
	}

	if (clients.onchange) clients.onchange();
}

function addtimeCreateFormElementProject() {
    $('addTimeProjectHeader').className = 'thvRequired';
    $('addTimeProject').innerHTML = '<select name="f_addtimeProject" id="add_time_list_projects" onchange="populateModulesDropdown(this);populateWorktypesDropdown(this);populateTaskDropdown(this);" tabindex="' + (tabIndex++) + '" style="width: 60%"><option value="0">Choose a project</option></select>';
}

function populateProjectsDropdown(obj) {
	var uri = '/tour_timer.timer.php';
	var jx = new Ajax.Request(
		uri,
		{
			method: 'get',
			parameters: 'f_timer_action=projects&f_client_id=' + obj.value,
			onSuccess: addtimePopulateFormElementProject,
			onFailure: addtimeDisplayError
		});
}

function addtimePopulateFormElementProject(response) {
	projects = $('add_time_list_projects');
	var firstOption = projects.options[0].text;
	projects.options.length = 0;
	var xmlObj = response.responseXML;
	var arrIDs = xmlObj.getElementsByTagName('id');
	var arrNames = xmlObj.getElementsByTagName('name');

	projects.options[0] = new Option(firstOption, 0);
	for(i = 0; i < arrIDs.length; i++) {
		var n = arrNames.item(i).firstChild.nodeValue.toString().unescapeHTML();
		n = n.length > 40 ? n.substring(0, 40) + '...' : n;
		projects.options[i + 1] = new Option(n, arrIDs.item(i).firstChild.nodeValue);
	}
    
	if (projects.onchange) projects.onchange();
}

function populateTaskDropdown(obj) {
	var uri = '/tour_timer.timer.php';
	var jx = new Ajax.Request(
		uri,
		{
			method: 'get',
			parameters: 'f_timer_action=tasks&f_project_id=' + obj.value,
			onSuccess: addtimePopulateFormElementTask,
			onFailure: addtimeDisplayError
		});
}

function addtimePopulateFormElementTask(response) {
	tasks = $('add_time_list_tasks');
	var firstOption = tasks.options[0].text;
	tasks.options.length = 0;
	var xmlObj = response.responseXML;
	var arrIDs = xmlObj.getElementsByTagName('id');
	var arrNames = xmlObj.getElementsByTagName('name');

	tasks.options[0] = new Option(firstOption, 0);
	for(i = 0; i < arrIDs.length; i++) {
		var n = arrNames.item(i).firstChild.nodeValue.toString().unescapeHTML();
		n = n.length > 40 ? n.substring(0, 40) + '...' : n;
		tasks.options[i + 1] = new Option(n, arrIDs.item(i).firstChild.nodeValue);
        tasks.options[i + 1].title = arrNames.item(i).firstChild.nodeValue.toString().unescapeHTML();
	}
}

function populateTaskInfo(obj) {
    var melem = $('add_time_list_modules');
    if (obj.value == '0') {
        melem.disabled = false;
        return;
    }
    
    // select a random module
    melem.selectedIndex = Math.floor(Math.random() * (melem.options.length - 1)) + 1;
    melem.disabled = true;
}

function addtimeCreateFormElementTask() {
    $('addTimeTaskHeader').className = 'thvRequired';
    $('addTimeTask').innerHTML = '<select name="f_addtimeTask" id="add_time_list_tasks" onchange="populateTaskInfo(this);" tabindex="' + (tabIndex++) + '" style="width: 60%"><option value="0">General Time - No Task</option></select>';
    tooltipPrepare();
}

function addtimeCreateFormElementModule() {
    $('addTimeModuleHeader').className = 'thvRequired';
    $('addTimeModule').innerHTML = '<select name="f_addtimeModule" id="add_time_list_modules" tabindex="' + (tabIndex++) + '" style="width: 60%"><option value="0">Choose a module</option></select>';
}


var globalModuleDestinationElem;
function populateModulesDropdown(obj) {
	globalModuleDestinationElem = 'add_time_list_modules';
	var uri = '/tour_timer.timer.php';
	var jx = new Ajax.Request(
		uri,
		{
			method: 'get',
			parameters: 'f_timer_action=modules&f_project_id=' + obj.value,
			onSuccess: buildModulesXref,
			onFailure: addtimeDisplayError
		});
}

function buildModulesXref(response) {
	//stopThinking('modules_' + globalModuleID);
	modules = $(globalModuleDestinationElem);
	var firstOption = modules.options[0].text;
	modules.options.length = 0;
	var xmlObj = response.responseXML;
	var arrIDs = xmlObj.getElementsByTagName('id');
	var arrNames = xmlObj.getElementsByTagName('name');
	modules.options[0] = new Option(firstOption, 0);
	for(i = 0; i < arrIDs.length; i++) {
		modules.options[i + 1] = new Option(arrNames.item(i).firstChild.nodeValue.toString().unescapeHTML(), arrIDs.item(i).firstChild.nodeValue);
	}
}

function addtimeCreateFormElementWorktype() {
    $('addTimeWorktypeHeader').className = 'thvRequired';
    $('addTimeWorktype').innerHTML = '<select name="f_addtimeWorktype" id="add_time_list_budget" tabindex="' + (tabIndex++) + '" style="width: 60%"><option value="0">Choose a worktype</option>';
}


var globalWorktypesDestinationElem;
function populateWorktypesDropdown(obj) {
	globalWorktypesDestinationElem = 'add_time_list_budget';
	var uri = '/tour_timer.timer.php';
	var jx = new Ajax.Request(
		uri,
		{
			method: 'get',
			parameters: 'f_timer_action=worktypes&f_project_id=' + obj.value,
			onSuccess: buildWorktypesXref,
			onFailure: addtimeDisplayError
		});
}

function buildWorktypesXref(response) {
	//stopThinking('modules_' + globalModuleID);
	types = $(globalWorktypesDestinationElem);
	var firstOption = types.options[0].text;
	types.options.length = 0;
	var xmlObj = response.responseXML;
	var arrIDs = xmlObj.getElementsByTagName('id');
	var arrNames = xmlObj.getElementsByTagName('name');

	types.options[0] = new Option(firstOption, 0);
	for(i = 0; i < arrIDs.length; i++) {
		types.options[i + 1] = new Option(arrNames.item(i).firstChild.nodeValue.toString().unescapeHTML(), arrIDs.item(i).firstChild.nodeValue);
	}
}

function addtimePopulateFormElementWorktype(response) {

    worktypes = $('add_time_list_budget');
	var firstOption = worktypes.options[0].text;
	worktypes.options.length = 0;

	var xmlObj = response.responseXML;
	var arrIDs = xmlObj.getElementsByTagName('worktypeid');
	var arrNames = xmlObj.getElementsByTagName('worktype');

	worktypes.options[0] = new Option(firstOption, 0);
	for(i = 0; i < arrIDs.length; i++) {
		worktypes.options[i + 1] = new Option(arrNames.item(i).firstChild.nodeValue.toString().unescapeHTML(), arrIDs.item(i).firstChild.nodeValue);
	}

}
function addtimeCreateFormElementBillable() {
    $('addTimeBillable').innerHTML = '<input type="checkbox" name="f_addtimeBillable" value="t" checked="checked" tabindex="' + (tabIndex++) + '" />';
}
function addtimeCreateFormElementDescription() {
    $('addTimeDescription').innerHTML = '<textarea name="f_addtimeDescription" rows="4" cols="54" style="width: 100%;" tabindex="' + (tabIndex++) + '" onkeyup="if(this.value.length>255)this.value=this.value.substring(0,255);document.getElementById(\'totalchars\').innerHTML=(255-this.value.length);">'+g_label+'</textarea>';
}
function addtimeCreateFormElementSubmit() {
    $('addTimeSubmit').innerHTML = '<input id="addTimeSubmitButton" type="button" name="f_submit" value="Save" class="submit save" onclick="addtimeSave();return false;" tabindex="' + (tabIndex++) + '" />';
    $('addTimeClose').innerHTML = '<input id="addTimeCloseButton" type="button" name="f_submit" value="Close Window" onclick="addtimeDestroy();" class="submit" tabindex="' + (tabIndex++) + '" />';
}
function addtimeDisplayError(response) {
	editmode = true;
	var xmlObj = response.responseXML;
	alert(xmlObj.getElementsByTagName('error')[0].firstChild.nodeValue.toString().unescapeHTML());
}
function roundTime(el){
	var tField = document.getElementById(el);
	var tVal = tField.value;
	if( !tValReplaced ) {
		tField.value = (Math.ceil(tVal * 8 ) / 8).toFixed(3);
		tValReplaced = true;
		tValReplacedValue = tVal;
		hrefText = document.getElementById('time_rounder');
		hrefText.innerHTML = '&#187; Revert to actual time';
	} else {
		tField.value = parseFloat(tValReplacedValue).toFixed(3);
		tValReplaced = false;
		hrefText = document.getElementById('time_rounder');
		hrefText.innerHTML = '&#187; Round up';
	}
	return false;
}
function leadingZero(nr) {
	if (nr < 10) nr = "0" + nr;
	return nr;
}
function takeYear(theDate) {
	x = theDate.getYear();
	var y = x % 100;
	y += (y < 38) ? 2000 : 1900;
	return y;
}
function toggleTotalTime() {
	obj = $('totaltime');
	lobj = $('viewall');
	if (obj.style.display == 'none') {
		obj.style.display = 'block';
		lobj.innerHTML = '&#187; Hide all time';
	} else {
		obj.style.display = 'none';
		lobj.innerHTML = '&#187; View all time';
	}
}

var calendar_date_format = "%m/%d/%Y";
var currency_format = new Array('$','2','.',',','-','','1','1','0','0','1','1');
var number_decimal_format = ".";
var number_thousands_format = ",";

function formatNumber(num,dec,in_thou,in_pnt) {
    if (num == '') return 0;
    var num_is_negative = false;
    if (num < 0) {
        num = Math.abs(num);
        num_is_negative = true;
    }

    thou = (in_thou != undefined) ? in_thou : number_thousands_format;
    pnt  = (in_pnt != undefined) ? in_pnt : number_decimal_format;

    num = parseFloat(num);
    num = num.toFixed(dec);
    var s = num.split('.');
    var z = s[0].length;
    var a = (''+s[0]).split('').reverse();
    for (var i = 3; i < z; i += 4) {
        a.splice(i,0,thou);
        z++;
    }
    var r = a.reverse().join('') + (s.length > 1 ? (pnt + s[1]) : '');
    if (num_is_negative) {
        switch (currency_format[11]) {
            case '0': r = '(' + r + ')'; break;
            case '1':
            case '3': r = '-' + r; break;
            case '2':
            case '4': r += '-'; break;
            default: break;
        }
    }

    return r;
}