﻿// JScript File

var returnTo = "";
var engineersView = false;
var startDate;
var endDate;
var jobUpdating = false;

function CloseJobEntry(id)
{
    var jobEntry = $(id);
    var startHeight;
    var endHeight;
    
    if (jobEntry.originalHeight == undefined)
        jobEntry.originalHeight = jobEntry.offsetHeight;
    
    if (jobEntry.style.display == 'block')
    {
        // if the entry is open - close it
        jobEntry.style.overflow = "hidden";
        startHeight = 100;
        endHeight = 1;
        jobEntry.closed = true;
    }
    else
    {
        // if the entry is closed - open it
        jobEntry.style.display = "block";
        startHeight = 1;
        endHeight = 100;
        jobEntry.closed = false;
    }
            
    t = new Tween(jobEntry.style, "height", startHeight, endHeight, 0.5, Tween.Regular.Out, "px");
    
    t.onTweenFinished = function()
    {
        if (jobEntry.closed)
        {
            jobEntry.style.display = "none";
            jobEntry.style.overflow = "hidden";
        }   
        else
        {
            jobEntry.style.display = "block";
            jobEntry.style.overflow = "auto";
        }
    }
}

function SetOriginalHeights()
{
    //alert(arrJobDiaryItems.length);
    for (i = 0;i<arrJobDiaryItems.length;i++)
    {
        var jobEntry = $(arrJobDiaryItems[i] + "_details")
        jobEntry.originalHeight = jobEntry.offsetHeight;
        jobEntry.style.height = "0px";
        jobEntry.style.display = "none";
        jobEntry.closed = true;
    }
}


var currentDragObject = null;
var currentDragObjectParent = null;
var currentDragObjectClone = null;
var currentDropTarget = null;
var currentDragPos = new Point();
EventManager.register(document, "onmousemove", drag);
EventManager.register(document, "onmouseup", stopDrag);

function startDrag(e, element, jobId)
{
    // stop jobs from auto updating
    jobUpdating = true;
    
    e = EventManager.getMouseEventStruct(e);
    currentDragObject = element;
    currentDragObject.jobId = jobId;
    currentDragPos = new Point(e.x, e.y);
    currentDragObjectParent = element.parentNode;
    var itemClone = element.cloneNode(true);
    
    
    var pos = $P(currentDragObject);
    var size = new Size(element.offsetWidth, element.offsetHeight);
    
    currentDragObjectClone = $E(document.body, 'diaryDragObject');
    currentDragObjectClone.appendChild(itemClone);
    currentDragObjectClone.style.left = pos.x + 'px';
    currentDragObjectClone.style.top = pos.y + 'px';
    currentDragObjectClone.style.width = size.width + 'px';
    currentDragObjectClone.style.height = size.height + 'px';
    
    document.onselectstart = function() { return false; }
    
}

function stopDrag(e)
{
    if (!currentDragObject)
        return;
        
    e = EventManager.getMouseEventStruct(e);
    
    if (currentDragObject.parentNode != currentDragObjectParent)
        if (currentDragObject.parentNode.diarydate)
            updateJobDate(currentDragObject, currentDragObject.parentNode.diarydate, currentDragObject.parentNode.priority);
        else if (currentDragObject.parentNode.engineerId)
            updateJobEngineer(currentDragObject, currentDragObject.engineerId, currentDragObject.parentNode.engineerId, currentDragObject.parentNode.priority);
        
    
    document.body.removeChild(currentDragObjectClone);
    

    if (currentDropTarget)
        currentDropTarget.className = 'priorityLabel';
    
    document.onselectstart = null;
    currentDragObject = null;
    currentDragObjectClone = null;
    currentDropTarget = null;
    
    // re-enable job updates
    jobUpdating = false;
    
}

function drag(e)
{
    if (!currentDragObject)
        return;
    
    e = EventManager.getMouseEventStruct(e);
    
    //alert(e.x);
    var change = new Size(e.x-currentDragPos.x, e.y-currentDragPos.y);
    
    var newLeft = parseInt(currentDragObjectClone.style.left);
    var newTop = parseInt(currentDragObjectClone.style.top);
    
   //alert(currentDragPos);
    
    currentDragObjectClone.style.left = (newLeft + change.width) + 'px';
    currentDragObjectClone.style.top = (newTop + change.height) + 'px';
    //alert(currentDragObjectClone.style.left);
    
    currentDragPos = new Point(e.x, e.y);
    var dt = FindDropTarget(new Point(e.x, e.y));
    
    if (dt)
    {
        if (currentDropTarget)
            currentDropTarget.className = 'priorityLabel';
            
        currentDropTarget = dt.previousSibling;
        currentDragObject.parentNode.removeChild(currentDragObject);
        dt.appendChild(currentDragObject);
        
        currentDropTarget.className = 'priorityLabel_over';
        
    }
}

var dropTargets = [];

function RegisterDropTargets(count)
{
    for (var i = 1; i < count; i++)
    {
        dropTargets.push({el:$('droptarget_' + i), container:$('droptarget_' + i).nextSibling});
    }
}

function FindDropTarget(point)
{
    for (var i = 0; i < dropTargets.length; i++)
    {
        var p = $P(dropTargets[i].el);
        var s = new Size(dropTargets[i].el.offsetWidth, dropTargets[i].el.offsetHeight);
        var r = new Rectangle(p.x, p.y, s.width, s.height);        
        if (r.containsPoint(point))
        {
            return dropTargets[i].container;
        }
    }
    
    return null;
}


function updateJobDate(jobElement, diarydate, priority)
{
    jobUpdating = true;
    updateJobCallback(null, "Please wait...");
    var mi = new JSPBMethodInfo("JSPB_UpdateJob", "FrontRunner.BOL.Job", "App_Code");
    mi.addArgument(jobElement.jobId, "long");
    mi.addArgument(diarydate, "long");
    mi.addArgument("0", "int");
    JSPBHandler.invoke(mi, updateJobCallback, null);
}
function updateJobEngineer(jobElement, engineerId, newEngineerId, priority)
{
    jobUpdating = true;
    updateJobCallback(null, "Please wait...");
    var mi = new JSPBMethodInfo("JSPB_UpdateJobEngineer", "FrontRunner.BOL.Job", "App_Code");
    mi.addArgument(jobElement.jobId, "long");
    mi.addArgument(engineerId, "long");
    mi.addArgument(newEngineerId, "long");
    JSPBHandler.invoke(mi, updateJobCallback, null);
    
    jobElement.parentNode.removeChild(jobElement);
}

function updateJobCallback(sender, ret)
{
    updateJobs();
    jobUpdating = false;
    $('divStatus').style.display = ret != "" ? 'block' : 'none';
    $('divStatus').innerHTML = ret;    
}

function updateJobs()
{
    if (!jobUpdating)
    {
        $('divRefreshStatus').style.display = 'block';
        $('divRefreshStatus').innerHTML = 'Refreshing diary...'; 
        
        if (!engineersView)
        {
            var mi = new JSPBMethodInfo("JSPB_GetJobs", "FrontRunner.BOL.Job", "App_Code");
            mi.addArgument(startDate, "string");
            mi.addArgument(endDate, "string");
        }
        else
        {
            var mi = new JSPBMethodInfo("JSPB_GetJobsForEngineers", "FrontRunner.BOL.Job", "App_Code");
            mi.addArgument(startDate, "string");
        }

        JSPBHandler.invoke(mi, updateJobsCallback, null);
    }
}

var arrJobs = new Array();
function updateJobsCallback(sender, ret)
{
    updateCalendar(ret);
    $('divRefreshStatus').innerHTML = 'Diary Refreshed [' + getCurrentTime() + ']';
}

function getCurrentTime() {
    var date = new Date();
    var strTime = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours());
    strTime += ':' + (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes());
    strTime += ':' + (date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds());
    return strTime;
}


function populateObject(jobObjectString)
{
    var job = {};
    jobBits = jobObjectString.split("::");
    job.ID = jobBits[0];
    job.AllocatedDateString = jobBits[1];
    job.JobReference = jobBits[2];
    job.JobPriority = jobBits[3];
    job.WorkingStatus = jobBits[4];
    job.JobStatus = jobBits[5];
    job.CustomerName = jobBits[6];
    job.Site = jobBits[7];
    job.PreferredTime = jobBits[8];
    return job;
}

var jobItemDivs = new Array();
var jobItemDivs_old = new Array();

function updateCalendar(jobItems)
{
    jobItemDivs = new Array();
    if (jobItems != null)
    {
        for (i = 0; i < jobItems.length; i++ )
        {
            updateJobItem(jobItems[i]);
        }
        
        if (jobItemDivs_old.length > 0)
        {
            for (i = 0; i < jobItemDivs_old.length; i++ )
            {
                var removeJobItem = true;
                for (j = 0; j < jobItemDivs.length; j++ )
                {
                    if (jobItemDivs[j] == jobItemDivs_old[i])
                        removeJobItem = false;
                }
                if (removeJobItem)
                {
                    currentElement = $(jobItemDivs_old[i]);
                    if (currentElement)
                        currentElement.parentNode.removeChild(currentElement);
                }
            }
        }
        
        jobItemDivs_old = jobItemDivs;
    }
    
}


function updateJobItem(job)
{
    jobItemDivs.push(job.JobReference + "_" + job.SystemAccountId);
    
    var jobItemElementId = job.JobReference + "_" + job.SystemAccountId;
    var jobItemElement = $(jobItemElementId);
    if (!jobItemElement) 
    {
        var parentContainer = null;
        
        if (job.ManageManually && engineersView)
            parentContainer = $('subcontract_container');
        else if (job.SystemAccountId != '0' || engineersView == false)   
            parentContainer = $((engineersView ? job.SystemAccountId : job.AllocatedDateString) + '_container' + (job.WorkingStatus == "Completed" ? "_" + job.WorkingStatus : ""));
        else
            parentContainer = $('unallocated_container');
        
        if (parentContainer)
        {
            var jobItemContainer = $E(parentContainer, job.WorkingStatus);
            jobItemContainer.id = jobItemElementId;
            jobItemContainer.jobId = job.ID;
            jobItemContainer.jobReference = job.JobReference;
            jobItemContainer.engineerId = job.SystemAccountId;
            jobItemContainer.lastPolled = job.LastPolledString;
            jobItemContainer.dateUpdated = job.DateUpdatedString;
            jobItemContainer.progressUpdated = job.ProgressUpdated;
            jobItemContainer.workingStatus = job.WorkingStatus;
            jobItemContainer.jobStatus = job.jobStatus;
            
            var jobItem = $E(jobItemContainer, 'jobItem');
            var jobTitle = $E(jobItem, 'title');
            jobTitle.onclick = function () {CloseJobEntry(jobItemElementId + '_details');};
            jobTitle.title = job.WorkingStatus;
                      
            var jobIcon = $E(jobTitle, 'icon');
            jobIcon.id = jobItemElementId + '_dragbar';
            
            if (job.ManageManually && engineersView)
            {
                jobIcon.className += ' nomove';
            }
            else if (job.WorkingStatus == 'Unallocated' ||
                job.WorkingStatus == 'Allocated' ||
                job.WorkingStatus == 'Acknowledged')
                jobIcon.onmousedown = function() {startDrag(arguments[0], this.parentNode.parentNode.parentNode, job.ID);};
            else
                jobIcon.className += ' nomove';
                
                
            
            var jobStatus = $E(jobTitle, 'jobStatus');
            jobStatus.id = jobItemElementId + '_status';
            jobStatus.innerHTML = job.CustomerName + ' - ' + job.SitePostCode + ' - ' + job.JobStatusString + ' (' + job.JobReference + ')';
                        
            var jobDetails = $E(jobItem, 'jobDetails');
            jobDetails.id = jobItemElementId + '_details';
            jobDetails.style.display = 'none';
            jobDetails.style.height = '0px';
            jobDetails.onclick = function() {location.href='job.aspx?id=' + job.ID + '&_rt=' + returnTo;};
            var jobText = $E(jobDetails, 'jobText');
            if (job.SubContract)
                jobText.innerHTML += 'SUB-CONTRACT' + (job.ManageManually ? ' (Manual)' : '') + '<br />';
                
            jobText.innerHTML += job.JobReference + ' - ' + job.JobTypeString + '<br />';
            jobText.innerHTML += job.Packages + ' packages - ' + job.WeightString + '<br /><br />';
            jobText.innerHTML += '<b>Customer</b><br />' + job.CustomerName + '<br />';
            jobText.innerHTML += job.SiteAddress + '<br /><br />';
            jobText.innerHTML += '<b>Driver</b><br />' + job.AllocatedDriver + '<br /><br />';
        }
        
    }   
    else
    {
        if (parseInt(jobItemElement.lastPolled) < parseInt(job.LastPolledString) ||
            parseInt(jobItemElement.dateUpdated) < parseInt(job.DateUpdatedString) ||
            parseInt(jobItemElement.progressUpdated) < parseInt(job.ProgressUpdated) ||
            jobItemElement.workingStatus != job.WorkingStatus ||
            jobItemElement.jobStatus != job.JobStatus )
        {
        
            //alert(job.WorkingStatus);
            jobItemElement.lastPolled = job.LastPolledString;
            jobItemElement.dateUpdated = job.DateUpdatedString;
            jobItemElement.progressUpdated = job.ProgressUpdated;
            jobItemElement.workingStatus = job.WorkingStatus;
            jobItemElement.jobStatus = job.JobStatus;
            
            if (job.WorkingStatus == 'Completed' && job.JobAlert)
                jobItemElement.className = 'Alert';
            else
                jobItemElement.className = job.WorkingStatus;
                
            jobItemElement.childNodes[0].childNodes[0].title = job.WorkingStatus;
            $(jobItemElementId + '_status').innerHTML = job.CustomerName + ' - ' + job.SitePostCode + ' - ' + job.JobStatusString + ' (' + job.JobReference + ')';
            
            
            if (job.ManageManually && engineersView)
            {
                $(jobItemElementId + '_dragbar').onmousedown = function() {};
                $(jobItemElementId + '_dragbar').className += ' nomove';
            }
            else if (job.WorkingStatus == 'Unallocated' ||
                job.WorkingStatus == 'Allocated' ||
                job.WorkingStatus == 'Acknowledged')
                    $(jobItemElementId + '_dragbar').onmousedown = function() {startDrag(arguments[0], this.parentNode.parentNode.parentNode, job.ID);};
            else
            {
                $(jobItemElementId + '_dragbar').onmousedown = function() {};
                $(jobItemElementId + '_dragbar').className += ' nomove';
            }
                
            
            positionJobItem(jobItemElement, job);
        }
    } 
}

function positionJobItem(currentElement, job)
{
    currentElement.parentNode.removeChild(currentElement);

    var parentContainer = null;
    
    if (job.SystemAccountId != '0' || engineersView == false)   
        parentContainer = $((engineersView ? job.SystemAccountId : job.AllocatedDateString) + '_container' + (job.WorkingStatus == "Completed" ? "_" + job.WorkingStatus : ""));
    else
        parentContainer = $('unallocated_container');
        
    parentContainer.appendChild(currentElement);
}



function expandRow(id) {

    if ($(id).style.display == 'none')
    {
        $(id).style.display = 'block';
        $(id + '_icon_left').className = '';
        $(id + '_icon_right').className = '';
    }
    else
    {
        $(id).style.display = 'none';
        $(id + '_icon_left').className = 'collapsed';
        $(id + '_icon_right').className = 'collapsed';
    }
    

}