﻿var msTimeToDisplayMiniatureCartRecentItems = 6000;
var msInbetweenFadeTransitions              = 5;
var msFadeElementOutBackoffDelay            = 1000;
var msFadeElementInBackoffDelay             = 500;
var decimalAmountInbetweenFadeTransitions   = 0.01;

var cancelFadeout = false;

function disableLinkButton(domElement) {
    if(domElement.disabled)
        return; // domElement is already enabled

    domElement.disabled = true;
    domElement.hrefSaved = domElement.href;
    domElement.onclickSaved = domElement.onclick;
    domElement.href = 'javascript:void(0)';
    domElement.onclick = 'return false;';
    
    var imgElement = domElement.getElementsByTagName('img')[0];
    imgElement.src = imgElement.src.replace('.gif', '-disabled.gif');
    imgElement.style.cursor = 'default';
}

function enableLinkButton(domElement) {
    if(!domElement.disabled)
        return; // domElement is already enabled

    domElement.disabled = false;
    domElement.href = domElement.hrefSaved;
    domElement.onclick = domElement.onclickSaved;

    var imgElement = domElement.getElementsByTagName('img')[0];
    imgElement.src = imgElement.src.replace('-disabled.gif', '.gif');
    imgElement.style.cursor = 'pointer';
}

function focusAndSelectElement(domElement) {
    // focus() is broken in Firefox. Setting a timer is a lovely workaround.
    setTimeout(function() { domElement.focus(); domElement.select(); }, 50); 
}

function fadeElementIn(domElement, displayType) {
    if(domElement.doingFadeIn) return; // we're already doing a fade-in.
    else if(domElement.doingFadeOut) {
        cancelFadeout = true;
        // we're already doing a fade-out; we need to wait for that to finish.
        //setTimeout(function() { fadeElementIn(domElement, displayType); }, msFadeElementInBackoffDelay);
        return;
    }
    else if(domElement.style.display != 'none' && domElement.style.display != '') return; // the element is already visible.
    domElement.doingFadeIn = true;
    domElement.style.display = displayType;
    performFadeIn(domElement, 0.0);
}

function performFadeIn(domElement, nextOpacity) {
    if(nextOpacity >= 1.0) {
        domElement.doingFadeIn = false;
        setOpacity(domElement, 1.0);
    }
    else {
        setOpacity(domElement, nextOpacity);
        setTimeout(function() {
            performFadeIn(domElement, nextOpacity + decimalAmountInbetweenFadeTransitions);
        }, msInbetweenFadeTransitions);
    }
}

function fadeElementOut(domElement) {
    if(domElement.doingFadeIn) {
        // we're already doing a fade-in; we need to wait for that to finish.
        setTimeout(function() { fadeElementOut(domElement); }, msFadeElementOutBackoffDelay);
        return;
    }
    domElement.doingFadeOut = true;
    performFadeOut(domElement, 1.0);
}

function completeFadeOut(domElement) {
    domElement.doingFadeOut = false;
    setOpacity(domElement, 0.0);
    domElement.style.display = 'none';
}

function performFadeOut(domElement, nextOpacity) {
    if(cancelFadeout) {
        cancelFadeout = false;
        domElement.doingFadeOut = false;
        domElement.doingFadeIn = true;
        performFadeIn(domElement, nextOpacity);
    }
    else if(!domElement.doingFadeOut)    // would be false if fade out was ended early by completeFadeOut()
        return;

    if(nextOpacity <= 0.0)
        completeFadeOut(domElement);
    else {
        setOpacity(domElement, nextOpacity);
        setTimeout(function() { performFadeOut(domElement, nextOpacity - decimalAmountInbetweenFadeTransitions); }, msInbetweenFadeTransitions);
    }
}

function setOpacity(domElement, opacityValue) {
    // good browsers
	domElement.style.opacity = opacityValue;
	
	// Internet Explorer
	domElement.style.filter = 'alpha(opacity=' + Math.round(opacityValue * 100.0) + ')';
}

function fixDropdownValues(domDropdown, possibleValues, disabledValues) {
    // add the missing values
    for(var key in possibleValues)
        if(!doesDropdownValueExist(domDropdown, key)) {
            var option = document.createElement('option');
            option.value = key;
            
            var keyParts = key.split('::::');
            option.innerHTML = keyParts[keyParts.length > 1 ? 1 : 0];
            
            domDropdown.appendChild(option);
        }
        
    var options = domDropdown.getElementsByTagName('option');
    var elementsToRemove = Array();
    for(var i = 0; i < options.length; ++i)
        if(options[i].value != '' && !possibleValues[options[i].value])
            elementsToRemove.push(options[i]); // wait until the loop is done to mess with domDropdown
    for(var i = 0; i < elementsToRemove.length; ++i)
        domDropdown.removeChild(elementsToRemove[i]);
        
    if(disabledValues) {
        options = domDropdown.getElementsByTagName('option');
        for(var i = 0; i < options.length; ++i) {
            options[i].style.color = disabledValues[options[i].value] ? '#aaa' : '#000';
            options[i].disabled = disabledValues[options[i].value];
            if(disabledValues[options[i].value] && options[i].selected)
                options[0].selected = true;
        }
    }
}

function doesDropdownValueExist(domDropdown, value) {
    var options = domDropdown.getElementsByTagName('option');
    for(var i = 0; i < options.length; ++i)
        if(options[i].value == value)
            return true;
    
    return false;
}

