var currentEffect = [];

function getElementPosition(sourceObj) {
    if (sourceObj.style.left && sourceObj.style.top) {
        // for the W3C-compliant crowd
        return [parseInt(sourceObj.style.left), parseInt(sourceObj.style.top)];
    } else {
        // for the other awful browsers...
        x = sourceObj.offsetLeft;
        y = sourceObj.offsetTop;
        temp = sourceObj;
        while (temp = temp.offsetParent) {
            x += temp.offsetLeft;
            y += temp.offsetTop;
        }
        
        return [x, y];
    }
}

/********************************
 * rollover/menu functions      *
 ********************************/

var hideRolloverTimeouts = [];
var hoveredButtons = [];

function showRollover(target, xMenuOffset, yMenuOffset, xOffset, yOffset) {
    try {
        if (hideRolloverTimeouts[target]) {
            clearTimeout(hideRolloverTimeouts[target]);
            hideRolloverTimeouts[target] = null;
            return;
        }
        
        if (hoveredButtons[target]) {
            return;
        }
        
        var el = $(target + '_hover');
        var sourceObj = $(target + '_std');
        
        var coords = getElementPosition(sourceObj);
        if (typeof(xMenuOffset) == 'undefined') xMenuOffset = 0;
        if (typeof(yMenuOffset) == 'undefined') yMenuOffset = 32;
        if (typeof(xOffset) == 'undefined') xOffset = 0;
        if (typeof(yOffset) == 'undefined') yOffset = 0;
        
        el.style.position = 'absolute';
        el.style.left = coords[0] + xOffset + 'px';
        el.style.top  = coords[1] + yOffset + 'px';
        el.style.zIndex = '100';
        
        if (currentEffect[el.id]) currentEffect[el.id].cancel();
        currentEffect[el.id] = Effect.Appear(el.id, { duration: 0.2 });
        
        // the rest can be broken out into a separate function if desired
        if (el = $(target + '_menu')) {
            el.style.display = 'none';
            el.style.position = 'absolute';
            el.style.left = (coords[0] + xMenuOffset) + 'px';
            el.style.top  = (coords[1] + yMenuOffset) + 'px';
            el.style.zIndex = '100';
            
            for (var i = 0; i < el.childNodes.length; i++) {
                if (el.childNodes[i].tagName == 'DIV') {
                    el.style.width  = el.childNodes[i].style.width;
                    el.style.height = el.childNodes[i].style.height;
                    break;
                }
            }
            if (currentEffect[el.id]) currentEffect[el.id].cancel();
            currentEffect[el.id] = Effect.BlindDown(el.id, { duration: 0.2 });
        }
        
        hoveredButtons[target] = true;
    } catch (e) { }
}

function hideRollover(target) {
    try {
        hideRolloverTimeouts[target] = setTimeout('hideRolloverComplete("' + target + '");', 50);
    } catch (e) {}
}

function hideRolloverComplete(target) {
    try {
        hideRolloverTimeouts[target] = null;
        
        if (el = $(target + '_hover')) {
            if (currentEffect[el.id]) currentEffect[el.id].cancel();
            currentEffect[el.id] = Effect.Fade(el.id, { duration: 0.3 });
        }
        
        // the rest can be broken out into a separate function if desired
        if (el = $(target + '_menu')) {
            if (currentEffect[el.id]) currentEffect[el.id].cancel();
            currentEffect[el.id] = Effect.BlindUp(el.id, { duration: 0.2 });
        }
        
        hoveredButtons[target] = false;
    } catch (e) {}
}


var hideSimpleRolloverTimeouts = [];
function showSimpleRollover(target, xOffset, yOffset) {
    //try {
        // if we were planning to hide this element in the future, no need for that now
        if (hideSimpleRolloverTimeouts[target]) {
            clearTimeout(hideSimpleRolloverTimeouts[target]);
            hideSimpleRolloverTimeouts[target] = null;
            return;
        }
        
        // if other elements are waiting to be hidden, get it over with now
        $H(hideSimpleRolloverTimeouts)._each(function (pair) {
            clearTimeout(pair[1]);
            hideSimpleRolloverComplete(pair[0]);
        });
        
        var el = document.getElementById(target + '_std');
        el.oldsrc = el.src;
        el.src = el.src.replace(/(_hover)?.gif$/, '_hover.gif');
        if (!(is.ie && is.mac)) showSimpleRolloverMenu(target, xOffset, yOffset);
    //} catch (e) {}
}

function showSimpleRolloverMenu(target, xOffset, yOffset, useRelative) {
    //try {
        if (hideSimpleRolloverTimeouts[target]) {
            clearTimeout(hideSimpleRolloverTimeouts[target]);
            hideSimpleRolloverTimeouts[target] = null;
            return;
        }
        
        var el = document.getElementById(target + '_std');
        if (el) {
            var coords = getElementPosition(el);
            
            if (typeof(xOffset) == 'undefined') xOffset = 0;
            if (typeof(yOffset) == 'undefined') yOffset = 30;
            if (typeof(useRelative) == 'undefined') useRelative = false;
            
            if (el = document.getElementById(target + '_menu')) {
                el.style.zIndex = 100;
                el.style.position = 'absolute';
                if (useRelative) {
                    el.style.left = xOffset + 'px';
                    el.style.top  = yOffset + 'px';
                } else {
                    el.style.left = (coords[0] + xOffset) + 'px';
                    el.style.top  = (coords[1] + yOffset) + 'px';
                }
                el.style.display = '';
            }
        }
    //} catch (e) {}
}

function hideSimpleRollover(target) {
    try {
        hideSimpleRolloverTimeouts[target] = setTimeout('hideSimpleRolloverComplete("' + target + '")', 200);
    } catch (e) {}
}

function hideSimpleRolloverComplete(target) {
    try {
        var el = document.getElementById(target + '_std');
        el.src = el.oldsrc;
        hideSimpleRolloverMenuComplete(target);
    } catch (e) {}
}

function hideSimpleRolloverMenu(target) {
    try {
        hideSimpleRolloverTimeouts[target] = setTimeout('hideSimpleRolloverMenuComplete("' + target + '")', 200);
    } catch (e) {}
}

function hideSimpleRolloverMenuComplete(target) {
    try {
        hideSimpleRolloverTimeouts[target] = null;
        
        var el = document.getElementById(target + '_std');
        var coords = getElementPosition(el);
        
        if (el = document.getElementById(target + '_menu')) {
            el.style.display = 'none';
        }
    } catch (e) {}
}


/********************************
 * slideshow functions          *
 ********************************/

var currentSlideIndex = 0;
var maxSlideIndex = -1;

function getNumSlides() {
    if (maxSlideIndex > -1) return maxSlideIndex;
    maxSlideIndex = 0;
    
    while ($('img_slideshow' + maxSlideIndex)) maxSlideIndex++;
    return maxSlideIndex;
}

function nextSlide(delay, transition) {
    if (typeof(transition) == 'undefined') transition = 'SlideAppear';
    changeSlide(delay, transition, 1);
}

function prevSlide(delay, transition) {
    if (typeof(transition) == 'undefined') transition = 'SlideAppear';
    changeSlide(delay, transition, -1);
}

// controls elements named img_slideshowX
// uses a global named currentSlideIndex to keep track of its state
// uses a global named maxSlideIndex to cache the discovered maximum slide index
function changeSlide(delay, transition, increment) {
    try {
        if (typeof(delay) == 'undefined') delay = -1;
        if (typeof(transition) == 'undefined') transition = 'SlideAppear';
        
        // this element is used for positioning
        origimg = $('img_slideshow');
        
        nextSlideIndex = currentSlideIndex + increment;
        if (!$('img_slideshow' + nextSlideIndex)) {
            if (increment > 0) {
                nextSlideIndex = 0;
            } else {
                nextSlideIndex = getNumSlides() - 1;
            }
        }
        
        if ((curimg  = $('img_slideshow' + currentSlideIndex)) &&
            (nextimg = $('img_slideshow' + nextSlideIndex))) {
            // push old images back
            for (var i = 0; i < getNumSlides(); i++) {
                $('img_slideshow' + i).style.zIndex = ((increment > 0) ? i : (getNumSlides() - i));
            }
            nextimg.style.zIndex = '90';
            nextimg.style.margin = '0';
            
            // really shouldn't have to do this, but I just can't figure it out...
            curimg.style.zIndex  = '89';
            
            // drag the new image over the main image
            var coords = getElementPosition(origimg);
            nextimg.style.position = 'absolute';
            nextimg.style.left = coords[0] + 'px';
            nextimg.style.top  = coords[1] + 'px';
            
            eval('Effect.' + transition + '(nextimg.id, { duration: 1.8 });');
            setTimeout('$("' + curimg.id + '").style.display = "none"', 1900);
            if (delay > 0) setTimeout('changeSlide(' + delay + ', "' + transition + '", ' + increment + ');', delay);
            
            currentSlideIndex = nextSlideIndex;
        }
    } catch (e) {}
}

// positions slide navigation elements (named btn_slidenext and btn_slideprev)
// relative to img_slideshow (x and y are the relative offsets)
function positionSlideNav(x, y) {
    try {
        img = $('img_slideshow');
        nav = $('div_slidenav');
        
        // move the buttons to their proper places
        nav.style.zIndex = '95';
        nav.style.position = 'relative';
        nav.style.left = x + 'px';
        nav.style.top  = y + 'px';
    } catch (e) {}
}


/********************************
 * dialog/popup functions       *
 ********************************/

function showPopup(url, w, h) {
    window.open(url, null, 'width=' + w + ',height=' + h);
}

function openDialog(url, w, h, opts) {
    window.open(url, '_blank', 'width=' + w + ',height=' + h + (typeof(opts) == 'undefined' ? '' : ',' + opts));
}

// resize the window to fit the content
function autoResize(masterDiv) {
    if (typeof(masterDiv) == 'undefined') {
        masterDiv = $('masterDiv');
    } else {
        masterDiv = $(masterDiv);
    }
    var max = Math.min(screen.height - 100, 800);
    var ht = Math.min(masterDiv.scrollHeight, max);
    
    if (typeof(window.innerWidth) == 'number') {
        //Non-IE
        myWidth = window.innerWidth;
        myHeight = window.innerHeight;
    } else if (document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight)) {
        //IE 6+ in 'standards compliant mode'
        myWidth = document.documentElement.clientWidth;
        myHeight = document.documentElement.clientHeight;
    } else if (document.body && (document.body.clientWidth || document.body.clientHeight)) {
        //IE 4 compatible
        myWidth = document.body.clientWidth;
        myHeight = document.body.clientHeight;
    }
    
    resizeBy(0, ht - myHeight);
}


/********************************
 * date picker functions        *
 ********************************/

function showDatePicker(object, method_prefix) {
    // anchor picker to the icon
    var coords = getElementPosition($('date_picker_' + object + '_' + method_prefix + 'icon'));
    var el = $('date_picker_' + object + '_' + method_prefix + 'main');
    el.hide();
    el.style.position = 'absolute';
    el.style.left = (coords[0] - 120) + 'px';
    el.style.top  = (coords[1] + 14) + 'px';
    el.show();
}

function hideDatePicker(object, method_prefix) {
    $('date_picker_' + object + '_' + method_prefix + 'main').hide();
    if ($('btn_checkout')) $('btn_checkout').hide();
    if ($('btn_update')) $('btn_update').show();
}

function dpPrevMonth(object, method_prefix, min_year) {
    try {
        if ($(object + '_' + method_prefix + 'month').value > 1) {
            $(object + '_' + method_prefix + 'month').value--;
        } else if ($(object + '_' + method_prefix + 'year').value > min_year) {
            $(object + '_' + method_prefix + 'month').value = 12;
            $(object + '_' + method_prefix + 'year').value--;
        }
    } catch (e) {}
}

function dpNextMonth(object, method_prefix, max_year) {
    try {
        if ($(object + '_' + method_prefix + 'month').value < 12) {
            $(object + '_' + method_prefix + 'month').value++;
        } else if ($(object + '_' + method_prefix + 'year').value < max_year) {
            $(object + '_' + method_prefix + 'month').value = 1;
            $(object + '_' + method_prefix + 'year').value++;
        }
    } catch (e) {}
}


/********************************
 * custom effects               *
 ********************************/

Effect.BlindRight = function(element) {
  element = $(element);
  var oldWidth = Element.getStyle(element, 'width');
  var elementDimensions = Element.getDimensions(element);
  return new Effect.Scale(element, 100, 
    Object.extend({
        scaleContent: false,
        scaleY: false,
        scaleFrom: 0,
        scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
        restoreAfterFinish: true,
        afterSetup: function(effect) { with(Element) {
          makeClipping(effect.element);
            setStyle(effect.element, {width: '0px'});
            show(effect.element);
          }}
    }, arguments[1] || {})
  );
}

Effect.SlideAppear = function(element) {
    element = $(element);
    new Effect.Appear(element, arguments[2] || arguments[1] || {});
    new Effect.BlindRight(element, arguments[1] || {});
}


/********************************
 * column browser interface     *
 ********************************/

var cbNumColumns = 0;
var cbColWidth = '200px';
var cbColHeight = '240px';
var cbBorderWidth = '1px';
var cbColWidthFull = 202;

function cbAddColumn() {
    var currentWidth = parseInt($('columnBrowser').style.width, 10);
    if (currentWidth < ((cbNumColumns+1) * 202)) $('columnBrowser').style.width = '' + ((cbNumColumns+1) * cbColWidthFull) + 'px';
    $('columnBrowser').innerHTML += "<div id=\"columnBrowserLevel" + cbNumColumns + "\" style=\"width: " + cbColWidth + "; height: " + cbColHeight + "; overflow: auto; float: left; border: " + cbBorderWidth + " solid gray;\">Loading...</div>";
    $('columnBrowserLevel' + cbNumColumns).scrollIntoView();
    cbNumColumns++;
}

function cbSelectDept(id) {
    var div = $('cbDept' + id);
    
    // find the current browser level
    var d = div;
    while (d.id.substring(0, 18) != 'columnBrowserLevel') {
        d = d.parentNode;
    }
    var currentLevel = parseInt(d.id.substring(18), 10);
    var allDivs = $A(document.getElementsByTagName('div'));
    
    // remove all higher levels and unselect all other same-level divs
    cbNumColumns = currentLevel + 1;
    allDivs.each(function (d) {
        if (d.id.substring(0, 18) == 'columnBrowserLevel' && parseInt(d.id.substring(18), 10) > currentLevel) {
            d.parentNode.removeChild(d);
        }
        if (d.id.substring(0, 6) == 'cbDept') {
            d.className = 'list_item';
        }
    })
    
    // select and expand current dept div
    div.className = 'list_item_selected';
    cbAddColumn();
    new Ajax.Updater('columnBrowserLevel' + (currentLevel+1), '/manage/bcom/products/list_top_tier_categories/' + id, {asynchronous:true, evalScripts:true});
}

function cbSelectCat(id) {
    var div = $('cbCat' + id);
    
    // find the current browser level
    var d = div;
    while (d.id.substring(0, 18) != 'columnBrowserLevel') {
        d = d.parentNode;
    }
    var currentLevel = parseInt(d.id.substring(18), 10);
    var allDivs = $A(document.getElementsByTagName('div'));
    
    // remove all higher levels and unselect all other same-level divs
    cbNumColumns = currentLevel + 1;
    allDivs.each(function (d) {
        if (d.id.substring(0, 18) == 'columnBrowserLevel' && parseInt(d.id.substring(18), 10) > currentLevel) {
            d.parentNode.removeChild(d);
        }
        if (d.id.substring(0, 5) == 'cbCat') {
            d.className = 'list_item';
        }
    })
    
    // select and expand current dept div
    div.className = 'list_item_selected';
    cbAddColumn();
    new Ajax.Updater('columnBrowserLevel' + (currentLevel+1), '/manage/bcom/products/list_products/' + id, {asynchronous:true, evalScripts:true});
}

function cbSelectProd(id) {
    var div = $('cbProd' + id);
    
    // find the current browser level
    var d = div;
    while (d.id.substring(0, 18) != 'columnBrowserLevel') {
        d = d.parentNode;
    }
    var currentLevel = parseInt(d.id.substring(18), 10);
    var allDivs = $A(document.getElementsByTagName('div'));
    
    // remove all higher levels and unselect all other same-level divs
    cbNumColumns = currentLevel + 1;
    allDivs.each(function (d) {
        if (d.id.substring(0, 18) == 'columnBrowserLevel' && parseInt(d.id.substring(18), 10) > currentLevel) {
            d.parentNode.removeChild(d);
        }
        if (d.id.substring(0, 6) == 'cbProd') {
            d.className = 'list_item';
        }
    })
    
    // select and expand current dept div
    div.className = 'list_item_selected';
    cbAddColumn();
    new Ajax.Updater('columnBrowserLevel' + (currentLevel+1), '/manage/bcom/products/product_detail/' + id, {asynchronous:true, evalScripts:true});
}



function setPageVisibility() {
    var opts = $A($('page_select').options);
    opts.each(function (opt) {
        $(opt.value).hide();
    });
    $($F('page_select')).show();
}
