var shortListDetailsStatus=0;
var shortList_url = 'shortlist_xml.asp';
var shortlist_addclass = 'shortList_add';
var shortlist_removeclass = 'shortList_remove';
var shortlist_itemLinkURL = new Array('?shortlist=add&', '?action=remove_shortlist_item&shortlist=My Shortlist&');


$(document).ready(function() {
	

	//load the existing short list items
	loadShortListDetails();
	
	//$("#mytrip_details").load(shortList_url);

	//set the escape key to close the short list details box
	$(document).keypress(function(e){  
		if(e.keyCode==27 && shortListDetailsStatus==1){  
			$("#mytrip_details").slideUp('fast');
			shortListDetailsStatus = 0;
		}
	});



	//first load the href for each item, parse the ids out and store them as data
	$("a.shortListItem").each(
		function(){
			itemLink = $(this).attr("href");
			
			itemInfo = itemLink.split('&');
			itemType = getvaluefromstring('type',itemLink);//itemInfo[1].replace('type=','');
			itemId =  getvaluefromstring('item',itemLink);//itemInfo[0].replace('item=','');
			shortListID = getvaluefromstring('shortlist',itemLink);
			//store the data
			$(this).data('itemid',itemId).data('itemtype', itemType).data('shortlist', shortListID);
			
			//replace the existing link with a void
			$(this).attr('href','javascript:void(0);');
			if(shortList_ItemExists(itemType, itemId)){
				//$(this).addClass(shortlist_removeclass);
				$(this).html("Remove From <br/> My Trip Builder")
					
			}else{
				//$(this).addClass(shortlist_addclass);
				$(this).html("Add to My<br/>  Trip Builder")
			}
		}//add the click function
	).click(
		function() {
			var obj = $(this);
			var clone = obj.parent().parent().find(".shortlist_graphic").clone(true);
			var parent = $(this).parent();
			//alert($(this).data('itemtype')+' - '+ $(this).data('itemid'));
			if(shortList_ItemExists($(this).data('itemtype'), $(this).data('itemid'))!=true){
				addToShortList($(this).data('itemtype'), $(this).data('itemid'), $(this).data('shortlist'));
				clone.prependTo(parent);	
				animateTo(clone, "#mytrip");

				$(this).html("Remove From <br/> My Trip Builder")
				//$(this).html("Remove")
			}else{
				removeFromShortList($(this).data('itemtype'), $(this).data('itemid'), $(this).data('shortlist'));
				//$(this).html("Add To My Mornington")
				$(this).html("Add to  My<br/> Trip  Builder")
			}
		
		}
   );

   //first load the href for each item, parse the ids out and store them as data
	$("a.shortlist_add_item_graphic").each(
		function(){
			itemLink = $(this).attr("href");
			
			itemInfo = itemLink.split('&');
			itemType = getvaluefromstring('type',itemLink);//itemInfo[1].replace('type=','');
			itemId =  getvaluefromstring('item',itemLink);//itemInfo[0].replace('item=','');
			shortListID = getvaluefromstring('shortlist',itemLink);
			//store the data
			$(this).data('itemid',itemId).data('itemtype', itemType).data('shortlist', shortListID);
			
			//replace the existing link with a void
			$(this).attr('href','javascript:void(0);');
			if(shortList_ItemExists(itemType, itemId)){
				//$(this).addClass(shortlist_removeclass);
				//$(this).html("Remove From <br/> My Mornington <br/> Peninsula")
					
			}else{
				//$(this).addClass(shortlist_addclass);
				//$(this).html("Add to <br/> My Mornington <br/> Peninsula")
			}
		}//add the click function
	).click(
		function() {
			var obj = $(this);
			var clone = obj.parent().parent().find(".shortlist_graphic").clone(true);
			var parent = $(this).parent();
			//alert($(this).data('itemtype')+' - '+ $(this).data('itemid'));
			if(shortList_ItemExists($(this).data('itemtype'), $(this).data('itemid'))!=true){
				addToShortList($(this).data('itemtype'), $(this).data('itemid'), $(this).data('shortlist'));
				clone.prependTo(parent);	
				animateTo(clone, "#mytrip");

				//$(this).html("Remove From <br/> My Mornington <br/> Peninsula")
				$(this).parent().parent().find(".shortlist_add_item").html("Remove From <br/> My Trip <br/> Builder")
				//$(this).html("Remove")
			}else{
				removeFromShortList($(this).data('itemtype'), $(this).data('itemid'), $(this).data('shortlist'));
				//$(this).html("Add To My Mornington")

				$(this).parent().parent().find(".shortlist_add_item").html("Add to <br/> My Trip <br/> Builder")
				//$(this).html("Add to <br/> My Mornington <br/> Peninsula")
			}
		
		}
   );

   $(".my_trip").attr("href","javascript:void(0);");
   //$("#mytrip_details").click(function(){$("#mytrip_details").slideUp('fast');shortListDetailsStatus=0;});
   //$(".my_trip").click(function() {
	$("#button_mytrip").click(function() {
		if(shortListDetailsStatus==1){
			$("#mytrip_details").slideUp('fast');
			shortListDetailsStatus=0;
		}else{
			loadShortListDetails();
			$("#mytrip_details").css("width", "215px");
			$("#mytrip_details").css("height", "280px");
			$("#mytrip_details").css("position", "absolute");
			$("#mytrip_details").css("border", "1px solid #ccc");
			$("#mytrip_details").css("color", "white");
			$("#mytrip_details").css("background-color", "#F1F1F1");
			$("#mytrip_details").css("padding", "10px");
			$("#mytrip_details").css("overflow", "auto");
			//$("#mytrip_details").css("overflow-y", "scroll");
			$("#mytrip_details").css("top", $(this).offset().top+20);
			$("#mytrip_details").css("left", $(this).offset().left );
			$("#mytrip_details").slideDown('slow');
			shortListDetailsStatus = 1;
		}
   });

	
	$("#shortlist_column").find(".shortlist_boxes_title_yellow").not(':first').parent().find(".shortlist_boxes_text_white").slideUp("fast");
	$("#tripbuilder_column").find(".shortlist_boxes_title_yellow").not(':first').parent().find(".shortlist_boxes_text_white").slideUp("fast");

	$("#shortlist_column").find(".shortlist_boxes_title_yellow").click(function(){

		$("#shortlist_column").find(".shortlist_boxes_text_white").slideToggle("fast");
	});

	$("#tripbuilder_column").find(".shortlist_boxes_title_yellow").click(function(){

		$("#tripbuilder_column").find(".shortlist_boxes_text_white").slideToggle("fast");
	});
 });


//check if a short list item exists in the shortlist item array
function shortList_ItemExists(item_type, item_id){
	bFound = false;
	//alert(shortListItems.length);
	if(isArray(shortListItems)){
	for(i=0;i<shortListItems.length;i++){
		//alert(shortListItems[i]);
		myitem = shortListItems[i];
		if(myitem[0]==item_type && myitem[1]==item_id){
			bFound = true;
		}
	}
	}
	return bFound;
}

function addToShortList(item_type, item_id, shortList){
	var randomnumber=Math.floor(Math.random()*11)
	var d = new Date();
	var myDate = d.getTime(); 
	//$.get(shortList_url, {'action':'add_shortlist_item', 'item':item_id, 'type':item_type, 'shortlist':shortList, 'ajax':'1'}, loadShortListDetails);
	$.ajax({
	  type: "GET",
	  url: shortList_url+'?action=add_shortlist_item&item='+item_id+'&type='+item_type+'&shortlist='+shortList+'&ajax=1&xhygft='+randomnumber+'&refdate='+myDate,
	  //data: 'getXML=true&shortlist=',
		success: loadShortListDetails,
		error: function (XMLHttpRequest, textStatus, errorThrown) {
			// typically only one of textStatus or errorThrown 
			// will have info
			//this; // the options for this ajax request
			//alert(errorThrown);
}

	});
}

function removeFromShortList(item_type, item_id, shortList){
	var randomnumber=Math.floor(Math.random()*11);
	var d = new Date();
	var myDate = d.getTime();
	//$.get(shortList_url, {'action':'remove_shortlist_item', 'item':item_id,'type':item_type,'ajax':'1'}, loadShortListDetails);
	$.ajax({
	  type: "GET",
	  url: shortList_url+'?action=remove_shortlist_item&item='+item_id+'&type='+item_type+'&shortlist='+shortList+'&ajax=1&xhygft='+randomnumber+'&refdate='+myDate,
	  //data: 'getXML=true&shortlist=',
		success: loadShortListDetails,
		error: function (XMLHttpRequest, textStatus, errorThrown) {
			// typically only one of textStatus or errorThrown 
			// will have info
			//this; // the options for this ajax request
			alert(errorThrown);
}

	});
}

function animateTo(itemFrom, itemTo){
	var pos = itemFrom.position();
	var pos2 = $(itemTo).position();
	var myTop = 0;
	//alert(pos.left);
	itemFrom.css('position', 'absolute');
	//itemFrom.css('background-color', 'red');
	itemFrom.css({'left' : pos.left, "top" :pos.top});
	itemFrom.appendTo("body");
	if(pos2.top > $(window).scrollTop()){
		myTop = pos2.top;
	}else{
		myTop = $(window).scrollTop()-30;
	}
	itemFrom.animate({'left' : pos2.left, "top" : myTop }, 1000);
	itemFrom.fadeOut('fast');
}

function loadShortListDetails(xmlResponse, textStatus){
	var randomnumber=Math.floor(Math.random()*11)
	var d = new Date();
	var myDate = d.getTime(); 


	$("#mytrip_details").html("");
	var itemdiv = $('<br/><br/><div style="position: absolute; z-index: 400000000; width: 100%; float: left;"><center><img src="/assets/loading.gif" /></center></div>');
		$('#mytrip_details').append(itemdiv);
	shortListItems = new Array();
	//$.get(shortList_url, {'getXML':'true','shortlist':''}, processShortListDetails);
	//prompt('', shortList_url+'?getXML=true&xhygft='+randomnumber+'&refdate='+myDate);
	$.ajax({
	  type: "GET",
	  url: shortList_url+'?getXML=true&xhygft='+randomnumber+'&refdate='+myDate,
	  //data: 'getXML=true&shortlist=',
		success: processShortListDetails,
		error: function (XMLHttpRequest, textStatus, errorThrown) {
			// typically only one of textStatus or errorThrown 
			// will have info
			//this; // the options for this ajax request
			//alert(errorThrown);
}

	});

}

function processShortListDetails(xmlResponse, textStatus){
	//alert('refreshing');
	//alert(xmlResponse);
	$("#mytrip_details").html("");
	var items = $(xmlResponse).find('shortListItem');
	var itemdiv = $('<div class="visit_shortList_button"><a href="shortlist.asp"><b>VIEW AND PRINT BROCHURE</b></a></div><br/>');
	var headerDiv = $('<div class="shortlist_boxes_title_yellow_sm" style="width:200px;">This is your Shortlist</div>');
	$('#mytrip_details').append(itemdiv);
	$('#mytrip_details').append(headerDiv);
	//clear the short list array
	for(i=0;i<items.length;i++){
		
		var itemtype = $(items[i]).find('item_type').text();
		var itemid = $(items[i]).find('item_id').text();
		var itemname = $(items[i]).find('item_name').text();
		var itemimage = $(items[i]).find('item_image').text();
		var itemcontent = $(items[i]).find('item_content').text();
		var itemlink = $(items[i]).find('item_link').text();
	
		shortListItems[shortListItems.length] = new Array(itemtype, itemid);

		var itemdiv = $('<div class="shortListItem_wrapper"><div class="shortListItem_title"><a href="'+itemlink+'">'+itemname+'</a></div><div class="shortListItem_image"><img src="'+itemimage+'" /></div><div class="shortListItem_text"><div class="shortListItem_float">'+itemcontent+'</div></div><div class="shortListItem_toolbar"><div class="grey_button" style="float: right;"><div class="grey_button_left"></div><div class="grey_button_center"><a href="javascript:void(0);" onclick="javascript:removeFromShortList('+itemtype+','+itemid+',\'\');">Remove</a></div><div class="grey_button_right"></div></div></div></div>');
		$('#mytrip_details').append(itemdiv);
		
	}

	if(items.length == 0){
		
		var itemdiv = $('<br/><br/><br/><br/><br/><br/><div class="cta_wrapper"><div class="cta_text" style="width: 207px;color:#333;font-family:arial; font-size: 11px; ;padding:3px;"><b>Create your own itinerary for your visit to Mornington Peninsula.</b><p>Browse through the website and click &#147;Add To My Trip Builder&#148; to create a shortlist of operators, events and news items to organise, view, email and print.</p></div></div>');
		$('#mytrip_details').append(itemdiv);
	}else{
		
	}
	

	$("a.shortListItem").each(
		function(){
			
			if(shortList_ItemExists($(this).data('itemtype'), $(this).data('itemid'))){
				$(this).removeClass(shortlist_addclass);
				$(this).addClass(shortlist_removeclass);
			}else{
				$(this).removeClass(shortlist_removeclass);
				$(this).addClass(shortlist_addclass);
			}
		}
	)
}

	function getvaluefromstring(name, sstring)
	{
	  name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
	  var regexS = "[\\?&]"+name+"=([^&#]*)";
	  var regex = new RegExp( regexS );
	  var results = regex.exec( sstring );
	  if( results == null )
		return "";
	  else
		return results[1];
	}

	function pausecomp(millis) 
	{
	var date = new Date();
	var curDate = null;

	do { curDate = new Date(); } 
	while(curDate-date < millis);
	} 


	function isArray(obj) {
   if (obj.constructor.toString().indexOf("Array") == -1)
      return false;
   else
      return true;
}

var accordian_in_hover=false;
$(document).ready(
	function() {	
		//set the hover status to show the link pointer on the titles of all accordian items
		$(".accordian_title").css("cursor", "pointer");

		//for each accordian group, close any item that does not have a class of "accordian_startopen"
		$(".accordian").find(".accordian_content").not(":first").slideUp(500);
	
		//add the hover handler to all title items
		$(".accordian_title").hover(
			function(){
				if(!accordian_in_hover){
					accordian_in_hover = true;
					

					//toggle the status of the clicked item
					$(this).next().slideToggle(500);
//hide all the items in this accordian except the clicked one
					$(this).parent().parent().find(".accordian_content").not($(this).next()).slideUp(500);
					accordian_in_hover = false;
				}
			}		
		);//end click
	}
);//end document ready


$(document).ready(
	function() {
		// handle themes
		$("#theme_items .fp_drop_item").hover(function(){
			var desc = 'Click to follow our <b>' + $(this).attr("alt") + '</b> Theme';
			
			$("#theme_drop_text").html(desc)
			$("#theme_drop").slideDown(800);
		},
		function(){});

		$("#theme_items").hover(function(){},
		function(){
			$("#theme_drop").slideUp(800);
		});


		//handle regions
		$("#region_items .fp_drop_item").hover(function(){
			var desc = "";
			if($(this).attr("alt")=="This colour indicates businesses that operate Peninsula wide") {
				desc = 'This colour indicates businesses that operate Peninsula wide.';
			} else {
				desc = 'Click to follow our <b>' + $(this).attr("alt") + '</b> Region.';
			}
			$("#region_drop_text").html(desc)
			$("#region_drop").slideDown(800);
		},
		function(){});

		$("#region_items").hover(function(){},
		function(){
			$("#region_drop").slideUp(800);
		});
});

//v1.7
// Flash Player Version Detection
// Detect Client Browser type
// Copyright 2005-2007 Adobe Systems Incorporated.  All rights reserved.
var isIE  = (navigator.appVersion.indexOf("MSIE") != -1) ? true : false;
var isWin = (navigator.appVersion.toLowerCase().indexOf("win") != -1) ? true : false;
var isOpera = (navigator.userAgent.indexOf("Opera") != -1) ? true : false;

function ControlVersion()
{
	var version;
	var axo;
	var e;

	// NOTE : new ActiveXObject(strFoo) throws an exception if strFoo isn't in the registry

	try {
		// version will be set for 7.X or greater players
		axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
		version = axo.GetVariable("$version");
	} catch (e) {
	}

	if (!version)
	{
		try {
			// version will be set for 6.X players only
			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
			
			// installed player is some revision of 6.0
			// GetVariable("$version") crashes for versions 6.0.22 through 6.0.29,
			// so we have to be careful. 
			
			// default to the first public version
			version = "WIN 6,0,21,0";

			// throws if AllowScripAccess does not exist (introduced in 6.0r47)		
			axo.AllowScriptAccess = "always";

			// safe to call for 6.0r47 or greater
			version = axo.GetVariable("$version");

		} catch (e) {
		}
	}

	if (!version)
	{
		try {
			// version will be set for 4.X or 5.X player
			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
			version = axo.GetVariable("$version");
		} catch (e) {
		}
	}

	if (!version)
	{
		try {
			// version will be set for 3.X player
			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
			version = "WIN 3,0,18,0";
		} catch (e) {
		}
	}

	if (!version)
	{
		try {
			// version will be set for 2.X player
			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
			version = "WIN 2,0,0,11";
		} catch (e) {
			version = -1;
		}
	}
	
	return version;
}

// JavaScript helper required to detect Flash Player PlugIn version information
function GetSwfVer(){
	// NS/Opera version >= 3 check for Flash plugin in plugin array
	var flashVer = -1;
	
	if (navigator.plugins != null && navigator.plugins.length > 0) {
		if (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]) {
			var swVer2 = navigator.plugins["Shockwave Flash 2.0"] ? " 2.0" : "";
			var flashDescription = navigator.plugins["Shockwave Flash" + swVer2].description;
			var descArray = flashDescription.split(" ");
			var tempArrayMajor = descArray[2].split(".");			
			var versionMajor = tempArrayMajor[0];
			var versionMinor = tempArrayMajor[1];
			var versionRevision = descArray[3];
			if (versionRevision == "") {
				versionRevision = descArray[4];
			}
			if (versionRevision[0] == "d") {
				versionRevision = versionRevision.substring(1);
			} else if (versionRevision[0] == "r") {
				versionRevision = versionRevision.substring(1);
				if (versionRevision.indexOf("d") > 0) {
					versionRevision = versionRevision.substring(0, versionRevision.indexOf("d"));
				}
			}
			var flashVer = versionMajor + "." + versionMinor + "." + versionRevision;
		}
	}
	// MSN/WebTV 2.6 supports Flash 4
	else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.6") != -1) flashVer = 4;
	// WebTV 2.5 supports Flash 3
	else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.5") != -1) flashVer = 3;
	// older WebTV supports Flash 2
	else if (navigator.userAgent.toLowerCase().indexOf("webtv") != -1) flashVer = 2;
	else if ( isIE && isWin && !isOpera ) {
		flashVer = ControlVersion();
	}	
	return flashVer;
}

// When called with reqMajorVer, reqMinorVer, reqRevision returns true if that version or greater is available
function DetectFlashVer(reqMajorVer, reqMinorVer, reqRevision)
{
	versionStr = GetSwfVer();
	if (versionStr == -1 ) {
		return false;
	} else if (versionStr != 0) {
		if(isIE && isWin && !isOpera) {
			// Given "WIN 2,0,0,11"
			tempArray         = versionStr.split(" "); 	// ["WIN", "2,0,0,11"]
			tempString        = tempArray[1];			// "2,0,0,11"
			versionArray      = tempString.split(",");	// ['2', '0', '0', '11']
		} else {
			versionArray      = versionStr.split(".");
		}
		var versionMajor      = versionArray[0];
		var versionMinor      = versionArray[1];
		var versionRevision   = versionArray[2];

        	// is the major.revision >= requested major.revision AND the minor version >= requested minor
		if (versionMajor > parseFloat(reqMajorVer)) {
			return true;
		} else if (versionMajor == parseFloat(reqMajorVer)) {
			if (versionMinor > parseFloat(reqMinorVer))
				return true;
			else if (versionMinor == parseFloat(reqMinorVer)) {
				if (versionRevision >= parseFloat(reqRevision))
					return true;
			}
		}
		return false;
	}
}

function AC_AddExtension(src, ext)
{
  if (src.indexOf('?') != -1)
    return src.replace(/\?/, ext+'?'); 
  else
    return src + ext;
}

function AC_Generateobj(objAttrs, params, embedAttrs) 
{ 
  var str = '';
  if (isIE && isWin && !isOpera)
  {
    str += '<object ';
    for (var i in objAttrs)
    {
      str += i + '="' + objAttrs[i] + '" ';
    }
    str += '>';
    for (var i in params)
    {
      str += '<param name="' + i + '" value="' + params[i] + '" /> ';
    }
    str += '</object>';
  }
  else
  {
    str += '<embed ';
    for (var i in embedAttrs)
    {
      str += i + '="' + embedAttrs[i] + '" ';
    }
    str += '> </embed>';
  }
	document.getElementById("flash_div").innerHTML = str;
}

function AC_FL_RunContent(){
  var ret = 
    AC_GetArgs
    (  arguments, ".swf", "movie", "clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
     , "application/x-shockwave-flash"
    );
  AC_Generateobj(ret.objAttrs, ret.params, ret.embedAttrs);
}

function AC_SW_RunContent(){
  var ret = 
    AC_GetArgs
    (  arguments, ".dcr", "src", "clsid:166B1BCA-3F9C-11CF-8075-444553540000"
     , null
    );
  AC_Generateobj(ret.objAttrs, ret.params, ret.embedAttrs);
}

function AC_GetArgs(args, ext, srcParamName, classid, mimeType){
  var ret = new Object();
  ret.embedAttrs = new Object();
  ret.params = new Object();
  ret.objAttrs = new Object();
  for (var i=0; i < args.length; i=i+2){
    var currArg = args[i].toLowerCase();    

    switch (currArg){	
      case "classid":
        break;
      case "pluginspage":
        ret.embedAttrs[args[i]] = args[i+1];
        break;
      case "src":
      case "movie":	
        args[i+1] = AC_AddExtension(args[i+1], ext);
        ret.embedAttrs["src"] = args[i+1];
        ret.params[srcParamName] = args[i+1];
        break;
      case "onafterupdate":
      case "onbeforeupdate":
      case "onblur":
      case "oncellchange":
      case "onclick":
      case "ondblclick":
      case "ondrag":
      case "ondragend":
      case "ondragenter":
      case "ondragleave":
      case "ondragover":
      case "ondrop":
      case "onfinish":
      case "onfocus":
      case "onhelp":
      case "onmousedown":
      case "onmouseup":
      case "onmouseover":
      case "onmousemove":
      case "onmouseout":
      case "onkeypress":
      case "onkeydown":
      case "onkeyup":
      case "onload":
      case "onlosecapture":
      case "onpropertychange":
      case "onreadystatechange":
      case "onrowsdelete":
      case "onrowenter":
      case "onrowexit":
      case "onrowsinserted":
      case "onstart":
      case "onscroll":
      case "onbeforeeditfocus":
      case "onactivate":
      case "onbeforedeactivate":
      case "ondeactivate":
      case "type":
      case "codebase":
      case "id":
        ret.objAttrs[args[i]] = args[i+1];
        break;
      case "width":
      case "height":
      case "align":
      case "vspace": 
      case "hspace":
      case "class":
      case "title":
      case "accesskey":
      case "name":
      case "tabindex":
        ret.embedAttrs[args[i]] = ret.objAttrs[args[i]] = args[i+1];
        break;
      default:
        ret.embedAttrs[args[i]] = ret.params[args[i]] = args[i+1];
    }
  }
  ret.objAttrs["classid"] = classid;
  if (mimeType) ret.embedAttrs["type"] = mimeType;
  return ret;
}



/*
 * Superfish v1.4.8 - jQuery menu widget
 * Copyright (c) 2008 Joel Birch
 *
 * Dual licensed under the MIT and GPL licenses:
 * 	http://www.opensource.org/licenses/mit-license.php
 * 	http://www.gnu.org/licenses/gpl.html
 *
 * CHANGELOG: http://users.tpg.com.au/j_birch/plugins/superfish/changelog.txt
 */

;(function($){
	$.fn.superfish = function(op){

		var sf = $.fn.superfish,
			c = sf.c,
			$arrow = $(['<span class="',c.arrowClass,'"></span>'].join('')),
			over = function(){
				var $$ = $(this), menu = getMenu($$);
				clearTimeout(menu.sfTimer);
				$$.showSuperfishUl().siblings().hideSuperfishUl();
			},
			out = function(){
				var $$ = $(this), menu = getMenu($$), o = sf.op;
				clearTimeout(menu.sfTimer);
				menu.sfTimer=setTimeout(function(){
					o.retainPath=($.inArray($$[0],o.$path)>-1);
					$$.hideSuperfishUl();
					if (o.$path.length && $$.parents(['li.',o.hoverClass].join('')).length<1){over.call(o.$path);}
				},o.delay);	
			},
			getMenu = function($menu){
				var menu = $menu.parents(['ul.',c.menuClass,':first'].join(''))[0];
				sf.op = sf.o[menu.serial];
				return menu;
			},
			addArrow = function($a){ $a.addClass(c.anchorClass).append($arrow.clone()); };
			
		return this.each(function() {
			var s = this.serial = sf.o.length;
			var o = $.extend({},sf.defaults,op);
			o.$path = $('li.'+o.pathClass,this).slice(0,o.pathLevels).each(function(){
				$(this).addClass([o.hoverClass,c.bcClass].join(' '))
					.filter('li:has(ul)').removeClass(o.pathClass);
			});
			sf.o[s] = sf.op = o;
			
			$('li:has(ul)',this)[($.fn.hoverIntent && !o.disableHI) ? 'hoverIntent' : 'hover'](over,out).each(function() {
				if (o.autoArrows) addArrow( $('>a:first-child',this) );
			})
			.not('.'+c.bcClass)
				.hideSuperfishUl();
			
			var $a = $('a',this);
			$a.each(function(i){
				var $li = $a.eq(i).parents('li');
				$a.eq(i).focus(function(){over.call($li);}).blur(function(){out.call($li);});
			});
			o.onInit.call(this);
			
		}).each(function() {
			var menuClasses = [c.menuClass];
			if (sf.op.dropShadows  && !($.browser.msie && $.browser.version < 7)) menuClasses.push(c.shadowClass);
			$(this).addClass(menuClasses.join(' '));
		});
	};

	var sf = $.fn.superfish;
	sf.o = [];
	sf.op = {};
	sf.IE7fix = function(){
		var o = sf.op;
		if ($.browser.msie && $.browser.version > 6 && o.dropShadows && o.animation.opacity!=undefined)
			this.toggleClass(sf.c.shadowClass+'-off');
		};
	sf.c = {
		bcClass     : 'sf-breadcrumb',
		menuClass   : 'sf-js-enabled',
		anchorClass : 'sf-with-ul',
		arrowClass  : 'sf-sub-indicator',
		shadowClass : 'sf-shadow'
	};
	sf.defaults = {
		hoverClass	: 'sfHover',
		pathClass	: 'overideThisToUse',
		pathLevels	: 1,
		delay		: 800,
		animation	: {opacity:'show'},
		speed		: 'normal',
		autoArrows	: false,
		dropShadows : true,
		disableHI	: false,		// true disables hoverIntent detection
		onInit		: function(){}, // callback functions
		onBeforeShow: function(){},
		onShow		: function(){},
		onHide		: function(){}
	};
	$.fn.extend({
		hideSuperfishUl : function(){
			var o = sf.op,
				not = (o.retainPath===true) ? o.$path : '';
			o.retainPath = false;
			var $ul = $(['li.',o.hoverClass].join(''),this).add(this).not(not).removeClass(o.hoverClass)
					.find('>ul').hide().css('visibility','hidden');
			o.onHide.call($ul);
			return this;
		},
		showSuperfishUl : function(){
			var o = sf.op,
				sh = sf.c.shadowClass+'-off',
				$ul = this.addClass(o.hoverClass)
					.find('>ul:hidden').css('visibility','visible');
			sf.IE7fix.call($ul);
			o.onBeforeShow.call($ul);
			$ul.animate(o.animation,o.speed,function(){ sf.IE7fix.call($ul); o.onShow.call($ul); });
			return this;
		}
	});

})(jQuery);
