var photo_cache = new Array();
var photo_list = new Array();
var current_index = 0;
var property_cache = {};
var service_date = '';
var service_dates = {};

$(function()
{
  startSlideShow();
  setupSearchFilters();
  setupSearchResultsImages();
  setupPropertyDetailImages();
  setupDatePickers();
  setupFormValidators();
  setupBookingPolicy();
  setupPropertyDetails();
  setupInstantQuote();
  setupTooltips();
  setupTaxesSlider();
  setupOptionalTaxes();
  setupAutoProperties();
  setupChangeSearch();
  setupValidateData();
  setupVirtualTour()
  setupFeaturesAccordion();
  setupServices();
  setupMasterDiscount();
});

function setupMasterDiscount()
{
  if ($('#use_master_discount').length)
  {
    $('#use_master_discount').click(function(){
	 $('#use_master_discount').closest("form").submit();
    })
  }
}

function setupFeaturesAccordion()
{
  if ($('#accordion').length > 0)
  {
	  $('#accordion').accordion({
			  autoHeight: false,
			  navigation: true,
			  active: false, 
		      collapsible: true				
		  });
  }  
}

function setupVirtualTour()
{
  if ($('.virttour').length > 0)
  {
	if ($('.virttour').length > 0)
	{
		$(".virttour").click(function(){
			window.open($(this).attr('href'),'','width=584,height=485');
			return false;
		});
	}
  }
}

function setupValidateData()
{
  if ($('.validate_data').length)
  {
    $('.validate_data').each(function() {
      var form_id = $(this).attr('id');
      $(this).submit(function() { doRemoteSubmit($(this)) });
      $(this).find(':input').each(function(){
		if ($(this).attr('name').indexOf("_name") >= 0 || $(this).attr('name').indexOf("_email") >= 0 || $(this).attr('name').indexOf("_phone") >= 0)
		{
		  $(this).blur(function()
		  {
		    if (!$(this).hasClass('date_field'))
		    {
		        doRemote($(this), form_id);
		    }
		    });
		}
      });
    });
  }
}



function doRemote(obj, form_id)
{
  var from_where = $('#'+form_id).find('input[name="validate_from"]').val();
  $.ajax({
		type: "POST",
		data: 'method=validateForm&from_where='+from_where+'&'+obj.attr('name')+'='+obj.val(),
		url: '/ajax-validate-form'
	});
}	

function doRemoteSubmit(obj)
{
  var from_where = $('#'+obj.attr('id')).find('input[name="validate_from"]').val();
  $.ajax({
		type: "POST",
		data: 'method=validateForm&from_where='+from_where+'&submitted=1',
		url: '/ajax-validate-form'
	});
}	


function setupChangeSearch()
{
  if ($( ".lum-change_search" ).length)
  {
    $( ".lum-change_search" ).click(function(){
	$('#search_area').slideToggle();
    });
  }
}

function setupAutoProperties()
{
  if ($( "#auto_properties" ).length)
  {
      $( "#auto_properties" ).autocomplete({
	      minLength: 3,
	      source: function(request, response) {
		      if ( request.term in property_cache ) {
			      response( property_cache[ request.term ] );
			      return;
		      }
		      
		      $.ajax({
			      url: "/"+lang_code+"/ajax-property-search",
			      dataType: "json",
			      data: request,
			      success: function( data ) {
				      property_cache[ request.term ] = data;
				      response( data );
			      }
		      });
	      },
	      select: function(event, ui) {
		    var url = ui.item.id;
		    if (url !='' && url != undefined && url != null)
		    {
		      window.location.href = url;
		    }
	      }
      });
  }
}

function setupOptionalTaxes()
{
  $('.optional_tax').click(function(){
      var field_id = $(this).attr('id').replace("__checkbox", "");
      $('#'+field_id).val($(this).attr('checked') ? 1 : 0);
      $('#lum-res-form-change').submit();
  });
}

function setupTaxesSlider()
{
  $('.taxes_fees_handle').unbind('click');
  $('.taxes_fees_handle').click(function(){
      if ($(this).attr('rel'))
      {
	$($(this).attr('rel')).slideToggle();
      }
      else
      {
	$('.lum-res-taxes').slideToggle();
      }
      return false;
  })
}

function setupTooltips()
{
    $('.lum-tooltip_trigger').tooltip();
}

function setupSearchFilters()
{
	if ($('#lum-filters').length)
	{
		$('#lum-filters').show();
		    
		$( "#lum-filters-range-nightly_rate" ).slider({
			range: true,
			min: parseInt($('#ss_rate_min').val()),
			max: parseInt($('#ss_rate_max').val()),
			values: [ parseInt($('#ss_rate_low').val()), parseInt($('#ss_rate_high').val()) ],
			slide: function( event, ui ) {
				$( "#lum-filters-view-nightly_rate" ).html( "$" + ui.values[ 0 ] + " - $" + ui.values[ 1 ] );
				$('#ss_rate_low').val(ui.values[ 0 ]);
				$('#ss_rate_high').val(ui.values[ 1 ]);
			}
		});
		
		$( "#lum-filters-range-number_people" ).slider({
			range: true,
			min: parseInt($('#ss_occupancy_min').val()),
			max: parseInt($('#ss_occupancy_max').val()),
			values: [ parseInt($('#ss_occupancy_low').val()), parseInt($('#ss_occupancy_high').val()) ],
			slide: function( event, ui ) {
				$( "#lum-filters-view-number_people" ).html( ui.values[ 0 ] + " - " + ui.values[ 1 ] );
				$('#ss_occupancy_low').val(ui.values[ 0 ]);
				$('#ss_occupancy_high').val(ui.values[ 1 ]);
			}
		});		
		
		$('.lum-filters-update_results').click(function()
		{
			    
			$('#ss_arrival').val($('#avs_arrival').val());
			$('#ss_departure').val($('#avs_departure').val());
			$('#ss_property_type').val(getFilterType());
			$('#ss_ratings').val(getFilterRating());
			$('#ss_location').val(getFilterLocation());
			$('#ss_area').val(getFilterArea());
			$('#ss_amenities').val(getFilterAmenities());
			$('#lum-filters-form').submit();
		});
		
		$('#lum-search-options-form').submit(function()
		{
			if ($('#avs_complex').length)
			    $('#avs_complex').val($('#ss_complex').val());
			$('#avs_rate_low').val($('#ss_rate_low').val());
			$('#avs_rate_high').val($('#ss_rate_high').val());
			$('#avs_occupancy_low').val($('#ss_occupancy_low').val());
			$('#avs_occupancy_high').val($('#ss_occupancy_high').val());
			$('#avs_property_type').val(getFilterType());
			$('#avs_ratings').val(getFilterRating());
			$('#avs_location').val(getFilterLocation());
			$('#avs_area').val(getFilterArea());
			$('#avs_amenities').val(getFilterAmenities());
			return true;
		});
		

		
	}
}

function getFilterType()
{
	var types = [];
	$('#lum-filters-types .lum-filter-checkbox:checked').each(function()
	{
	       types.push($(this).val());
	});
	return types;
}

function getFilterRating()
{
	var ratings = [];
	$('#lum-filters-rating .lum-filter-checkbox:checked').each(function()
	{
	       ratings.push($(this).val());
	});
	return ratings;
}

function getFilterLocation()
{
	var location = [];
	$('#lum-filters-location .lum-filter-checkbox:checked').each(function()
	{
	       location.push($(this).val());
	});
	return location;
}

function getFilterArea()
{
	var area = [];
	$('#lum-filters-resort .lum-filter-area:checked').each(function()
	{
	       area.push($(this).val());
	});
	return area;
}

function getFilterAmenities()
{
	var amenities = [];
	$('#lum-filters-amenities .lum-filter-checkbox:checked').each(function()
	{
	       amenities.push($(this).val());
	});
	return amenities;
}


function startSlideShow()
{
	if ($('#slide_box').length)
	{
		$('#slide_box') 
		.cycle({
			speed:   100, 
			timeout: 5000, 
			pager:  '#slide_nav',
			pagerAnchorBuilder: function(idx, slide) { 
				return '<a href="#" title="slide_'+idx+'">&nbsp;</a>'; 
			} 			

		});
	}
	
	if ($('#lum-slideshow').length)
	{
	    setInterval(nextSlide, 3000);
	    $('#lum-slide_left a').click(function(){
		prevSlide();
		return false;
	    })
	    $('#lum-slide_right a').click(function(){
		nextSlide();
		return false;
	    })

	}	
}

function prevSlide()
{
  if ($('#lum-slides .current_slide').index() == 0)
  {
      $('#lum-slides .current_slide').removeClass('current_slide');
      $($('#lum-slides .slide').get($('#lum-slideshow .slide:last').index())).addClass('current_slide');
  }
  else
  {
      $('#lum-slideshow .current_slide').removeClass('current_slide').prev().addClass('current_slide');
  }
}

function nextSlide()
{
  if ($('#lum-slides .current_slide').index() == $('#lum-slideshow .slide:last').index())
  {
      $('#lum-slides .current_slide').removeClass('current_slide');
      $($('#lum-slides .slide').get($('#lum-slideshow .slide:first').index())).addClass('current_slide');
  }
  else
  {
      $('#lum-slideshow .current_slide').removeClass('current_slide').next().addClass('current_slide');
  }
}

function setupSearchResultsImages()
{
	if ($('.lum-avs-pb-thumb').length)
	{
		$('.lum-avs-pb-thumb').mouseover(function(){
			$('#'+($(this).attr('title')+'_photo')).attr('src', $(this).attr('src'));
		});
	}
}
	
function setupPropertyDetailImages()
{
	if ($('.lum-pd-l-thumb').length)
	{
		if ($('.view_photos').length)
		{
		    $('.view_photos').click(function(){
		      setPhoto(0);
		      return false;
		    });
		}
		
		cachePhotos();
		$('.lum-pd-l-thumb').mouseover(function(){
			var id = $(this).attr('id');
			var temp = id.split('_');
			var index = temp[1];
					      
			if (typeof(photo_cache[index]) != "undefined")
				$('#main_photo').attr('src', photo_cache[index].src);
		});
		
		$('.lum-pd-l-thumb').click(function(){
			var id = $(this).attr('id');
			var temp = id.split('_');
			var index = temp[1];
					      
			setPhoto(parseInt(index));
		});
		
		$('#main_photo').click(function(){
		  setPhoto(0);
		});
		
		$('#photo_gallery_overlay .prev').click(prevPhoto);
		$('#photo_gallery_overlay .next').click(nextPhoto);
		$('#photo_gallery_overlay .close').find('img').click(function(){
			$('#photo_gallery_overlay').fadeOut(200);
		});	
	}
}

function setupInstantQuote()
{
	if ($("#lum-pd-r-iq-submit").length)
	{
		$('#lum-pd-r-iq-submit').click(function()
		{
			doRemoteSubmit($('#lum-pd-r-iq-form'));
			var bad_name = $.validationEngine.loadValidation("#iq_name");
			var bad_email = $.validationEngine.loadValidation("#iq_email");
			var bad_arrival = $.validationEngine.loadValidation("#iq_arrival");
			var bad_departure = $.validationEngine.loadValidation("#iq_departure");

			if (!bad_email && !bad_name && !bad_arrival && !bad_departure)
			{
				$('#lum-pd-r-iq-step_1').fadeOut();
				$('#lum-pd-r-iq-loading').fadeIn();
				$.ajax({
					type: "GET",
					data: {property_id: $("#iq_property_id").val(),iq_arrival: $("#iq_arrival").val(), iq_departure: $("#iq_departure").val(), iq_name: $("#iq_name").val(), iq_email: $("#iq_email").val(), iq_phone: $("#iq_phone").val()},
					url: '/ajax-instant-quote',
					dataType: "json",
					success: function(data) {
						$('#lum-pd-r-iq-loading').fadeOut();
						if (data['success'] == 0)
						{
							$('#lum-pd-r-iq-sorry').fadeIn();
						}
						else
						{
							_gaq.push(['_trackPageview', '/ajax-instant-quote']);
							$('#lum-pd-r-iq-thanks').fadeIn();		
						}
					},
					error: function() {
							
					}
				});
				
			}
			return false;
		});
	}
	else
	{
	  if ($("#lum-pd-r-iq-form").length)
	  {
	    $("#lum-pd-r-iq-form").validationEngine();
	  }
	  
	}
	
}

function setupBookingPolicy()
{
    if ($('#booking_policy').length)
    {  
	$('#booking_policy').click(function(){
		$('#content_window').dialog({modal: true, width: 700, height: 500});
		return false;
	});
    }
}

function setupPropertyDetails()
{
    if ($('#property_details').length)
    {
      $('#property_details').click(function(){
	      $('#property_details_window').dialog({modal: true, width: 700, height: 500});
	      return false;
      });
    }
}

function checkForDisabledDates(date)
{
   if (typeof(disabledDays) == "undefined")
      return [true];
  var mysql_date = date.getFullYear() + '-' +
     (date.getMonth() < 9 ? '0' : '') + (date.getMonth()+1) + '-' +
     (date.getDate() < 10 ? '0' : '') + date.getDate()  

  if($.inArray(mysql_date,disabledDays) > -1) {
    return [false];
  }
  
  return [true];
}

function setupDatePickers()
{
      var date_format = 'mm/dd/yy';
      if (typeof(DATE_FORMAT) != "undefined")
      {
	date_format = DATE_FORMAT.replace('yyyy', 'yy');
      }
      
	$(".lum-datepicker").datepicker({
		dateFormat: date_format,
		minDate: 0,
		onSelect : function(dateText, inst)
		{
		    var id = $(this).attr('id');
		   // console.log(id);
		    var temp = id.split('_');
		    if (temp[1] == 'arrival')
		    {
			var d = new Date((parseInt(inst.currentMonth)+1)+'/'+inst.currentDay+'/'+inst.currentYear);
			if (typeof(min_nights) != "undefined")
			  d.setDate(d.getDate()+min_nights);
			else
			  d.setDate(d.getDate()+1);					
			$('#'+temp[0]+'_departure').datepicker('option', 'minDate', d);
			$('#'+temp[0]+'_departure').datepicker('setDate', d);
			//console.log(temp[0]+'_departure');
			//console.log($('#'+temp[0]+'_departure').val());
			//console.log(d);
		    }
		},
		beforeShowDay: function (date)
		{
		  if ($(this).hasClass('lum-disabled-dates'))
		    return checkForDisabledDates(date);
		  else
		    return [true];
		}
		
	});
	
	
	
	if ($(".lum-restrict-dates").length)
	{
	  //$(".lum-restrict-dates").datepicker('setDate', min_date);
	  $(".lum-restrict-dates").datepicker('option', 'minDate', min_date);
	  $(".lum-restrict-dates").datepicker('option', 'maxDate', max_date);
	}
	
	$('.lum-calendar-trigger').click(function()
	{
		if ($(this).next().hasClass('lum-datepicker'))
		{
		    $('#'+$(this).next().attr('id')).datepicker('show');
		}
		else
		{
		  if ($(this).prev().hasClass('lum-datepicker'))
		  {
		      $('#'+$(this).prev().attr('id')).datepicker('show');
		  }
		}
		
	});
}


function setupServices()
{
	if ($('.lum-add-service').length)
	{  
	  var date_format = 'mm/dd/yy';
	  if (typeof(DATE_FORMAT) != "undefined")
	  {
	    date_format = DATE_FORMAT.replace('yyyy', 'yy');
	  }
	    $(".lum-service-datepicker").datepicker({
		    dateFormat: date_format,
		    maxDate: max_service_date,
		    onSelect : function(dateText, inst)
		    {
			var temp = $(this).attr('name').split('_');
			var id = temp[2];		      
			var date1 = new Date((parseInt(inst.currentMonth)+1)+'/'+inst.currentDay+'/'+inst.currentYear);

			
			$('#date_'+id).val(date1.getFullYear() + '-' + (date1.getMonth() < 9 ? '0' : '') + (date1.getMonth()+1) + '-' + (date1.getDate() < 10 ? '0' : '') + date1.getDate());				
		    }		    
	    });
     
	    $(".lum-service-datepicker").each(function(){
		var temp = $(this).attr('id').split('_');
		if (temp[0] == 'use')
		{
		  $(this).datepicker('option', 'minDate', min_service_date[temp[2]]);
		}
	    });

	    $('.lum-service-calendar-trigger').click(function()
	    {
		    $('#'+$(this).next().attr('id')).datepicker('show');
	    });
	

	  $('.lum-add-service').click(function(){
	    
	      var temp = $(this).attr('name').split('_');
	      var id = temp[1];
	      
	      if (parseInt($('#quantity_'+id).val()) > 0)
	      {
		var order_id = 'order_'+id;
		
		if ($('#use_date_'+id).length)
		{
		    var date = $('#use_date_'+id).val().replace(/\//g, '_');
		    order_id = 'order_'+id+'_'+date;
		    
			if (typeof(service_dates[id]) == "undefined")
			  service_dates[id] = new Array();
			  
			service_dates[id].push($('#use_date_'+id).datepicker('getDate'));
			service_dates[id].sort(date_sort_asc);		    
		    
		}
  
		if ($('#'+order_id).length)
		{
		    // if we already have this service and date, let's just add the quantities
		    var quantity = parseInt($('#'+order_id).val());
		    quantity += parseInt($('#quantity_'+id).val());
		    if (quantity > max_options)
		      quantity = max_options;
		    $('#'+order_id).val(quantity);
		}
		else
		{
		    $('#services_order').append('<input type="hidden" name="'+order_id+'" id="'+order_id+'" value="'+$('#quantity_'+id).val()+'"/>');
		}
  
		renderServicesCart();
	      }
	  });
	 
	 if (render_services)
	    renderServicesCart();
	 
	}
}

function renderServicesCart()
{
  $('#services_render').html('');
  var total = 0;
  $('#services_order').children(':input').each(function(){
      var temp = $(this).attr('id').split('_');
      var date_str = '';
      if (temp.length > 2)
	  date_str = temp[2]+'/'+temp[3]+'/'+temp[4];      
      var title = services[temp[1]];
      
      var rate = 0;      
      if (typeof(rates[temp[1]])=='object')
      {
	var rate_date = date_str;
	if (first_rate[temp[1]])
	{
	    $('#temp_datepicker').datepicker('setDate', service_dates[temp[1]][0]);
	    rate_date = $('#temp_datepicker').val();
	}
	
	rate = rates[temp[1]][rate_date]
      }
      else
      {
	rate = rates[temp[1]];
      }
      
      if (typeof(rate) == "undefined")
      {
	$(this).remove();
	lum_alert('Cannot add service', 'Sorry, but the service you\'re trying to add does not have current pricing.');
      }
      
      
      rate = rate * parseInt($(this).val());
      total += rate;
      var html = '<tr><td><img src="/cms-themes/Default/images/delete.png" style="padding: 3px; cursor: pointer;" align="absmiddle" class="remove_service" "remove_'+$(this).attr('id')+'" id="remove_'+$(this).attr('id')+'"/>'+title+'</td><td><select name="qty_'+$(this).attr('id')+'" id="qty_'+$(this).attr('id')+'" class="update_quantity">';
      
      for (var i=0;i<=max_options;i++)
      {
	sel = '';
	if (i == $(this).val())
	  sel = ' selected="selected"';
	  
	html += '<option value="'+i+'"'+sel+'>'+i+'</option>';
      }
      
      html += '</select></td><td>'+date_str+'</td><td>$'+number_format(rate, 2)+'</td></tr>';
  
      $('#services_render').append(html);
      
      $('.update_quantity').change(function(){
	  var id = $(this).attr('id').replace('qty_', '');
	  $('#'+id).val($(this).val());
	  
	  if ($(this).val() == 0)
	  {
	    var temp = $(this).attr('id').split('_');
	    var date_str = temp[3]+'/'+temp[4]+'/'+temp[5];
	    $('#temp_datepicker').datepicker('setDate', date_str);
	    var remove = $('#temp_datepicker').datepicker('getDate');
	    for (var i=0;i<service_dates[temp[2]].length;i++)
	    {
		if (service_dates[temp[2]][i].getTime() == remove.getTime())
		  service_dates[temp[2]].splice(i,1);
	    }
	  }
	  
	  if ($(this).val() > 0)
	  {
	    var temp = $(this).attr('id').split('_');
	    var date_str = temp[3]+'/'+temp[4]+'/'+temp[5];
	    $('#temp_datepicker').datepicker('setDate', date_str);
	    var add_date = $('#temp_datepicker').datepicker('getDate');
	    var found_date = false;
	    for (var i=0;i<service_dates[temp[2]].length;i++)
	    {
		if (service_dates[temp[2]][i].getTime() == add_date.getTime())
		{
		  found_date = true;
		  break;
		}
	    }
	    
	    if (!found_date)
	    {
		  if (typeof(service_dates[temp[2]]) == "undefined")
		    service_dates[temp[2]] = new Array();
		    
		  service_dates[temp[2]].push(add_date);
		  service_dates[temp[2]].sort(date_sort_asc);	
	    }
	  }
	  
	  
	  renderServicesCart();
      });
      
      $('.remove_service').click(function(){
	    var temp = $(this).attr('id').split('_');
	    var date_str = temp[3]+'/'+temp[4]+'/'+temp[5];
	    $('#temp_datepicker').datepicker('setDate', date_str);
	    var remove = $('#temp_datepicker').datepicker('getDate');
	    for (var i=0;i<service_dates[temp[2]].length;i++)
	    {
		if (service_dates[temp[2]][i].getTime() == remove.getTime())
		  service_dates[temp[2]].splice(i,1);
	    }
	    
	    
	  var id = $(this).attr('id').replace('remove_', '');
	  $('#'+id).remove();
	  renderServicesCart();
      });
      
  });
  $('#subtotal').html('$'+number_format(total, 2));
  var taxes = computeServiceTaxes(total);
  $('#total').html('$'+number_format(total + taxes, 2));
}


// cache the large photos for quicker loading
function cachePhotos()
{
 	var args_len = photo_list.length;
	for (i = 0;i<args_len; i++)
	{
	  var cacheImage = document.createElement('img');
	  cacheImage.src = photo_list[i].photo;
	  photo_cache[i] = cacheImage;
	} 
}

function nextPhoto()
{
	current_index++;
	if (current_index >= photo_list.length)
	{
		current_index = 0;
	}
	setPhoto(current_index);
}

function prevPhoto()
{
	current_index--;
	if (current_index < 0)
	{
		current_index = photo_list.length - 1;
	}
	setPhoto(current_index);	
}

function setPhoto(index)
{
	//if (!photo_obj.isOpened())
//	  photo_obj.load();
	
	window.scroll(0,0);
	$('#large_image_src').fadeOut(100, function()
	{
		// figure out our index
		if (typeof index != 'number')
		{
			var temp = index.target.id.split('_');
			index = parseInt(temp[1]);
		}
		$("#large_image_src").attr("src", photo_cache[index].src);
		$('#photo_gallery_overlay .caption').html(photo_list[index].caption);
		
		var current_page = index + 1;
		
		$('#photo_gallery_overlay .gallery_status').html(current_page + '/' + photo_list.length);
		current_index = index;						
		$("#large_image_src").fadeIn(100);
		
		if (!$('#photo_gallery_overlay').is(":visible"))
			$('#photo_gallery_overlay').fadeIn(200);
		
	});
	
	  	
}


function setupFormValidators()
{
	$.validationEngineLanguage.newLang()
	
	if ($("#lum-res-form").length)
	{
		$("#lum-res-form").validationEngine({success: verifyTravelers});
	}
	
	if ($("#lum-additional-persons-form").length)
		$("#lum-additional-persons-form").validationEngine();

		
		
}

function verifyTravelers()
{
  if ($('#res_adults').val() == '')
  {
      lum_alert("Select Number of Travelers", "Please select the number of travelers then click on Update Travelers");
      $("#lum-res-form").unbind("submit");
      $("#lum-res-form").validationEngine({success: verifyTravelers})  
      return false;
  }
  $("#lum-res-form").submit();
}

 function doCheckCreditCard()
 {
	var card_num = $('#card_number').val();
	//var card_type = $('#card_type').val();
	var val = checkCreditCard(card_num);
	return (val ? false : true);
 }
 
function checkCreditCard (cardnumber) {
     
  // Array to hold the permitted card characteristics
  var cards = new Array();

  // Define the cards we support. You may add addtional card types.
  
  //  Name:      As in the selection box of the form - must be same as user's
  //  Length:    List of possible valid lengths of the card number for the card
  //  prefixes:  List of possible prefixes for the card
  //  checkdigit Boolean to say whether there is a check digit
  
  cards [0] = {name: "Visa", 
               length: "13,16", 
               prefixes: "4",
               checkdigit: true};
  cards [1] = {name: "MasterCard", 
               length: "16", 
               prefixes: "51,52,53,54,55",
               checkdigit: true};
/*  cards [2] = {name: "AmEx", 
               length: "15", 
               prefixes: "34,37",
               checkdigit: true};
  cards [3] = {name: "Discover", 
               length: "16", 
               prefixes: "6011,622,64,65",
               checkdigit: true};*/
               
	       
  if (cardnumber.indexOf('4') == 0)
    cardType = 0;
  else if (cardnumber.indexOf('5') == 0)
    cardType = 1;
  else if (cardnumber.indexOf('3') == 0)
    cardType = 2;
  else if (cardnumber.indexOf('6') == 0)
    cardType = 3;
  else
    return false;

  // Ensure that the user has provided a credit card number
  if (cardnumber.length == 0)  {
     ccErrorNo = 1;
     return false; 
  }
    
  // Now remove any spaces from the credit card number
  cardnumber = cardnumber.replace (/\s/g, "");
  
  // Check that the number is numeric
  var cardNo = cardnumber
  var cardexp = /^[0-9]{13,19}$/;
  if (!cardexp.exec(cardNo))  {
     ccErrorNo = 2;
     return false; 
  }
       
  // Now check the modulus 10 check digit - if required
  if (cards[cardType].checkdigit) {
    var checksum = 0;                                  // running checksum total
    var mychar = "";                                   // next char to process
    var j = 1;                                         // takes value of 1 or 2
  
    // Process each digit one by one starting at the right
    var calc;
    for (var z = cardNo.length - 1; z >= 0; z--) {
    
      // Extract the next digit and multiply by 1 or 2 on alternative digits.
      calc = Number(cardNo.charAt(z)) * j;
    
      // If the result is in two digits add 1 to the checksum total
      if (calc > 9) {
        checksum = checksum + 1;
        calc = calc - 10;
      }
    
      // Add the units element to the checksum total
      checksum = checksum + calc;
    
      // Switch the value of j
      if (j ==1) {j = 2} else {j = 1};
    } 
  
    // All done - if checksum is divisible by 10, it is a valid modulus 10.
    // If not, report an error.
    if (checksum % 10 != 0)  {
     ccErrorNo = 3;
     return false; 
    }
  }  

  // The following are the card-specific checks we undertake.
  var LengthValid = false;
  var PrefixValid = false; 
  var undefined; 

  // We use these for holding the valid lengths and prefixes of a card type
  var prefix = new Array ();
  var lengths = new Array ();
    
  // Load an array with the valid prefixes for this card
  prefix = cards[cardType].prefixes.split(",");
      
  // Now see if any of them match what we have in the card number
  for (var z=0; z<prefix.length; z++) {
    var exp = new RegExp ("^" + prefix[z]);
    if (exp.test (cardNo)) PrefixValid = true;
  }
      
  // If it isn't a valid prefix there's no point at looking at the length
  if (!PrefixValid) {
     ccErrorNo = 3;
     return false; 
  }
    
  // See if the length is valid for this card
  lengths = cards[cardType].length.split(",");
  for (j=0; j<lengths.length; j++) {
    if (cardNo.length == lengths[j]) LengthValid = true;
  }
  
  // See if all is OK by seeing if the length was valid. We only check the 
  // length if all else was hunky dory.
  if (!LengthValid) {
     ccErrorNo = 4;
     return false; 
  };   
  
  // The credit card is in the required format.
  return true;
}

function str_replace (search, replace, subject, count) {
    var i = 0,
        j = 0,
        temp = '',
        repl = '',
        sl = 0,
        fl = 0,
        f = [].concat(search),
        r = [].concat(replace),
        s = subject,
        ra = Object.prototype.toString.call(r) === '[object Array]',
        sa = Object.prototype.toString.call(s) === '[object Array]';
    s = [].concat(s);
    if (count) {
        this.window[count] = 0;
    }

    for (i = 0, sl = s.length; i < sl; i++) {
        if (s[i] === '') {
            continue;
        }
        for (j = 0, fl = f.length; j < fl; j++) {
            temp = s[i] + '';
            repl = ra ? (r[j] !== undefined ? r[j] : '') : r[0];
            s[i] = (temp).split(f[j]).join(repl);
            if (count && s[i] !== temp) {
                this.window[count] += (temp.length - s[i].length) / f[j].length;
            }
        }
    }
    return sa ? s : s[0];
}

function number_format (number, decimals, dec_point, thousands_sep) {
    number = (number + '').replace(/[^0-9+\-Ee.]/g, '');
    var n = !isFinite(+number) ? 0 : +number,
        prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),
        sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep,
        dec = (typeof dec_point === 'undefined') ? '.' : dec_point,
        s = '',
        toFixedFix = function (n, prec) {
            var k = Math.pow(10, prec);
            return '' + Math.round(n * k) / k;
        };
    // Fix for IE parseFloat(0.55).toFixed(0) = 0;
    s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.');
    if (s[0].length > 3) {
        s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep);
    }
    if ((s[1] || '').length < prec) {
        s[1] = s[1] || '';
        s[1] += new Array(prec - s[1].length + 1).join('0');
    }
    return s.join(dec);
}

function lum_alert(title, msg)
{
	$("#dialog:ui-dialog").dialog( "destroy" );
	$("#dialog").attr('title', title);
	$("#dialog").html(msg);
	lum_dialog();
}

function lum_dialog(buttons)
{
	$( "#dialog" ).dialog({
		resizable: false,
		height: 'auto',
		modal: true,
		buttons: buttons
	});
}


  function mysqlTimeStampToDate(timestamp) {
    //function parses mysql datetime string and returns javascript Date object
    //input has to be in this format: 2007-06-05 15:26:02
    var regex=/^([0-9]{2,4})-([0-1][0-9])-([0-3][0-9])$/;
    var parts=timestamp.replace(regex,"$1 $2 $3").split(' ');
    return new Date(parts[0],parts[1]-1,parts[2]);
  }

var date_sort_asc = function (date1, date2) {
  if (date1 > date2) return 1;
  if (date1 < date2) return -1;
  return 0;
};


