
var ac = [];
var acf = [];
var ds = [];
var aff = [];
var defaultEntryBoxText = "Start typing for a suggestion...";

var descCache = [];
var maxDescCacheItems = 10;

function cacheDesc(key, val)
{
    for (var i = 0; i < descCache.length; i++)
    {
        if (descCache[i][0] == key)
        {
            return;
        }
    }
    if (descCache.length >= maxDescCacheItems)
    {
        descCache.shift();
    }
    descCache.push([key, val]);
}

function getCachedDesc(key)
{
    for (var i = 0; i < descCache.length; i++)
    {
        if (descCache[i][0] == key)
        {
            return descCache[i][1];
        }
    }
    return null;
}

function ForceSuggest(id)
{
    var tb = document.getElementById(id);
    if (tb.value == '')
    {
        ac[id].setBody('<div style="padding:5px;">Type to see suggestions...</div>');
    }
    else
    {
        ac[id]._sendQuery(tb.value);
    }
}

function PSPV2_onCompleteSelected(event, params)
{
    PSPV2_onDescriptionLoadFailed();
    var fv = document.getElementById(params[0].id);
    var answer;
    switch (params[2][3])
    {
        case 'answer':
            answer = RemoveCodes( params[1] );
            fv.value = answer;
            var completeVal = document.getElementById(params[0].completeId + "ValueID");
            var completeStr = document.getElementById(params[0].completeId + "String");

            if (completeVal)
                { completeVal.value = params[2][1]; }
            if (completeStr)
                { completeStr.value = answer; }
            break;
        case 'skip':
            fv.value = '';
            break;
        case 'add':
            break;
    }
}

function PSPV2_FormatAutoCompleteItem(items, query)
{
    var result = items[0];
    switch (items[3])
    {
        case 'answer':
            return result;
        case 'add':
            return '<b>Add New: ' + result + '</b>';
        case 'skip':
            return '<b>Leave Blank</b>';
    }
    if (items[3] == 'answer')
    {
        return result;
    }
}

function PSPV2_onSelectionChange(event, params)
{
    if (typeof Payscale != "undefined")
    {
        var result = getCachedDesc(params[1]._oResultData[0]);
        if (result != null)
        {
            PSPV2_onDescriptionLoaded(result, params);
            return;
        }

        Payscale.Public.Services.FieldDescription.GetFullJobDescriptionInfo(
            params[0].profileType,
            params[1]._oResultData[0],
            5, 
            params[0].rollupGroup,
            params[0].fieldName,
            PSPV2_onDescriptionLoaded, 
            PSPV2_onDescriptionLoadFailed, 
            params );
    }
}

function RemoveCodes( e )
{
    //descend to furthest most child node
    while(e.childNodes.length > 0)
        e = e.childNodes[0];

    return e.nodeValue.replace("&amp;","&");
}

function FindChild(e, childId)
{
    for (var i = 0; i < e.childNodes.length; i++)
    {
        if (e.childNodes[i].id == childId)
        {
            return e.childNodes[i];
        }
    }
    return null;
}

function PSPV2_onDescriptionLoaded(result, params)
{
    var jd = document.getElementById('jobDescription');
    if (jd == null)
    {
        jd = document.getElementById('jobDescription_' + params[0].id);
    }
    var completeList = document.getElementById(params[0].completeId);
    var showDesc = ((result[0].length > 0 || result[1].length > 0 || result[2].length > 0)) && 
                   completeList && 
                   completeList._oContent && 
                   completeList._oContent.style.display == "block";

    if (showDesc)
    {
        cacheDesc(params[1]._oResultData[0], result);

        var p;
        if (PS)
            p = PS.findElement(params[1], 2);
        if (!p)
            p = findPos(params[1], 2);

        jd.style.display = "block";
        jd.style.position = 'absolute';
        var highlight = params[1];
        var completeDD = params[1].parentNode.parentNode.parentNode;
        var dd;
        if (PS) {
            var dd = PS.findElement(completeDD);
        }

        var completeX = (dd) ? dd.x : findPosX(completeDD);
        var completeY = (dd) ? dd.y : findPosY(completeDD);

        var windowWidth = 0;
        var nonIE = ( typeof( window.innerWidth ) == 'number' );
        if (nonIE)
        {
            //Non-IE
            windowWidth = window.innerWidth;
        }
        else if (document.documentElement && document.documentElement.clientWidth)
        {
            //IE 6+ in 'standards compliant mode'
            windowWidth = document.documentElement.clientWidth;

        }
        else if (document.body && document.body.clientWidth)
        {
            //IE 4 compatible
            windowWidth = document.body.clientWidth;
        }

        if (completeX + completeDD.clientWidth + jd.clientWidth > windowWidth)
        {
            jd.style.left = '' + (completeX - jd.clientWidth) + 'px';
        }
        else
        {
            jd.style.left = '' + (completeX + p.x + completeDD.clientWidth) + 'px';
        }

        jd.style.top = '' + (3 + completeY + p.y + params[1].clientHeight) + 'px';

        var jt = FindChild(jd, 'jobDescTitle');
        jt.innerHTML = params[1]._oResultData[0];

        var jdDesc = FindChild(jd, 'jobDescDesc');
        if (result[0].length > 0)
        {
            jdDesc.innerHTML = result[0];
            jdDesc.style.display = "block";
        }
        else
        {
            jdDesc.style.display = "none";
        }
        var jdQuestions = FindChild(jd, 'jobDescQuestions');
        if (result[1].length > 0)
        {
            jdQuestions.innerHTML = "Refine by: " + result[1];
            jdQuestions.style.display = "block";
        }
        else
        {
            jdQuestions.style.display = "none";
        }
        var jdRelated = FindChild(jd, 'jobDescRelated');
        if (result[2].length > 0)
        {
            jdRelated.innerHTML = "Possible title variations: " + result[2];
            jdRelated.style.display = "block";
        }
        else
        {
            jdRelated.style.display = "none";
        }
    }
    else
        jd.style.display = "none";
}

function PSPV2_onDescriptionLoadFailed(result, userContext){
    var desc = document.getElementById('jobDescription');
    if (desc)
        desc.style.display = "none";
}

function PSPV2_findPos(oref, i) {
    var value = null;
    if (PS) {
        var temp = PS.findElement(oref, i);
        if (temp)
            value = temp;
    }
    if (!value) {
        var p = { x: 0, y: 0 };
        var o = oref;
        while (o && i-- > 0) {
            p.x += o.offsetLeft;
            p.y += o.offsetTop;
            o = o.offsetParent;
        }
        value = p;
    }
    return value;
}

function PSPV2_onClose( oSelf, p1, p2 )
{
    var desc = document.getElementById('jobDescription');
    if (desc == null)
    {
        desc = document.getElementById('jobDescription_' + p1[0].id);
    }
    if (desc)
        desc.style.display = "none";
} 

function PSPV2_ActivateAutoComplete(id, completeId, fgmId, allowSkip, allowAdd, minCount, wizardID, fieldName, profileType, rollupGroup)
{
    ActivateAutoCompleteBase(id,
                             completeId,
                             fieldName,
                             allowSkip,
                             allowAdd,
                             minCount,
                             false,
                             false,
                             "/complete.aspx",
                             PSPV2_FormatAutoCompleteItem,
                             PSPV2_onCompleteSelected,
                             false,
                             null,
                             fgmId,
                             wizardID,
                             profileType,
                             rollupGroup);
}

function ActivateEasyAutoComplete(id, completeId, fieldName, allowSkip, allowAdd, minCount, showDesc)
{
    ActivateAutoCompleteBase(id, completeId, fieldName, allowSkip, allowAdd, minCount, showDesc, false, null, null, onEasyCompleteSelected, false, null, 0, 0, 0, null);
}

function ActivateAutoCompleteBase(id,
                                  completeId,
                                  fieldName,
                                  allowSkip,
                                  allowAdd,
                                  minCount,
                                  showDesc,
                                  enableScroll,
                                  url,
                                  formatFunc,
                                  selectEvent,
                                  autoHighlight,
                                  containerExpandEvent,
                                  fgmId,
                                  wizardID,
                                  profileType,
                                  rollupGroup)
{
    if( typeof url == "undefined" ) url = "/complete.aspx";
    if( url == null ) url = "/complete.aspx";
    var e = document.getElementById(id);

    if( e.autocomplete == "on" )
        return;
    e.autocomplete = "on";

    if(e.acInitialized)
        return;
    e.acInitialized = true;
    ds[id] = new YAHOO.widget.DS_XHR(url, ['Answers', 'sv', 'vid', 'count', 'type']);
    ds[id].scriptQueryParam = 's';
    if (fgmId != 0)
    {
        ds[id].scriptQueryAppend = 'fgm=' + fgmId + '&ss=' + (allowSkip ? 'y' : 'n') + '&sa=' + (allowAdd ? 'y' : 'n') + '&min=' + minCount;
    }
    else
    {
        ds[id].scriptQueryAppend = 'field=' + fieldName + '&ss=' + (allowSkip ? 'y' : 'n') + '&sa=' + (allowAdd ? 'y' : 'n') + '&min=' + minCount;
    }
    if (wizardID != 0)
    {
        ds[id].scriptQueryAppend += '&wiz=' + wizardID;
    }
    ds[id].scriptQueryAppend += '&rollup=' + rollupGroup;
    
    ac[id] = new YAHOO.widget.AutoComplete(id, completeId, ds[id]);
    if (formatFunc != null)
    {
        ac[id].formatResult = formatFunc;
    }
    ac[id].useShadow = true;
    if (navigator.userAgent.toLowerCase().indexOf('msie 6.0') != -1)
    {
        ac[id].useIFrame = true;
        ac[id]._iFrameSrc = "/spacer.aspx?tag=autocomplete";
    }
    ac[id].itemSelectEvent.subscribe(selectEvent);
    ac[id].fgmId = fgmId;
    ac[id].fieldName = fieldName;
    ac[id].id = id;
	ac[id].maxResultsDisplayed = 12;
    ac[id].queryDelay = 0.25;
	ac[id].autoHighlight = autoHighlight;
    ac[id].completeId = completeId;
    if (enableScroll) ac[id].containerExpandEvent.subscribe(containerExpandEvent);

    if (showDesc)
    {
	    ac[id].itemArrowToEvent.subscribe(onSelectionChange);
        ac[id].itemMouseOverEvent.subscribe(onSelectionChange);
        ac[id].containerCollapseEvent.subscribe(onClose);
        ac[id].fieldID = 337;
    }
    if (wizardID != 0)
    {
        ac[id].itemArrowToEvent.subscribe(PSPV2_onSelectionChange);
        ac[id].itemMouseOverEvent.subscribe(PSPV2_onSelectionChange);
        ac[id].containerCollapseEvent.subscribe(PSPV2_onClose);
        ac[id].fieldName = fieldName;
        ac[id].wizardID = wizardID;
        ac[id].profileType = profileType;
        ac[id].rollupGroup = rollupGroup;
    }
}

function onEasyCompleteSelected(event, params)
{
    var answer = params[1].innerHTML;
    answer = answer.replace(/&amp;/g,"&");
    var fv = document.getElementById(params[0].id);
    fv.value = answer;
}

function onSelectionChange(event, params) {
    Payscale.Public.Services.FieldDescription.GetFieldDescription(
                                                    1, 
                                                    params[0].fieldID, 
                                                    params[1]._oResultData[1], 
                                                    onDescriptionLoaded, 
                                                    onDescriptionLoadFailed, 
                                                    params );
}

function onUploadJobComboLoaded(result, params) {
    var jd = document.getElementById(result[2] + "_desc");
    var optionElement = document.getElementById(result[2]);
    var showDesc = (result[1].length > 0);

    if (showDesc) {
        setTooltipText(optionElement, jd, result[1]);
    }
    else 
    {
        setTooltipText(optionElement, jd, "<i>There is no suggested descriptor currently available for this PayScale job title.</i>");
    }
}

function showToolTip(jd) {
    jd.style.display = "block";
    jd.style.visibility = 'visible';
}

function setTooltipText(optionElement, jd, text) {
    var pos = findPos(optionElement,10);
    var displayOnLeftPadding = (optionElement.offsetLeft - optionElement.offsetWidth - 20);
    var displayOnRightPadding = (optionElement.offsetLeft + optionElement.offsetWidth + 10);
    
    var isOffScreen = (displayOnRightPadding + pos.x + 350) > document.body.clientWidth;

    if (isOffScreen)
        jd.style.left = displayOnLeftPadding + 'px';
    else
        jd.style.left = displayOnRightPadding + 'px';
        
    jd.innerHTML = text;
}

function onUploadJobComboFailed(result, userContext) {
    var desc = document.getElementById(result[2] + "_desc");
    if (desc)
        hide(desc);
}

function showUploadJobComboTooltip(dropDownValue, containerId) {
    var jd = document.getElementById(containerId + "_desc");
    var optionElement = document.getElementById(containerId);
    showToolTip(jd);
    setTooltipText(optionElement, jd, "<img src=\"/images/pro/grid/arrow-loader-yellow.gif\" style=\"vertical-align:middle;\" /> Loading...");
    Payscale.Public.Services.FieldDescription.GetFieldDescriptionFromAnswerValue(1, 337, dropDownValue, containerId, onUploadJobComboLoaded, onUploadJobComboFailed);
}

function hideUploadJobComboTooltip(comboBox) {
    hide(comboBox.get_id() + "_desc");
}

function findPosX(obj)
{
	var curleft = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curleft += obj.offsetLeft
			obj = obj.offsetParent;
		}
	}
	else if (obj.x)
		curleft += obj.x;
	return curleft;
}

function onDescriptionLoaded(result, params) {
    var jd = document.getElementById('jobDescription_' + params[0].completeId);
    var completeList = document.getElementById(params[0].completeId);
    var showDesc = ( result[1].length > 0 );

    if( showDesc )
    {
        var p = findPos(params[1],2);
        jd.style.display = "block";
        var parentPos = findPosX(params[1].parentNode.parentNode.parentNode);

        var windowWidth = 0;
        if( typeof( window.innerWidth ) == 'number' ) {
            //Non-IE
            windowWidth = window.innerWidth;
        } else if( document.documentElement && document.documentElement.clientWidth) {
            //IE 6+ in 'standards compliant mode'
            windowWidth = document.documentElement.clientWidth;
        } else if( document.body && document.body.clientWidth) {
            //IE 4 compatible
            windowWidth = document.body.clientWidth;
        }

        var parentWidth = params[1].parentNode.clientWidth;

        if (parentPos + parentWidth + jd.clientWidth > windowWidth)
        {
            jd.style.left = '' + (- jd.clientWidth - 7) + 'px';
        }
        else
        {
            jd.style.left = '' + (7 + p.x + params[1].parentNode.parentNode.parentNode.clientWidth) + 'px';
        }

        jd.style.top = '' + (3 + p.y + params[1].clientHeight) + 'px';
        jd.innerHTML = result[1];
    }
    else
        jd.style.display = "none";
}

function onDescriptionLoadFailed(result, userContext){
    var desc = document.getElementById('jobDescription_' + params[0].completeId);
    if (desc)
        desc.style.display = "none";
}

function findPos(oref, i) {
	var p = { x:0, y:0 };
	var o = oref;
	while( o && i-- > 0 )
	{
	    p.x += o.offsetLeft;
	    p.y += o.offsetTop;
	    o = o.offsetParent;
	}
	return p;
}  


function onClose( oSelf ){
    
    var desc = document.getElementById('jobDescription_' + this.completeId);
    if (desc)
        desc.style.display = "none";
} 

function checkEnter(e)
{   
    var key;

    if (window.event)
        key = window.event.keyCode;     //IE
    else
        key = e.which;     //firefox

    if (key == 13)
        return false;
    else
        return true;

}

function checkFormTextForClick(element) 
{
    if (element.value == defaultEntryBoxText) 
    {
        element.value = '';
        element.style['color'] = "#000";
    }
}

function checkFormTextForDefaultValue(element) 
{
    if (element.value != defaultEntryBoxText) 
    {
        element.style['color'] = "#000";
    }
}

function checkFormTextForBlur(element) 
{
    if (element.value.length == 0) 
    {
        element.value = defaultEntryBoxText;
        element.style['color'] = "#a1a1a1";
    }
}

function validateFormTextForSubmit(formElementName,form)
{
    var element = document.getElementById(formElementName);
    if (element)
    {
        if (element.value.length > 0 && element.value != defaultEntryBoxText)
        {
            form.submit();
        }
    }
    return false;
}

function OnContainerExpand(event) 
{ 
    var textArea = document.getElementById(this.id);
    if (textArea) textArea.focus();
    setTimeout('ScrollWindow()',100); 
}

function ScrollWindow() {window.scroll(0,1000); }

function ActivateAutoCompleteScroll(id, fieldName, allowSkip, allowAdd, minCount, enableScroll, url)
{
    ActivateAutoCompleteBase(id, id + "_complete", fieldName, allowSkip, allowAdd, minCount, false, enableScroll, url, FormatAutoCompleteItemSimple, AutoCompleteSimpleSelected, true, OnContainerExpand, 0, 0, 0, null);
}

function ActivateAutoCompleteSimple(id, fieldName, allowSkip, allowAdd, minCount, url)
{
    ActivateAutoCompleteScroll(id, fieldName, allowSkip, allowAdd, minCount, false, url);
}

function FormatAutoCompleteItemSimple(items, query)
{
	var result = items[0];
	switch (items[3])
	{
		case 'answer':
			return result;
		case 'add':
			return '<b>Add New: ' + result + '</b>';
		case 'skip':
			return '<b>Leave Blank</b>';
	}
	if (items[3] == 'answer')
	{
		return result;
	}
}

function AutoCompleteSimpleSelected(event, params)
{
    var fv = document.getElementById(params[0].id);
    var answer;
	switch (params[2][3])
	{
        case 'answer':
            answer = RemoveCodes( params[1] );
            fv.value = answer;
            var completeVal = document.getElementById(params[0].completeId + "ValueID");
            
            if (completeVal)
                { completeVal.value = params[2][1]; }
			break;
		case 'skip':
			fv.value = '';
			break;
		case 'add':
			break;
	}
}

function hide(toolTipId) {
  var desc = document.getElementById(toolTipId);
    if (desc)
    {
        desc.style.display = "none";
    }
} 
function findPosition(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		do {
			curleft += obj.offsetLeft;
			curtop += obj.offsetTop;
		} while (obj = obj.offsetParent);
	}
	return [curleft,curtop];
}

function checkAutoCompleteColor(defaultText, input) {
    if (input.value != defaultText) { input.style.color = '#000'; }
}