var wizardUrl = "";
$("#breadLoginSubmit").button();

/**
 * Function to generate the wizard steps; includes the ability to navigate by clicking on the steps and also adding completed 'tick' images
 *
 * @param   {Number} stepNum: Initial bearing in degrees
 * @param   {Number} numOfSteps: Distance in km
 * @param 	{LatLon} stepNumLargest: point
 * @param 	{LatLon} error: point
 * @param 	{LatLon} isComplete: point
 * 
 * @returns void
 */
function generateWizardSteps(stepNum, numOfSteps, stepNumLargest, error, isComplete){
	var imgPlain 	= '/common/images/icons/check_off_24.gif';
	var imgError 	= '/common/images/icons/close_on_24.gif';
	var imgComplete = '/common/images/icons/check_on_24.gif';
	
	$('#wizardStatus li').each(function(index){ // Loop though the list elements
		var id = $(this).attr('id');
		
		if (stepNum == id) { // Check to see if this element is the current step
			$(this).addClass("currentStep"); // Apply a class to signify that this step is the current step
			$('a', this).removeAttr('href'); // Remove the ability to click on the current step
			$(this).removeAttr('title'); // Remove the title/tooltip from this step
			if (error) { // If an error has been flagged, add the error image
				$('a img', this).attr('src', imgError);
			}
		}
		else 
			if (isComplete || (stepNumLargest >= id)) {
				$('a', this).attr('href', wizardUrl + id).addClass("complete,goSubmit"); // Add a hyperlink to the anchor
				$('a img', this).attr('src', imgComplete); // Add the complete image 
			}
			else { // Plain step with no hyperlink or status
				$('a', this).removeAttr('href'); // Remove the ability to click on the step
			}							
	});
}

String.format = function() {
  var s = arguments[0];
  for (var i = 0; i < arguments.length - 1; i++) {       
    var reg = new RegExp("\\{" + i + "\\}", "gm");             
    s = s.replace(reg, arguments[i + 1]);
  }

  return s;
}


// ------------------------------------------------------
// Name: stopEnterSubmit
// Desc: Function to stop the ability to submit a form
//		 with the 'enter' button on the keyboard
// ------------------------------------------------------
function stopEnterSubmit(){
	$(window).keydown(function(event){
		if(event.keyCode == 13) {
	    	event.preventDefault();
	    	return false;
	  	}
	});
}

// ------------------------------------------------------
// Name: setConfirmUnload
// Desc: Function to 'turn on' a message to be displayed
//		 when a user exits/navigates away from a browser 
//		 window
// ------------------------------------------------------
function setConfirmUnload(on) {
	window.onbeforeunload = (on) ? unloadMsg : null;
}

// ------------------------------------------------------
// Name: replaceAll
// Desc: Function to replace all occurances of a specified
//		 word from a string; no default JavaScript function
//		 avaliable
// ------------------------------------------------------
function replaceAll(Source,stringToFind,stringToReplace){
	var temp = Source;
	var index = temp.indexOf(stringToFind);

	while(index != -1){
	    temp = temp.replace(stringToFind,stringToReplace);
	    index = temp.indexOf(stringToFind);
	}

    return temp;
}

// ------------------------------------------------------
// Name: resetBreadcumbs
// Desc: Function to reset the main breadcrumbs to the
// 		 default state
// ------------------------------------------------------
function resetBreadcumbs(){
	$("#linkLayoutBox, #linkLoginBox, #linkSearchBox").fadeOut('slow');
	$("#linkLayout, #linkLogin, #linkHelp, #linkSearch").removeClass("selected");
}

// ------------------------------------------------------
// Name: modalWindow
// Desc: Helper function to load a url into a modal
// ------------------------------------------------------
function modalWindow(url, w, h){
	$.modal('<iframe src="' + url + '" height="' + h +'" width="' + w + '" style="border:0">', {
		closeClass: "modalCloseImg",
		containerCss: { backgroundColor:"#fff", borderColor:"#999", height:h, padding:0, width:w, overlay:50 },
		overlayClose:false
	});
}

// ------------------------------------------------------
// Name: modalWindowDiv
// Desc: Helper function to load a div into a modal
// ------------------------------------------------------
function modalWindowDiv(div, w, h){
	$.modal(div, {
		closeClass: "modalCloseImg",
		containerCss: { backgroundColor:"#fff", borderColor:"#999", height:h, padding:0, width:w, overlay:50 },
		overlayClose:false
	});
}

// ------------------------------------------------------
// Name: modalClose
// Desc: Helper function to close a modal window
// ------------------------------------------------------
function modalClose(){
	$.modal.close();
}

// ------------------------------------------------------
// Name: showErrors
// Desc: 
// ------------------------------------------------------
function showErrors(errors){
	var c = '';

	for (var i = 0; i < errors.length; i++) {
		c += '<li>' + errors[i] + '</li>';
	}

	$("#failText").html(c);
	
	$(".validationSuccess").hide();
	$(".validationError").fadeIn('slow');
}

// ------------------------------------------------------
// Name: statusUpdate
// Desc: 
// ------------------------------------------------------
function statusUpdate(msg,type){
	var vs = $(".validationSuccess");
	var ve = $(".validationError");
	
	switch(type){
		case 'success':
			vs.fadeIn('slow');
			ve.hide();
			
			$("#successText").html(msg);
			setTimeout(function(){vs.fadeOut('slow');},10000);
		break;
		
		case 'fail':
			vs.hide();
			ve.fadeIn('slow');
			
			$("#failText").html(msg);
		break;
	}
	
	$('html, body').animate({ scrollTop: 0 }, 'slow');
}

$(document).ready(function(){ 
	$("#linkLogin").click(function(){
		var l = $("#linkLoginBox");
		resetBreadcumbs();
		
		if(!l.is(":visible")){
			l.fadeIn('slow');
			$("#linkLogin").addClass("selected");
			simpleLogin.init();
		}
	});
	
	$("#linkSearch").click(function(){
		var l = $("#linkSearchBox");
		resetBreadcumbs();
		
		if(!l.is(":visible")){
			l.fadeIn('slow');
			$("#linkSearch").addClass("selected");
		}
	});
	
	$(".linkHelp").click(function(){
		help.init();
		modalWindowDiv($("#help"), 800, 461);
	});
	
	$("#linkRegister").click(function(){
		window.location = "/public/registration.cfm?n";
	});

	$('body').click(function(){
		if ($("#linkLoginBox, #linkSearchBox").is(":visible")){
			resetBreadcumbs();
		}
 	});

	$('#linkLogin, #linkLoginBox, #linkSearchBox, #linkSearch').click(function(event){
		event.stopPropagation();
	});
	
	$('.forgotUsrPsw').click(function(event){
		modalWindowDiv($("#linkLostUsrPsw"), 480, 250);
		recoverUsername.init();
		resetPassword.init();
	});
	
	$("#terms").click(function(){
		var width = 717;
		var height = 502;
		
		$.modal('<iframe src="/various/terms.cfm" height="' + height + 'px" width="' + width + 'px" style="border:0">', { 
			closeClass: "modalCloseImg",
			containerCss: {
				backgroundColor: "#fff",
				borderColor: "#999",
				height: height,
				padding: 0,
				width: width,
				overlay: 50
			},
			overlayClose: false
		});
	});
	
	$('#searchField').focus(
		function(){
			if ($(this).val() == $(this).attr('title')) {
				$(this).val('');
			}
		}
	).blur(
		function(){
			if ($(this).val() !== $(this).attr('title') && $(this).val().length === 0) {
				$(this).val($(this).attr('title'));
			}
		}
	).blur(); 
});

// ------------------------------------------------------
// Name: statusUpdate
// Desc: 
// ------------------------------------------------------
function slideShow(speed) {
    //append a LI item to the UL list for displaying caption
    $('ul.slideshow').append('<li id="slideshow-caption" class="caption"><div class="slideshow-caption-container"><h3></h3><p></p></div></li>');
 
    //Set the opacity of all images to 0
    $('ul.slideshow li').css({opacity: 0.0});
     
    //Get the first image and display it (set it to full opacity)
    $('ul.slideshow li:first').css({opacity: 1.0});
     
    //Get the caption of the first image from REL attribute and display it
    $('#slideshow-caption h3').html($('ul.slideshow img:first').attr('title'));
    $('#slideshow-caption p').html($('ul.slideshow img:first').attr('alt'));
         
    //Display the caption
    $('#slideshow-caption').css({opacity: 0.7, bottom:0});
     
    //Call the gallery function to run the slideshow   
    var timer = setInterval('gallery()',speed);
     
    //pause the slideshow on mouse over
    $('ul.slideshow').hover(
        function () {
            clearInterval(timer);  
        }, 
        function () {
            timer = setInterval('gallery()',speed);        
        }
    );
     
}

// ------------------------------------------------------
// Name: statusUpdate
// Desc: 
// ------------------------------------------------------ 
function gallery() {
    //if no IMGs have the show class, grab the first image
    var current = ($('ul.slideshow li.show')?  $('ul.slideshow li.show') : $('#ul.slideshow li:first'));
 
    //Get next image, if it reached the end of the slideshow, rotate it back to the first image
    var next = ((current.next().length) ? ((current.next().attr('id') == 'slideshow-caption')? $('ul.slideshow li:first') :current.next()) : $('ul.slideshow li:first'));
         
    //Get next image caption
    var title = next.find('img').attr('title');
    var desc = next.find('img').attr('alt');   
         
    //Set the fade in effect for the next image, show class has higher z-index
    next.css({opacity: 0.0}).addClass('show').animate({opacity: 1.0}, 1000);
     
    //Hide the caption first, and then set and display the caption
    $('#slideshow-caption').slideToggle(300, function () {
        $('#slideshow-caption h3').html(title);
        $('#slideshow-caption p').html(desc);
        $('#slideshow-caption').slideToggle(500);
    });
 
    //Hide the current image
    current.animate({opacity: 0.0}, 1000).removeClass('show');
 
}

/**
 * Copyright (c)2005-2009 Matt Kruse (javascripttoolbox.com)
 * 
 * Dual licensed under the MIT and GPL licenses. 
 * This basically means you can use this code however you want for
 * free, but don't claim to have written it yourself!
 * Donations always accepted: http://www.JavascriptToolbox.com/donate/
 * 
 * Please do not link to the .js files on javascripttoolbox.com from
 * your site. Copy the files locally to your server instead.
 * 
 */
/*
Date functions

These functions are used to parse, format, and manipulate Date objects.
See documentation and examples at http://www.JavascriptToolbox.com/lib/date/

*/
Date.$VERSION = 1.02;

// Utility function to append a 0 to single-digit numbers
Date.LZ = function(x) {return(x<0||x>9?"":"0")+x};
// Full month names. Change this for local month names
Date.monthNames = new Array('January','February','March','April','May','June','July','August','September','October','November','December');
// Month abbreviations. Change this for local month names
Date.monthAbbreviations = new Array('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
// Full day names. Change this for local month names
Date.dayNames = new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');
// Day abbreviations. Change this for local month names
Date.dayAbbreviations = new Array('Sun','Mon','Tue','Wed','Thu','Fri','Sat');
// Used for parsing ambiguous dates like 1/2/2000 - default to preferring 'American' format meaning Jan 2.
// Set to false to prefer 'European' format meaning Feb 1
Date.preferAmericanFormat = false;

// If the getFullYear() method is not defined, create it
if (!Date.prototype.getFullYear) { 
  Date.prototype.getFullYear = function() { var yy=this.getYear(); return (yy<1900?yy+1900:yy); } ;
} 

// Parse a string and convert it to a Date object.
// If no format is passed, try a list of common formats.
// If string cannot be parsed, return null.
// Avoids regular expressions to be more portable.
Date.parseString = function(val, format) {
  // If no format is specified, try a few common formats
  if (typeof(format)=="undefined" || format==null || format=="") {
    var generalFormats=new Array('y-M-d','MMM d, y','MMM d,y','y-MMM-d','d-MMM-y','MMM d','MMM-d','d-MMM');
    var monthFirst=new Array('M/d/y','M-d-y','M.d.y','M/d','M-d');
    var dateFirst =new Array('d/M/y','d-M-y','d.M.y','d/M','d-M');
    var checkList=new Array(generalFormats,Date.preferAmericanFormat?monthFirst:dateFirst,Date.preferAmericanFormat?dateFirst:monthFirst);
    for (var i=0; i<checkList.length; i++) {
      var l=checkList[i];
      for (var j=0; j<l.length; j++) {
        var d=Date.parseString(val,l[j]);
        if (d!=null) { 
          return d; 
        }
      }
    }
    return null;
  };

  this.isInteger = function(val) {
    for (var i=0; i < val.length; i++) {
      if ("1234567890".indexOf(val.charAt(i))==-1) { 
        return false; 
      }
    }
    return true;
  };
  this.getInt = function(str,i,minlength,maxlength) {
    for (var x=maxlength; x>=minlength; x--) {
      var token=str.substring(i,i+x);
      if (token.length < minlength) { 
        return null; 
      }
      if (this.isInteger(token)) { 
        return token; 
      }
    }
  return null;
  };
  val=val+"";
  format=format+"";
  var i_val=0;
  var i_format=0;
  var c="";
  var token="";
  var token2="";
  var x,y;
  var year=new Date().getFullYear();
  var month=1;
  var date=1;
  var hh=0;
  var mm=0;
  var ss=0;
  var ampm="";
  while (i_format < format.length) {
    // Get next token from format string
    c=format.charAt(i_format);
    token="";
    while ((format.charAt(i_format)==c) && (i_format < format.length)) {
      token += format.charAt(i_format++);
    }
    // Extract contents of value based on format token
    if (token=="yyyy" || token=="yy" || token=="y") {
      if (token=="yyyy") { 
        x=4;y=4; 
      }
      if (token=="yy") { 
        x=2;y=2; 
      }
      if (token=="y") { 
        x=2;y=4; 
      }
      year=this.getInt(val,i_val,x,y);
      if (year==null) { 
        return null; 
      }
      i_val += year.length;
      if (year.length==2) {
        if (year > 70) { 
          year=1900+(year-0); 
        }
        else { 
          year=2000+(year-0); 
        }
      }
    }
    else if (token=="MMM" || token=="NNN"){
      month=0;
      var names = (token=="MMM"?(Date.monthNames.concat(Date.monthAbbreviations)):Date.monthAbbreviations);
      for (var i=0; i<names.length; i++) {
        var month_name=names[i];
        if (val.substring(i_val,i_val+month_name.length).toLowerCase()==month_name.toLowerCase()) {
          month=(i%12)+1;
          i_val += month_name.length;
          break;
        }
      }
      if ((month < 1)||(month>12)){
        return null;
      }
    }
    else if (token=="EE"||token=="E"){
      var names = (token=="EE"?Date.dayNames:Date.dayAbbreviations);
      for (var i=0; i<names.length; i++) {
        var day_name=names[i];
        if (val.substring(i_val,i_val+day_name.length).toLowerCase()==day_name.toLowerCase()) {
          i_val += day_name.length;
          break;
        }
      }
    }
    else if (token=="MM"||token=="M") {
      month=this.getInt(val,i_val,token.length,2);
      if(month==null||(month<1)||(month>12)){
        return null;
      }
      i_val+=month.length;
    }
    else if (token=="dd"||token=="d") {
      date=this.getInt(val,i_val,token.length,2);
      if(date==null||(date<1)||(date>31)){
        return null;
      }
      i_val+=date.length;
    }
    else if (token=="hh"||token=="h") {
      hh=this.getInt(val,i_val,token.length,2);
      if(hh==null||(hh<1)||(hh>12)){
        return null;
      }
      i_val+=hh.length;
    }
    else if (token=="HH"||token=="H") {
      hh=this.getInt(val,i_val,token.length,2);
      if(hh==null||(hh<0)||(hh>23)){
        return null;
      }
      i_val+=hh.length;
    }
    else if (token=="KK"||token=="K") {
      hh=this.getInt(val,i_val,token.length,2);
      if(hh==null||(hh<0)||(hh>11)){
        return null;
      }
      i_val+=hh.length;
      hh++;
    }
    else if (token=="kk"||token=="k") {
      hh=this.getInt(val,i_val,token.length,2);
      if(hh==null||(hh<1)||(hh>24)){
        return null;
      }
      i_val+=hh.length;
      hh--;
    }
    else if (token=="mm"||token=="m") {
      mm=this.getInt(val,i_val,token.length,2);
      if(mm==null||(mm<0)||(mm>59)){
        return null;
      }
      i_val+=mm.length;
    }
    else if (token=="ss"||token=="s") {
      ss=this.getInt(val,i_val,token.length,2);
      if(ss==null||(ss<0)||(ss>59)){
        return null;
      }
      i_val+=ss.length;
    }
    else if (token=="a") {
      if (val.substring(i_val,i_val+2).toLowerCase()=="am") {
        ampm="AM";
      }
      else if (val.substring(i_val,i_val+2).toLowerCase()=="pm") {
        ampm="PM";
      }
      else {
        return null;
      }
      i_val+=2;
    }
    else {
      if (val.substring(i_val,i_val+token.length)!=token) {
        return null;
      }
      else {
        i_val+=token.length;
      }
    }
  }
  // If there are any trailing characters left in the value, it doesn't match
  if (i_val != val.length) { 
    return null; 
  }
  // Is date valid for month?
  if (month==2) {
    // Check for leap year
    if ( ( (year%4==0)&&(year%100 != 0) ) || (year%400==0) ) { // leap year
      if (date > 29){ 
        return null; 
      }
    }
    else { 
      if (date > 28) { 
        return null; 
      } 
    }
  }
  if ((month==4)||(month==6)||(month==9)||(month==11)) {
    if (date > 30) { 
      return null; 
    }
  }
  // Correct hours value
  if (hh<12 && ampm=="PM") {
    hh=hh-0+12; 
  }
  else if (hh>11 && ampm=="AM") { 
    hh-=12; 
  }
  return new Date(year,month-1,date,hh,mm,ss);
};

// Check if a date string is valid
Date.isValid = function(val,format) {
  return (Date.parseString(val,format) != null);
};

// Check if a date object is before another date object
Date.prototype.isBefore = function(date2) {
  if (date2==null) { 
    return false; 
  }
  return (this.getTime()<date2.getTime());
};

// Check if a date object is after another date object
Date.prototype.isAfter = function(date2) {
  if (date2==null) { 
    return false; 
  }
  return (this.getTime()>date2.getTime());
};

// Check if two date objects have equal dates and times
Date.prototype.equals = function(date2) {
  if (date2==null) { 
    return false; 
  }
  return (this.getTime()==date2.getTime());
};

// Check if two date objects have equal dates, disregarding times
Date.prototype.equalsIgnoreTime = function(date2) {
  if (date2==null) { 
    return false; 
  }
  var d1 = new Date(this.getTime()).clearTime();
  var d2 = new Date(date2.getTime()).clearTime();
  return (d1.getTime()==d2.getTime());
};

// Format a date into a string using a given format string
Date.prototype.format = function(format) {
  format=format+"";
  var result="";
  var i_format=0;
  var c="";
  var token="";
  var y=this.getYear()+"";
  var M=this.getMonth()+1;
  var d=this.getDate();
  var E=this.getDay();
  var H=this.getHours();
  var m=this.getMinutes();
  var s=this.getSeconds();
  var yyyy,yy,MMM,MM,dd,hh,h,mm,ss,ampm,HH,H,KK,K,kk,k;
  // Convert real date parts into formatted versions
  var value=new Object();
  if (y.length < 4) {
    y=""+(+y+1900);
  }
  value["y"]=""+y;
  value["yyyy"]=y;
  value["yy"]=y.substring(2,4);
  value["M"]=M;
  value["MM"]=Date.LZ(M);
  value["MMM"]=Date.monthNames[M-1];
  value["NNN"]=Date.monthAbbreviations[M-1];
  value["d"]=d;
  value["dd"]=Date.LZ(d);
  value["E"]=Date.dayAbbreviations[E];
  value["EE"]=Date.dayNames[E];
  value["H"]=H;
  value["HH"]=Date.LZ(H);
  if (H==0){
    value["h"]=12;
  }
  else if (H>12){
    value["h"]=H-12;
  }
  else {
    value["h"]=H;
  }
  value["hh"]=Date.LZ(value["h"]);
  value["K"]=value["h"]-1;
  value["k"]=value["H"]+1;
  value["KK"]=Date.LZ(value["K"]);
  value["kk"]=Date.LZ(value["k"]);
  if (H > 11) { 
    value["a"]="PM"; 
  }
  else { 
    value["a"]="AM"; 
  }
  value["m"]=m;
  value["mm"]=Date.LZ(m);
  value["s"]=s;
  value["ss"]=Date.LZ(s);
  while (i_format < format.length) {
    c=format.charAt(i_format);
    token="";
    while ((format.charAt(i_format)==c) && (i_format < format.length)) {
      token += format.charAt(i_format++);
    }
    if (typeof(value[token])!="undefined") { 
      result=result + value[token]; 
    }
    else { 
      result=result + token; 
    }
  }
  return result;
};

// Get the full name of the day for a date
Date.prototype.getDayName = function() { 
  return Date.dayNames[this.getDay()];
};

// Get the abbreviation of the day for a date
Date.prototype.getDayAbbreviation = function() { 
  return Date.dayAbbreviations[this.getDay()];
};

// Get the full name of the month for a date
Date.prototype.getMonthName = function() {
  return Date.monthNames[this.getMonth()];
};

// Get the abbreviation of the month for a date
Date.prototype.getMonthAbbreviation = function() { 
  return Date.monthAbbreviations[this.getMonth()];
};

// Clear all time information in a date object
Date.prototype.clearTime = function() {
  this.setHours(0); 
  this.setMinutes(0);
  this.setSeconds(0); 
  this.setMilliseconds(0);
  return this;
};

// Add an amount of time to a date. Negative numbers can be passed to subtract time.
Date.prototype.add = function(interval, number) {
  if (typeof(interval)=="undefined" || interval==null || typeof(number)=="undefined" || number==null) { 
    return this; 
  }
  number = +number;
  if (interval=='y') { // year
    this.setFullYear(this.getFullYear()+number);
  }
  else if (interval=='M') { // Month
    this.setMonth(this.getMonth()+number);
  }
  else if (interval=='d') { // Day
    this.setDate(this.getDate()+number);
  }
  else if (interval=='w') { // Weekday
    var step = (number>0)?1:-1;
    while (number!=0) {
      this.add('d',step);
      while(this.getDay()==0 || this.getDay()==6) { 
        this.add('d',step);
      }
      number -= step;
    }
  }
  else if (interval=='h') { // Hour
    this.setHours(this.getHours() + number);
  }
  else if (interval=='m') { // Minute
    this.setMinutes(this.getMinutes() + number);
  }
  else if (interval=='s') { // Second
    this.setSeconds(this.getSeconds() + number);
  }
  return this;
};
