﻿/* JavaScript Document
* Contains methods used by AJAX components
*/


/* Generic function used by all AJAX methods
* Returns the appropriate xmlHttp object for the browser being used
* Throws alert box if browser doesn't support AJAX - very unlikely to happen
*/
function getXmlHttp() {
    if (window.XMLHttpRequest) {
        // code for IE7+, Firefox, Chrome, Opera, Safari
        return new XMLHttpRequest();
    }
    else if (window.ActiveXObject) {
        // code for IE6, IE5
        return new ActiveXObject("Microsoft.XMLHTTP");
    }
    else {
        alert("Your browser does not support AJAX");
        return null;
    }
}

// START OF AJAX QUESTIONNAIRE

// contacts the web services and returns the next question in an HTML format ready to be deployed
function getNextQuestion(que_order_no) {
    var xmlhttp = getXmlHttp();
    if (xmlhttp == null) return null;
    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4) {
            var qHolder = document.getElementById("ctl00_MCPH_questions_holder");
            var result = xmlhttp.responseText;
            var div = document.createElement("DIV");
            div.setAttribute("que_count", (que_count + 1) + "");
            div.innerHTML = result;
            qHolder.appendChild(div);
            scrollToLatest(qHolder);
        }
    }
    xmlhttp.open("GET", "Ajax Pages/question_loader.aspx?que_order_no=" + que_order_no + "&que_count=" + que_count, true);
    xmlhttp.send(null);
}

// END OF AJAX QUESTIONNAIRE

// START OF AJAX SEARCH SUGGESTOR

var ajax_image_timer = 0;
var empty_title = "e.g. Sales Manager, Birmingham";
function clear_title(tb) {
    if (tb.value == empty_title) tb.value = "";
}
function reset_title(tb) {
    if (tb.value == "") tb.value = empty_title;
}
/* selects the next/previous (change=1 or change=-1) item in the list of suggested results for a search
* clears the style of the currently selected item & sets the style of the newly selected one
*/
function select_suggestion(change) {
    for (var i = 0; i < list.childNodes.length; i++) {
        if (list.childNodes[i].getAttribute("selected") == "true") {
            list.childNodes[i].setAttribute("selected", null);
            list.childNodes[i].style.display = "none";
            list.childNodes[i].style.display = "";
            if (i + change > -1 && i + change < list.childNodes.length - 1) {
                list.childNodes[i + change].setAttribute("selected", "true");
                list.childNodes[i + change].style.display = "none";
                list.childNodes[i + change].style.display = "";
            }
            return;
        }
    }
    list.childNodes[0].setAttribute("selected", "true");
    list.childNodes[0].style.display = "none";
    list.childNodes[0].style.display = "";
}
/* clears list of selected items, then selects inputted div
*/
function clear_suggested(div) {
    for (var i = 0; i < list.childNodes.length; i++) {
        list.childNodes[i].setAttribute("selected", null);
        list.childNodes[i].style.display = "none";
        list.childNodes[i].style.display = "";
    }
    div.setAttribute("selected", "true");
    div.style.display = "none";
    div.style.display = "";
}
/* Function fired when key is pressed inside search box
* If arrow key move through selections 
* If enter key pressed jump to suggested results
*/
function load_title(e) {
    var keynum;
    var keychar;
    var numcheck;

    if (window.event) // IE
    {
        keynum = e.keyCode;
    }
    else if (e.which) // Netscape/Firefox/Opera
    {
        keynum = e.which;
    }
    var reload = true;
    // up pressed
    if (keynum == 38) {
        select_suggestion(-1);
        reload = false;
    }
    // down pressed
    else if (keynum == 40) {
        select_suggestion(1);
        reload = false;
    }
    // enter pressed
    else if (keynum == 13) {
        for (var i = 0; i < list.childNodes.length; i++) {
            if (list.childNodes[i].getAttribute("selected") == "true") {
                suggestion_selected(list.childNodes[i]);
            }
        }
    }
    var xmlhttp = getXmlHttp();
    if (xmlhttp == null) return null;
    xmlhttp.onreadystatechange = function() {
        var list = document.getElementById("list");
        if (xmlhttp.readyState == 4) {
            var value = document.getElementById("ctl00_MCPH_JSC_job_title").value;
            var result = xmlhttp.responseText;
            var resultSplit = result.split("#");
            // clear suggested list
            clear_list();
            for (var i = 0; i < resultSplit.length - 1; i += 2) {
                var parent = document.createElement("DIV");
                var div1 = document.createElement("DIV");
                var div2 = document.createElement("DIV");
                parent.className = "parent";
                div1.innerHTML = resultSplit[i];
                if (resultSplit[i].length > 35) div1.innerHTML = resultSplit[i].substring(0, 35) + "...";
                div2.innerHTML = resultSplit[i + 1] + " result";
                var val = parseInt(resultSplit[i + 1]);
                if (val > 1) div2.innerHTML += "s";
                parent.appendChild(div1);
                parent.appendChild(div2);
                parent.onclick = function() { suggestion_selected(this) };
                parent.onmouseover = function() { clear_suggested(this) };
                list.appendChild(parent);
            }
            // adds footer element to provide bottom border to suggestions box
            var footer = document.createElement("DIV");
            footer.className = "footer";
            list.appendChild(footer);
            if (list.childNodes.length > 1) {
                list.style.display = "";
            } else {
                list.style.display = "none";
            }
        }
    }
    var value = document.getElementById("ctl00_MCPH_JSC_job_title").value;
    // run ajax title suggester only if title > 4
    if (value.length > 4) {
        if (reload) {
            xmlhttp.open("GET", "Ajax Pages/title_loader.aspx?job_title=" + value, true);
            xmlhttp.send(null);
        }
    } else {
        clear_list();
        list.style.display = "none";
    }
}
// redirects user to appropriate search result when suggestion selected
function suggestion_selected(div) {
    document.location.href = "job_search.aspx?ajax=" + div.childNodes[0].innerHTML;
}
// clears list of all suggestions
function clear_list() {
    var list = document.getElementById("list");
    while (list.childNodes.length > 0) list.removeChild(list.firstChild);
}

// END OF AJAX SEARCH SUGGESTOR

// START OF AJAX TEMP AVAILABILITY

/* If the selected value of the status DropDown changes this shows/hides 
* the different DropDown selectors for the actions/shifts
*/
var current_month_shift = 0;
function status_changed(select) {
    var val = select.value;
    switch (val) {
        case "A":
            document.getElementById("avail_actions").style.display = "";
            document.getElementById("busy_actions").style.display = "none";
            break;
        case "N":
            document.getElementById("avail_actions").style.display = "none";
            document.getElementById("busy_actions").style.display = "";
            break;
    }
}
// Fired when user clicks on a day - toggles the style of the day to be highlight or not
function toggle_div(div) {
    var highlightAtt = div.getAttribute("highlight") == "true" ? "" : "true";
    div.setAttribute("highlight", highlightAtt);
    div.style.display = "none";
    div.style.display = "";
}
// Fired when user clicks on a day header - toggles the style of all days in this column
function toggle_days(div) {
    var row = div.parentNode.nextSibling;
    if (row.tagName == null) row = row.nextSibling;
    row = row.childNodes[0];
    var index = 0;
    for (var i = 0; i < div.parentNode.childNodes.length; i++) {
        if (div.parentNode.childNodes[i].tagName == undefined) index--;
        if (div.parentNode.childNodes[i] == div) break;
        index++;
    }
    while (row != null) {
        if (row.childNodes[index].getAttribute("onclick") != null) {
            toggle_div(row.childNodes[index]);
        }
        row = row.nextSibling;
    }
}
// get selected days & action - send to avail_updater.aspx to update availability
function update_availability(clear) {
    var action;
    // get selected status
    var status = document.getElementById("status").value;
    // get action dependent upon what status is selected
    if (status == "A") action = document.getElementById("avail_actions").value;
    else action = document.getElementById("busy_actions").value;
    // set default action for if 'clear selected' link is pressed
    if (clear != null) action = "XC";
    showAjaxImage();
    var xmlhttp = getXmlHttp();
    if (xmlhttp == null) return null;
    xmlhttp.onreadystatechange = function() {
        // when update is complete - reload the current month
        if (xmlhttp.readyState == 4) {
            load_month(current_month_shift);
        }
    }
    var dates = getDates();
    xmlhttp.open("GET", "Ajax Pages/avail_updater.aspx?dates=" + dates + "&action=" + action, true);
    xmlhttp.send(null);
}
var cover, expired, complete;
// Shows the ajax loading image
function showAjaxImage() {
    expired = false;
    complete = false;
    timer = setTimeout("availTimerExpired()", 500);
    if (cover == null) {
        cover = document.createElement("DIV");
        var avail = document.getElementById("ctl00_MCPH_MAC_ajax_avail_div");
        cover = document.createElement("DIV");
        cover.className = "ajax_cover";
        cover.style.position = "absolute";
        cover.style.display = "";
        var ajax_avail_div = document.getElementById("ctl00_MCPH_MAC_ajax_avail_div");
        ajax_avail_div.insertBefore(cover, ajax_avail_div.firstChild);
        cover.style.width = avail.offsetWidth + "px";
        cover.style.height = avail.offsetHeight + "px";
    }
}
function availTimerExpired() {
    if (complete) hideAjaxImage();
    expired = true;
}
// Removes the ajax loading image
function hideAjaxImage() {
    var ajax_avail_div = document.getElementById("ctl00_MCPH_MAC_ajax_avail_div");
    ajax_avail_div.removeChild(cover);
    cover = null;
}
// Gets a string that represents the list of selected days
function getDates() {
    var dates = "";
    var avail_arr = document.getElementById("ctl00_MCPH_MAC_avail_holder").getElementsByTagName("TD");
    for (var i = 0; i < avail_arr.length; i++) {
        if (avail_arr[i].getAttribute("highlight") == "true") {
            dates += avail_arr[i].getAttribute("ava_date") + ",";
        }
    }
    return dates;
}
/* calls the avail_loader page that contacts the web service and write out 
* an HTML string for the availability table
*/
function load_month(int_change) {
    current_month_shift = int_change;
    showAjaxImage();
    var xmlhttp = getXmlHttp();
    if (xmlhttp == null) return null;
    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4) {
            var result = xmlhttp.responseText;
            complete = true;
            var avail_holder = document.getElementById("ctl00_MCPH_MAC_avail_holder");
            //alert(result);
            avail_holder.innerHTML = result;
            if (expired) hideAjaxImage();
        }
    }
    xmlhttp.open("GET", "Ajax Pages/avail_loader.aspx?month=" + int_change, true);
    xmlhttp.send(null);
}

// END OF AJAX TEMP AVAILABILITY

// START OF AJAX WIDGET SAVER

function save_widgets() {
    var save_feedback = document.getElementById("save_feedback");
    var xmlhttp = getXmlHttp();
    if (xmlhttp == null) return null;
    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4) {
            save_feedback.innerHTML = "/ " + xmlhttp.responseText;
            // clears the feedback div text after a second
            timer = setTimeout("clear_content('save_feedback')", 1000);
        }
    }
    var resultsOrder = "";
    // loops through the container div and finds the various widgets & their ordering
    var div_arr = document.getElementById("ctl00_MCPH_dragContainer").getElementsByTagName("DIV");
    for (var i = 0; i < div_arr.length; i++) {
        if (div_arr[i].className == "widget") {
            resultsOrder += div_arr[i].getAttribute("widget_id") + ",";
        }
    }
    resultsOrder = resultsOrder.substring(0, resultsOrder.length - 1);
    save_feedback.innerHTML = "/ Saving...";
    // saves the widget order to a cookie
    xmlhttp.open("GET", "Ajax Pages/widget_saver.aspx?order=" + resultsOrder, true);
    xmlhttp.send(null);
}

// END OF AJAX WIDGET SAVER


// START OF AJAX SALARY UPDATER

var timer = 0;
/* Updates the salart sought value in the DB
* Also display 'Saving...' message during save
* Display 'Saved' temporarily when complete
*/
function update_salary_sought() {
    var xmlhttp = getXmlHttp();
    if (xmlhttp == null) return null;
    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4) {
            salary_save_feedback.innerHTML = " / " + xmlhttp.responseText;
            timer = setTimeout("clear_content('salary_save_feedback')", 1000);
        }
    }
    var salary = document.getElementById("ctl00_MCPH_salary_sought").value;
    if (salary == "") salary = "0";
    var salary_save_feedback = document.getElementById("salary_save_feedback");
    salary_save_feedback.innerHTML = " / Saving...";
    xmlhttp.open("GET", "Ajax Pages/salary_sought_updater.aspx?salary=" + salary, true);
    xmlhttp.send(null);
}
// clears the content of the object with the inputted id
function clear_content(id) {
    var div = document.getElementById(id);
    div.innerHTML = "";
}

// END OF AJAX SALARY UPDATER

// START OF AJAX LOGIN
/* Posts username, password & target to web service login.
* If pass - redirects to target page
* If fail - shows fail message
*/
function ajax_login(e) {
    var xmlhttp = getXmlHttp();
    if (xmlhttp == null) return null;
    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4) {
            if (xmlhttp.responseText == "true") {
                var target = document.getElementById("targetPageInput").value;
                document.location.href = target;
            } else {
                document.getElementById("loginPasswordInput").focus();
                document.getElementById("login_error_div").style.display = "";
            }
        }
    }
    // Gets required values
    var target = document.getElementById("targetPageInput").value;
    var email = document.getElementById("loginUsernameInput").value;
    var pass = document.getElementById("loginPasswordInput").value;
    if (email == "") {
        document.getElementById("loginUsernameInput").focus();
        return false;
    } else if (pass == "") {
        document.getElementById("loginPasswordInput").focus();
    }
    xmlhttp.open("GET", "Ajax Pages/ajax_login.aspx?email=" + email + "&pass=" + pass + "&target=" + target, true);
    xmlhttp.send(null);
    return false;
}

// END OF AJAX LOGIN

// START OF AJAX EXPENSES

/* Adds expense to the candidate's records
* Replace expense TextBoxes & etc with Labels & delete link
*/
function ajax_add_expense(link) {
    var tr = link.parentNode.parentNode;
    var inputArr = tr.getElementsByTagName("input");
    var selectArr = tr.getElementsByTagName("select");
    var xmlhttp = getXmlHttp();
    if (xmlhttp == null) return null;
    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4) {
            var delete_link = "[ <a class='dummy_link' onclick='delete_expense(this)' day_no='" + inputArr[0].value + "' day_date='" + inputArr[1].value + "' day_desc='" + selectArr[0].value + "' day_val='" + inputArr[2].value + "'>delete</a> ]";
            inputArr[2].parentNode.innerHTML = "£" + formatSalary(inputArr[2].value, true);
            selectArr[0].parentNode.innerHTML = selectArr[0].value;
            link.parentNode.innerHTML = delete_link;
        }
    }
    xmlhttp.open("GET", "Ajax Pages/add_expense.aspx?day_no=" + inputArr[0].value + "&day_date=" + inputArr[1].value + "&day_desc=" + selectArr[0].value + "&day_val=" + inputArr[2].value, true);
    xmlhttp.send(null);
    return false;
}
/* Deletes expense to the candidate's records
* Removes row from expenses table
*/
function ajax_del_expense(link) {
    var xmlhttp = getXmlHttp();
    if (xmlhttp == null) return null;
    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4) {
            remove_expense(link);
        }
    }
    xmlhttp.open("GET", "Ajax Pages/delete_expense.aspx?day_no=" + link.getAttribute("day_no") + "&day_date=" + link.getAttribute("day_date") + "&desc=" + link.getAttribute("day_desc") + "&day_val=" + link.getAttribute("day_val"), true);
    xmlhttp.send(null);
    return false;
}

// END OF AJAX EXPENSES
