// JavaScript Document

function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}
function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}

/**
 * Upgrade prototype to support mouseenter/leave across all browsers
 */
//mouseenter, mouseleave
//from http://dev.rubyonrails.org/attachment/ticket/8354/event_mouseenter_106rc1.patch
Object.extend(Event, (function() {
var cache = Event.cache;

function getEventID(element) {
  if (element._prototypeEventID) return element._prototypeEventID[0];
  arguments.callee.id = arguments.callee.id || 1;
  return element._prototypeEventID = [++arguments.callee.id];
}

function getDOMEventName(eventName) {
  if (eventName && eventName.include(':')) return "dataavailable";
  //begin extension
  if(!Prototype.Browser.IE){
    eventName = {
      mouseenter: 'mouseover',
      mouseleave: 'mouseout'
    }[eventName] || eventName;
  }
  //end extension
  return eventName;
}

function getCacheForID(id) {
  return cache[id] = cache[id] || { };
}

function getWrappersForEventName(id, eventName) {
  var c = getCacheForID(id);
  return c[eventName] = c[eventName] || [];
}

function createWrapper(element, eventName, handler) {
  var id = getEventID(element);
  var c = getWrappersForEventName(id, eventName);
  if (c.pluck("handler").include(handler)) return false;

  var wrapper = function(event) {
    if (!Event || !Event.extend ||
      (event.eventName && event.eventName != eventName))
        return false;

    Event.extend(event);
    handler.call(element, event);
  };
  
  //begin extension
  if(!(Prototype.Browser.IE) && ['mouseenter','mouseleave'].include(eventName)){
    wrapper = wrapper.wrap(function(proceed,event) {  
      var rel = event.relatedTarget;
      var cur = event.currentTarget;      
      if(rel && rel.nodeType == Node.TEXT_NODE)
        rel = rel.parentNode;  
      if(rel && rel != cur && !rel.descendantOf(cur))  
        return proceed(event);
    });  
  }
  //end extension

  wrapper.handler = handler;
  c.push(wrapper);
  return wrapper;
}

function findWrapper(id, eventName, handler) {
  var c = getWrappersForEventName(id, eventName);
  return c.find(function(wrapper) { return wrapper.handler == handler });
}

function destroyWrapper(id, eventName, handler) {
  var c = getCacheForID(id);
  if (!c[eventName]) return false;
  c[eventName] = c[eventName].without(findWrapper(id, eventName, handler));
}

function destroyCache() {
  for (var id in cache)
    for (var eventName in cache[id])
      cache[id][eventName] = null;
}

if (window.attachEvent) {
  window.attachEvent("onunload", destroyCache);
}

return {
  observe: function(element, eventName, handler) {
    element = $(element);
    var name = getDOMEventName(eventName);

    var wrapper = createWrapper(element, eventName, handler);
    if (!wrapper) return element;

    if (element.addEventListener) {
      element.addEventListener(name, wrapper, false);
    } else {
      element.attachEvent("on" + name, wrapper);
    }

    return element;
  },

  stopObserving: function(element, eventName, handler) {
    element = $(element);
    var id = getEventID(element), name = getDOMEventName(eventName);

    if (!handler && eventName) {
      getWrappersForEventName(id, eventName).each(function(wrapper) {
        element.stopObserving(eventName, wrapper.handler);
      });
      return element;

    } else if (!eventName) {
      Object.keys(getCacheForID(id)).each(function(eventName) {
        element.stopObserving(eventName);
      });
      return element;
    }

    var wrapper = findWrapper(id, eventName, handler);
    if (!wrapper) return element;

    if (element.removeEventListener) {
      element.removeEventListener(name, wrapper, false);
    } else {
      element.detachEvent("on" + name, wrapper);
    }

    destroyWrapper(id, eventName, handler);

    return element;
  },

  fire: function(element, eventName, memo) {
    element = $(element);
    if (element == document && document.createEvent && !element.dispatchEvent)
      element = document.documentElement;

    var event;
    if (document.createEvent) {
      event = document.createEvent("HTMLEvents");
      event.initEvent("dataavailable", true, true);
    } else {
      event = document.createEventObject();
      event.eventType = "ondataavailable";
    }

    event.eventName = eventName;
    event.memo = memo || { };

    if (document.createEvent) {
      element.dispatchEvent(event);
    } else {
      element.fireEvent(event.eventType, event);
    }

    return Event.extend(event);
  }
};
})());

Object.extend(Event, Event.Methods);

Element.addMethods({
fire:      Event.fire,
observe:    Event.observe,
stopObserving:  Event.stopObserving
});

Object.extend(document, {
fire:      Element.Methods.fire.methodize(),
observe:    Element.Methods.observe.methodize(),
stopObserving:  Element.Methods.stopObserving.methodize()
});

/*
 * 
 * dropdown menu support
 * 
 */
var DDSPEED = 10;
var DDTIMER = 15;


// main function to handle the mouse events //
function ddMenu(id,d){
  var h = document.getElementById(id + '-ddheader');
  var c = document.getElementById(id + '-ddcontent');
  
  if (!c){
	  //error
	  return false;
  }
  
  clearInterval(c.timer);
  if(d == 1){
    clearTimeout(h.timer);
    
    c.style.display = 'block';
    
    if(c.maxh && c.maxh <= c.offsetHeight){return}
    else if(!c.maxh){
      c.style.display = 'block';
      c.style.height = 'auto';
      c.maxh = c.offsetHeight;
      c.style.height = '0px';
    }
    c.timer = setInterval(function(){ddSlide(c,1)},DDTIMER);
  }else{
    h.timer = setTimeout(function(){ddCollapse(c)},50);
  }
}

// collapse the menu //
function ddCollapse(c){
  c.timer = setInterval(function(){ddSlide(c,-1)},DDTIMER);
}

// cancel the collapse if a user rolls over the dropdown //
function cancelHide(id){
  var h = document.getElementById(id + '-ddheader');
  var c = document.getElementById(id + '-ddcontent');
  clearTimeout(h.timer);
  clearInterval(c.timer);
  if(c.offsetHeight < c.maxh){
    c.timer = setInterval(function(){ddSlide(c,1)},DDTIMER);
  }
}

// incrementally expand/contract the dropdown and change the opacity //
function ddSlide(c,d){
  var currh = c.offsetHeight;
  var dist;
  if(d == 1){
    dist = (Math.round((c.maxh - currh) / DDSPEED));
  }else{
    dist = (Math.round(currh / DDSPEED));
  }
  if(dist <= 1 && d == 1){
    dist = 1;
  }
  c.style.height = currh + (dist * d) + 'px';
  
  opval = currh / c.maxh;
  if (opval > 0.9){
  	opval = 0.9;
  }
  
  c.style.opacity = opval;
  c.style.filter = 'alpha(opacity=' + (opval * 100) + ')';
  if((currh < 2 && d != 1) || (currh > (c.maxh - 2) && d == 1)){
    clearInterval(c.timer);
  }
  
  //custom: if height < 5, hide
  if(currh < 5 && d != 1){
	  c.style.display = 'none';
  }
  
}



/**
 * Handle search box
 */
Event.observe(document,'dom:loaded',function(){
	if ($('searchInput')){
		$('searchInput').observe('focus',function(){
			$('searchInput').setValue('').setStyle({color: '#000'});
		});
		
		$('searchInput').observe('blur',function(){
			if (($('searchInput').getValue() == '-- Search Store --') || ($('searchInput').getValue() == '')){
				$('searchInput').setValue('-- Search Store --').setStyle({color: '#0377CD'});
			}
		});
		
		//handle submission
		$('searchInput').observe('keydown',function(k){
			if (k.keyCode == Event.KEY_RETURN){
				if (checkSearchValue()){
					location.href='/store/search?q=' + escape($('searchInput').getValue());
				}
			}
		});
		$('searchButton').observe('click',function(e){
			Event.stop(e);
			if (checkSearchValue()){
				location.href='/store/search?q=' + escape($('searchInput').getValue());
			}
		});
	}
});

checkSearchValue = function(){
	
	if ($('searchInput').getValue() == '-- Search Store --'){
			//add new tip
			stem = 'topMiddle';
			hookoptions = { mouse: false, tip: 'middleTop' , target: 'middleTop'};
		
		
			new Tip('searchInput', "Please enter a search term", {
				title: "",
				style: 'protogrey_b4',
				stem: stem,
				hook: hookoptions,
				offset: { x: 5, y: 11 },
				width: 180,
				hideOthers : true/*,
				hideAfter: 10,
				hideOn: false*/
			});
			
			//immediately show
			$('searchInput').prototip.show();
		return false;
	}
	
	return true;
};