function showAdvancedSearch() {
  $('fsh_search_secondary').style.display = 'block';
  $('fsh_search_show').style.display = 'none';
  $('fsh_search_hide').style.display = 'inline';
}

function hideAdvancedSearch() {
  $('fsh_search_secondary').style.display = 'none';
  $('fsh_search_show').style.display = 'inline';
  $('fsh_search_hide').style.display = 'none';
}

function showFilters(base) {
  $(base).style.display = 'block';
  $(base+'_show').style.display = 'none';
  $(base+'_hide').style.display = 'inline';
}

function hideFilters(base) {
  $(base).style.display = 'none';
  $(base+'_show').style.display = 'inline';
  $(base+'_hide').style.display = 'none';
}

function positionDragLayer() {
  var imgWidth = $('fsh_show_img').width;;
  var imgHeight = $('fsh_show_img').height;
  var zoomHeight = Element.getHeight($('fsh_zoom_layer'));
  var picOffsets = Element.positionedOffset($('fsh_show_img'));
  $('fsh_drag_layer').style.left = picOffsets[0] + 'px';
  $('fsh_drag_layer').style.top = picOffsets[1] + 'px';
  $('fsh_zoom_layer').style.left = (picOffsets[0]+imgWidth+4) + 'px';
  $('fsh_zoom_layer').style.top = (picOffsets[1]) + 'px';
}

function turnOnZoom(event) {
  Element.setOpacity($('fsh_tint'), 0.7);
  $('fsh_drag_box').style.visibility = 'visible';
  $('fsh_zoom_layer').style.visibility = 'visible';
}

function turnOffZoom(event) {
  Element.setOpacity($('fsh_tint'), 0);
  $('fsh_drag_box').style.visibility = 'hidden';
  $('fsh_zoom_layer').style.visibility = 'hidden';
}

function handleMouseMove(event) {
  var imgWidth = $('fsh_show_img').width;
  var imgHeight = $('fsh_show_img').height;
  var dragWidth = Element.getWidth($('fsh_drag_box'));
  var dragHeight = Element.getHeight($('fsh_drag_box'));
  var dragMinX = 0;
  var dragMinY = 0;
  var dragMaxX = imgWidth - dragWidth;
  var dragMaxY = imgHeight - dragHeight;
  var largeImgWidth = $('fsh_zoom_img').width;
  var largeImgHeight = $('fsh_zoom_img').height;
  var zoomWidth = Element.getWidth($('fsh_zoom_layer'));
  var zoomHeight = Element.getHeight($('fsh_zoom_layer'));
  var zoomMinX = 0;
  var zoomMinY = 0;
  var zoomMaxX = largeImgWidth - zoomWidth;
  var zoomMaxY = largeImgHeight - zoomHeight;

  var dragOffsets = Element.cumulativeOffset($('fsh_drag_layer'));

  var dragX = Event.pointerX(event) - dragOffsets[0] - (dragWidth / 2);
  var dragY = Event.pointerY(event) - dragOffsets[1] - (dragHeight / 2);
  if (dragX > dragMaxX) { dragX = dragMaxX; }
  if (dragX < dragMinX) { dragX = dragMinX; }
  if (dragY > dragMaxY) { dragY = dragMaxY; }
  if (dragY < dragMinY) { dragY = dragMinY; }
  $('fsh_drag_box').style.left = dragX + 'px';
  $('fsh_drag_box').style.top = dragY + 'px';
  $('fsh_drag_img').style.left = (0 - dragX - 1) + 'px';
  $('fsh_drag_img').style.top = (0 - dragY) + 'px';

  // scale the center point and then shift the zoom window based on the zoom window's size
  var zoomX = (Event.pointerX(event) - dragOffsets[0]) / imgWidth * largeImgWidth - (zoomWidth / 2);
  var zoomY = (Event.pointerY(event) - dragOffsets[1]) / imgHeight * largeImgHeight - (zoomHeight / 2);
  if (zoomX > zoomMaxX) { zoomX = zoomMaxX; }
  if (zoomX < zoomMinX) { zoomX = zoomMinX; }
  if (zoomY > zoomMaxY) { zoomY = zoomMaxY; }
  if (zoomY < zoomMinY) { zoomY = zoomMinY; }
  $('fsh_zoom_img').style.left = (0 - zoomX) + 'px';
  $('fsh_zoom_img').style.top = (0 - zoomY) + 'px';
}

function toggleMoreFilter(id, more_id) {
  var moreFilter = $(more_id);

  if (moreFilter.style.display != 'none') {
    moreFilter.style.display = 'none';
  } else {
    var filter = $(id);
    var filterOffsets = Element.cumulativeOffset(filter);
    var moreX = filterOffsets[0]+125;
    var moreY = filterOffsets[1];
  
    moreFilter.style.left = moreX + 'px';
    moreFilter.style.top = moreY + 'px';
    moreFilter.style.display = 'block';
  }
}

function syncInput(elemId) {
  var elem = $(elemId);
  var syncId = '';
  if (elemId.substring(0,1) == 'm') {
    syncId = elemId.replace('m', 'a');
  } else {
    syncId = elemId.replace('a', 'm');
  }
  var syncElem = $(syncId);
  if (syncElem != null) {
    syncElem.checked = elem.checked;
  }
}

function browseSearch() {
  var fsh_filters = $('fsh_filters');

  // put together all checkboxes
  var checkbox_attrs = {}
  var checkboxes = fsh_filters.select('input[type=checkbox]');
  for (var i in checkboxes) {
    if (checkboxes[i].checked == true) {
      var split_id = checkboxes[i].id.split('_');
      if (split_id[0].substring(0,1) == 'a') {
        var attr = split_id[0].substring(1, split_id[0].length);
        var old_vals = checkbox_attrs[attr]
        if (old_vals == null || old_vals == undefined) {
          old_vals = []
        }
        old_vals.push(split_id[1]);
        checkbox_attrs[attr] = old_vals;
      }
    }
  }

  // put together all radio buttons
  var radio_attrs = {}
  var radio_buttons = fsh_filters.select('input[type=radio]');
  for (var i in radio_buttons) {
    if (radio_buttons[i].checked == true) {
      var split_id = radio_buttons[i].id.split('_');
      if (split_id[0].substring(0,1) == 'a') {
        var attr = split_id[0].substring(1, split_id[0].length);
        var old_vals = radio_attrs[attr]
        if (old_vals == null || old_vals == undefined) {
          old_vals = []
        }
        old_vals.push(split_id[1]);
        radio_attrs[attr] = old_vals;
      }
    }
  }

  // generate url
  var url_params = '';
  var base_browse_url = $('fsh_base_browse_url').value;
  var base_designer_url = $('fsh_base_designer_url').value;
  var use_designer_url = false;
  if (base_designer_url != '' && checkbox_attrs['d'] == undefined) {
    use_designer_url = true;
  }

  var first_attr = true;
  for (var attr in checkbox_attrs) {
    if (first_attr) {
      first_attr = false;
      url_params += '?'
    } else {
      url_params += '&'
    }
    url_params += ('a' + attr)
    url_params += '='
    url_params += joinArray(checkbox_attrs[attr], '_')
  }
  for (var attr in radio_attrs) {
    if (attr == 's' && radio_attrs[attr].length == 1 && radio_attrs[attr][0] == 'n') {
      continue;
    }
    if (first_attr) {
      first_attr = false;
      url_params += '?'
    } else {
      url_params += '&'
    }
    url_params += ('a' + attr)
    url_params += '='
    url_params += joinArray(radio_attrs[attr], '_')
  }

  if (use_designer_url) {
    location.href = base_designer_url + url_params;
  } else {
    location.href = base_browse_url + url_params;
  }
  return;
}

function joinArray(array, sep) {
  var str = '';
  for (var i = 0; i < array.length; i++) {
    str += array[i];
    if ((array.length-1) != i) {
      str += sep;
    }
  }
  return str;
}

function frontSearch() {
  var fsh_search = $('fsh_search');
  var selects = fsh_search.select('select');

  var url_params = '';
  var base_browse_url = $('fsh_base_browse_url').value;
  var base_designer_url = $('fsh_base_designer_url').value;
  var use_designer_url = false;
  var first_attr = true;
  for (var si = 0; si < selects.length; si++) {
    var attr = selects[si].id;

    for (var oi = 0; oi < selects[si].options.length; oi++) {
      if (selects[si].options[oi].selected && (selects[si].options[oi].value != null) && (selects[si].options[oi].value != '')) {
        if (attr == 'ad') {
          base_designer_url += '/' + selects[si].options[oi].value;
          use_designer_url = true;
        } else {
          if (first_attr) {
            first_attr = false;
            url_params += '?'
          } else {
            url_params += '&'
          }
          url_params += attr;
          url_params += '='
          url_params += selects[si].options[oi].value;
        }
      }
    }
  }

  if (use_designer_url) {
    location.href = base_designer_url + url_params;
  } else {
    location.href = base_browse_url + url_params;
  }
  return;
}

wed.fshSlideshow = function() {
  // prefix -> data mapping
  // prefix data is a hash with these keys:
  // items: an array of hashes with 3 keys: id, image_url, link_url
  // start: the index of the first item in the current page
  // end: the index of the last item in the current page
  // page_size: the size of a page
  var data = {}

  var wrapperId = function(prefix) {
    return prefix+'_item_container';
  }

  var itemId = function(prefix, item) {
    return prefix+'_item_'+item.id;
  }

  var prevButtonId = function(prefix) {
    return prefix+'_prev';
  }

  var nextButtonId = function(prefix) {
    return prefix+'_next';
  }

  var makeItem = function(prefix, item, display) {
    var html = '<div id="'+itemId(prefix, item)+'" style="display:'+display+'" class="fsh_saved_item">'
    html += '<a rel="nofollow" target="'+data[prefix].link_target+'" href="'+item.link_url+'">'
    html += '<img src="'+item.image_url+'" />'
    html += '</a>'
    html += '</div>'
    return html;
  }

  // determines if we are at the first item of the items array
  var firstItem = function(prefix) {
    return (data[prefix].start <= 0);
  }

  // determines if we are at the last item of the items array
  var lastItem = function(prefix) {
    return (data[prefix].end+1 >= data[prefix].items.length);
  }  

  var validIndex = function(prefix, index) {
    return ((index >= 0) && (index < data[prefix].items.length))
  }

  //  ensures valid value for start var
  var updateStart = function(prefix, newStart) {
    var prefixData = data[prefix];
    if (newStart < 0) {
      prefixData.start = 0;
    } else if (newStart >= prefixData.items.length) {
      prefixData.start = prefixData.items.length - 1;
    } else {
      prefixData.start = newStart;
    }
  }

  // ensures valid value for end var
  var updateEnd = function(prefix, newEnd) {
    var prefixData = data[prefix];
    if (newEnd < 0) {
      prefixData.end = 0;
    } else if (newEnd >= prefixData.items.length) {
      prefixData.end = prefixData.items.length - 1;
    } else {
      prefixData.end = newEnd;
    }
  }

  // end private objects
 
  return {
    // items: an array of hashes with 3 keys: id, image_url, link_url
    load: function(prefix, items, start, page_size, link_target) {
      // figure out boundaries of where items start and end
      var minStart = 0;
      var maxStart = items.length - page_size;
      var realStart = start;
      if (realStart > maxStart) {
        realStart = maxStart;
      }
      if (realStart < minStart) {
        realStart = minStart;
      }
      var realEnd = start+page_size-1;
      var maxEnd = items.length-1;
      if (realEnd > maxEnd ) {
        realEnd = maxEnd;
      }

      // save data
      data[prefix] = {items: items, start: realStart, end: realEnd, page_size: page_size, link_target: link_target};

      // load up initial items
      for (var i = realStart; i <= realEnd; i++) {
        Element.insert($(wrapperId(prefix)), makeItem(prefix, items[i], 'block'));
      }

    },

    prevPage: function(prefix) {
      var prefixData = data[prefix];

      // remove items from current page
      for (var i = prefixData.start; i <= prefixData.end; i++) {
        Element.remove(itemId(prefix, prefixData.items[i]));
      }

      var prevPageStart = prefixData.start - prefixData.page_size; // can be less than 0, but will ignore invalid indices later
      if (firstItem(prefix)) {
        prevPageStart = prefixData.items.length - prefixData.page_size;
      }
      var prevPageEnd = prevPageStart;

      // add items from previous page
      for (var j = prevPageStart; j < prevPageStart+prefixData.page_size; j++) {
        if (validIndex(prefix, j)) {
          Element.insert($(wrapperId(prefix)), makeItem(prefix, prefixData.items[j], 'block'));
          prevPageEnd = j;
        }
      }

      // update counters        
      updateStart(prefix, prevPageStart);
      updateEnd(prefix, prevPageEnd);
    },

    nextPage: function(prefix) {
      var prefixData = data[prefix];

      // remove items from current page
      for (var i = prefixData.start; i <= prefixData.end; i++) {
        Element.remove(itemId(prefix, prefixData.items[i]));
      }

      var nextPageStart = prefixData.end+1;
      if (lastItem(prefix)) {
        nextPageStart = 0;
      }          
      var nextPageEnd = nextPageStart;

      // add items from next page
      for (var j = nextPageStart; j < nextPageStart+prefixData.page_size; j++) {
        if (validIndex(prefix, j)) {
          Element.insert($(wrapperId(prefix)), makeItem(prefix, prefixData.items[j], 'block'));
          nextPageEnd = j;
        }
      }

      // update counters        
      updateStart(prefix, nextPageStart);
      updateEnd(prefix, nextPageEnd);
    },

    toggleShare: function(prefix, suffix) {
      var shareOpts = ['embed', 'link']
      var savedContent = $(prefix+'_content');

      if (suffix == undefined || suffix == null) {
        for (var i = 0; i < shareOpts.length; i++) {
          Element.hide($(prefix+'_'+shareOpts[i]+'_container'));
        }
        Element.show(savedContent);
      } else {

        for (var i = 0; i < shareOpts.length; i++) {
          if (suffix != shareOpts[i]) {
            Element.hide($(prefix+'_'+shareOpts[i]+'_container'));
          }
        }     

        var shareContainer = $(prefix+'_'+suffix+'_container');
        if (Element.visible(shareContainer)) {
          Element.hide(shareContainer);
          Element.show(savedContent);
        } else {
          Element.hide(savedContent);
          Element.show(shareContainer);
          var shareText = $(prefix+'_'+suffix);
          shareText.focus();
        }
      }
    }
  };
} ();

