// XO Private - main JavaScript functions

if(document.getElementById && document.getElementsByTagName) {
  document.write('<link rel="stylesheet" type="text/css" href="stylesheets/js.css" media="screen" />');
}


/* Tracing function for jsTrace() - http://www.easy-designs.net/code/jsTrace/ */
function trace( msg ){
  if( typeof( jsTrace ) != 'undefined' ){
    jsTrace.send( msg );
  }
}

// Cancel default action
function stopEvent(e) {
  if (window.event) {
    window.event.cancelBubble = true;
    window.event.returnValue = false;
  }
  
  if (e && e.stopPropagation && e.preventDefault) {
    e.stopPropagation();
    e.preventDefault();
  }
}

// Image Preview
var ImagePreview = Tips.extend({
    start: function(el){
		this.wrapper.setHTML('<img src="images/loading.gif" />');
		
		var wrapper = this.wrapper;
		var src = el.src.replace(/-r1.jpg|-r2.jpg|-r3.jpg/, '-l.jpg'); 
		
		var image = new Image();
        image.src  = src;
		
		function showImage()  {
		   wrapper.setHTML('<img class="preview" src="' + image.src + '" />');
		}
		
		if (image.complete) {
		   showImage();
		} else {
		   image.onload = showImage;
		} 

        $clear(this.timer);
		this.timer = this.show.delay(this.options.showDelay, this);
	}
});

function initImagePreview() {
 var myTips = new ImagePreview($$('.thumb'));
}

// Resolution depended design
function checkSize() {

    if (!document.getElement) { 
        return;
    }

    var body = document.getElement('BODY');
	var w;
	
	// all except Explorer
    if (self.innerHeight) {
        w = self.innerWidth;
    
    // Explorer 6 Strict Mode
    } else if (document.documentElement && document.documentElement.clientHeight) {
        w = document.documentElement.clientWidth;
    
    // other Explorers
    } else if (document.body) {
        w = document.body.clientWidth;
    }

    // Change layout depending on browser window size
    if (w < 995) {
		body.addClass('narrow-layout'); 
    } else {
	   body.removeClass('narrow-layout'); 
	}
}

function initEmptyFields() {
	emptyField('search-txt');
	emptyField('email');
	emptyField('search-term');
}

function emptyField(field) {
	if (!$(field)) { 
        return;
    }

    $(field).onfocus = function() {
        if (field != "search-txt" && field != "search-term") {
          $(field).value = "";
        } else if ($(field).value == "Enter the search term") {
          $(field).value = "";
        }
    }
	
	if (field == "search-txt") {
		$("search").onsubmit = function(e) 
		{
			if ($(field).value == "Enter the search term") {
				alert("Search Error\nPlease enter the search term before clicking on the Search button!");
				stopEvent(e);
			}
		}
	}
}

function getAreaName(url) {
	var arr = url.split("/");
    var href = arr.pop();
        
	if (href == "") {
	  href = arr.pop();
    }
		
    return href.split("#").pop();
}

function initMap() {

    if (!$('map')) {
		return;
	}
	
	var areas = $$('AREA');
	var map = $('map');
	var map_alt = map.getProperty('alt');
	var src = map.src;
	var map_area = $('map-area');

    areas.each(function(el, i) {

      var area_name = getAreaName(areas[i].href);
	  
	  // Preload images
	  var over_image = new Image();
	  over_image.src = '/images/maps/over/' + area_name + '.gif)';
	  
	  areas[i].onmouseover = function() {
		
		var href = getAreaName(this.href);
		
        if (href == 'russian-federation' && map_alt == 'Far East') {
		   var image_src = '/images/maps/over/russian-federation-far-east.gif';
		} else {
		   var image_src = '/images/maps/over/' + href + '.gif';
		}

		map.src = image_src;
      };
	  
	  areas[i].onmouseout = function() {
		map.src = src;
      };
	  
	  areas[i].onclick = function() {
 	    location.href = this.href;
		initProfiles();
      };
    });
}

function removeLoadingMap() {
	
	if (!$('map-area')) {
		return;
	}
	
    var map_area = $('map-area');
	map_area.removeClass('loading-map');
}

// Hover effect on random profile links
function initRandoms() {
	var random_images = $$('.random_image');
	var random_links = $$('.random_link');
	
	random_images.each(function(el, i) {
       random_images[i].onmouseover = function() {
		   random_links[i].addClass('hover');
	   };

	   random_images[i].onmouseout = function() {
           random_links[i].removeClass('hover');
	   };
    });
}

// Hover effect profile card images
function initProfileCards() {
	var profile_cards = $$('.profile-card');
	
	profile_cards.each(function(el, i) {
       profile_cards[i].onmouseover = function() {
		   profile_cards[i].getElements('a').addClass('hover');
	   };
	   
	   profile_cards[i].onmouseout = function() {
		   profile_cards[i].getElements('a').removeClass('hover');
	   };
    });
}


// Opening / closing profiles in list
function initProfiles() {
	var profiles_links = $$('.profiles-link');
	var profiles_wrappers = $$('.profiles-wrapper');
	
	var path = location.href;
    var path_parts = path.split("#");
	
	profiles_links.each(function(el, i) {
	   
       if(profiles_links[i].getProperty('id') == path_parts[1] && path_parts[1] != undefined) {
		   closeAllProfiles(profiles_wrappers, i);
		   loadProfilesImages(profiles_wrappers[i]);
           profiles_wrappers[i].toggleClass('display');
		   profiles_wrappers[i].getParent().toggleClass('displayed');
       }
								 
       profiles_links[i].onclick = function(e) {
		   closeAllProfiles(profiles_wrappers, i);
		   loadProfilesImages(profiles_wrappers[i]);
		   profiles_wrappers[i].toggleClass('display');
		   profiles_wrappers[i].getParent().toggleClass('displayed');
		   stopEvent(e);
	   };
    });
}

function loadProfilesImages(profile_wrapper) {
	var images = $ES('img', profile_wrapper);

	images.each(function(el, i) {
        var a = images[i].getParent();
		var area = getAreaName(a.href);
		images[i].src = images[i].src.replace(/load-small.gif/, area + '-r1.jpg');
    }); 
}

function closeAllProfiles(elements, current) {
	for (var i = 0; i < elements.length; i++ ) {
		if (i != current) {
		   elements[i].removeClass('display');
		   elements[i].getParent().removeClass('displayed');
		}
	}
}

function initSentToFriend()
{
	if (!$('send-to-friend')) {
		return;
	}
	
	var send_form = $('send-to-friend');
    var send_link = $('send-to-friend-link');
	var close_link = $('close-send-to-friend');

    var from_name  = $("your-name");
    var from_email = $("your-email");
    var to_name = $("friend-name");
    var to_email = $("friend-email");

    send_link.onclick = function(e) {
		send_form.toggleClass('showed');
		send_form.setStyle('left', this.getLeft() + 'px');
		
		var top = this.getTop() + 35;
		
		send_form.setStyle('top', top + 'px');
		$E('body').appendChild(send_form);

		stopEvent(e);
    };
	
	send_form.onsubmit = function(e) {
        
        var validated = true;
       
        if (!checkFill(from_name)) {
            validated = false;    
        }
        
        if (!checkFill(from_email)) {
            validated = false;    
        } else {
            if (!checkEmail(from_email)) {
                validated = false;
            }
        }
        
        if (!checkFill(to_name)) {
            validated = false;
        }
        
        if (!checkFill(to_email)) {
            validated = false;
        } else {
            if (!checkEmail(to_email)) {
                validated = false;
            }
        }
        
        if (validated) {
			this.send();
            alert('The postcard from ' + from_name.value + ' <' + from_email.value + '> will be sent to\n ' + to_name.value + ' <' + to_email.value + '>. Thank you.');
			send_form.removeClass('showed');
            return false;
        } else {
            return false;
        }
        
    }
	
	close_link.onclick = function(e) {
		send_form.removeClass('showed');
		stopEvent(e);
	}
	
	from_name.onchange = function() {
        checkFill(this);
    }
    
    from_email.onchange = function() {
        if(checkFill(this)) {
            checkEmail(this);
        }
    }
    
    to_name.onchange = function() {
        checkFill(this);
    }
    
    to_email.onchange = function() {
        if(checkFill(this)) {
            checkEmail(this);
        }
    }
}

// Check if field is not empty
function checkFill(input) {
    
    // Append error if field is empty
    if (input.value == '') {
        removeError(input);
        appendError(input, 'Field cannot be empty')
        return false;
        
    // Remove error if field filled
    } else {
        removeError(input);
        return true;
    }
}

function checkEmail(input) {
    
    var pattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.([a-zA-Z]{2,4})$/;
    
    // Append error if email is not in correct format   
    if (pattern.exec(input.value) == null) {
        removeError(input);
        appendError(input, 'Email is not in correct format')
        return false;
    // Remove error if     
    } else {
        removeError(input);
        return true;    
    }
}

/**
 * Append error message to table cell with input
 * @param object t input element
 * @param string err_mess error message
 */  
function appendError(t, err_mess) {
    
    // Get table cell in which is input element
    while (t.nodeName.toLowerCase() != 'td') {
        var t = t.parentNode;
    }
    
    // Check if there are any errors elements already appended to table cell
    var spans = t.getElementsByTagName('span');
    if (spans.length > 0) {
        return;
    }
    
    // Create new error element
    var span = document.createElement('span');        
    span.innerHTML = err_mess;
    t.appendChild(span);
}

/**
 * Remove all error elements from table cell
 * @param object t input element
 */  
function removeError(t) {
    
    // Get table cell in which is input element
    while (t.nodeName.toLowerCase() != 'td') {
        var t = t.parentNode;
    }
    
    // Get all SPANs
    var span = t.getElementsByTagName('span');
   
    for(var i = 0; i < span.length; i++) {
        t.removeChild(span[i]);    
    }
}


// Random profiles
function initRandomProfiles() {
	
	if (!$('random-profiles-link')) {
		return;
	}
	
	var random_profiles_link = $('random-profiles-link');
	
	random_profiles_link.onclick = function(e) {
	  var myAjax = new Ajax('/random-profiles' + location.pathname, {update: 'random-profiles'}).request();
	  stopEvent(e);
	}
}

function initPrint() {
  
  var print_links = $$('a.print');
  
  print_links.each(function(el, i) {
    print_links[i].onclick = function(e) {
	  if (confirm('Page will be formatted for print and printed')) {
        window.print();
      }	
	  stopEvent(e);
	}
  });
}

function initDisableSubmit() {
  
  var submits = $$('input.submit');
  
  submits.each(function(el, i) {
    submits[i].onclick = function(e) {
	  this.src = this.src.replace(/.gif/, '_d.gif'); 
      this.disabled = true;
	  
	  var element = this;
	  
	  while (element.nodeName.toLowerCase() != 'form') {
        var element = element.getParent();
      }
      
	  element.submit();
	}
  });
}

// Slideshow
var XOSlideshow = Slideshow.extend({
	
	loaded: function() {
		
		if (this.ul) {
			anchors = $ES('a[name]', this.ul);
			anchors.each(function(a, i) {
				if (i == this.curr[0]) { a.addClass(this.props.classes[2]); }
				else { a.removeClass(this.props.classes[2]); }
			}, this);
		}

		this.direction = 'left';
		this.curr[0] = (this.curr[0] == this.props.images.length - 1) ? 0 : this.curr[0] + 1;
		this.curr[1]++;
		this.timer[0] = (new Date).getTime() + this.props.duration[1] + ((this.props.type.test(/fade|push|wipe/)) ? this.props.duration[0] : 0);
		this.timer[1] = (new Date).getTime() + this.props.duration[0];

		this.loader = new Image();
		this.loader.src = this.props.hu + this.props.images[this.curr[0]].trim();
		
		if (this.curr[1] != this.loopsNum) {
		  this.preload();
		}
	}
});

function initSlideshow() {
	
  if (!$('slideshow')) {
		return;
  }
	
  myShow = new XOSlideshow('slideshow', {hu: 'images/slideshow/', duration: [2500, 6000], images: ['1.jpg','2.jpg','3.jpg','4.jpg','5.jpg','6.jpg','7.jpg','8.jpg','9.jpg','10.jpg'], captions: 
  ['<a href="/hotels-and-resorts/">Hotels &amp; Resorts</a> » <a href="/hotels-and-resorts/south-america/">South America</a> » <a href="/hotels-and-resorts/south-america/#chile">Chile</a> <br /> <a href="/hotels-and-resorts/south-america/nomads-of-the-seas/" class="profile">Nomads of the Seas</a>', 
  '<a href="/hotels-and-resorts/">Hotels &amp; Resorts</a> » <a href="/hotels-and-resorts/far-east/">Far East</a> » <a href="/hotels-and-resorts/far-east/#india">India</a> <br /> <a href="/hotels-and-resorts/far-east/taj-lake-palace/" class="profile">Taj Lake Palace</a>', 
  '<a href="/hotels-and-resorts/">Hotels &amp; Resorts</a> » <a href="/hotels-and-resorts/far-east/">Far East</a> » <a href="/hotels-and-resorts/far-east/#thailand">Thailand</a> <br /> <a href="/hotels-and-resorts/far-east/lebua-at-state-tower/" class="profile">lebua at State Tower</a>',
  '<a href="/service-companies/">Service Companies</a> » <a href="/service-companies/private-jet-charter/">Private Jet Charter</a> » <a href="/service-companies/private-jet-charter/europe/#united-kingdom">Europe</a> <br /> <a href="/service-companies/private-jet-charter/bookajet/" class="profile">Bookajet.com</a>', 
  '<a href="/hotels-and-resorts/">Hotels &amp; Resorts</a> » <a href="/hotels-and-resorts/africa-and-indian-ocean/">Africa &amp; Indian Ocean</a> » <a href="/hotels-and-resorts/africa-and-indian-ocean/#south-africa">South Africa</a> <br /> <a href="/hotels-and-resorts/africa-and-indian-ocean/marataba-safari-company/" class="profile">Marataba Safari Company</a>',
  '<a href="/adventures/">Adventures</a> » <a href="/adventures/water/">Water</a> <br /> <a href="/adventures/water/quark-expeditions/" class="profile">Quark Expeditions</a>',
  '<a href="/service-companies/">Service Companies</a> » <a href="/service-companies/luxury-car-rental/">Luxury Car Rental</a> » <a href="/service-companies/luxury-car-rental/#europe">Europe</a> <br /> <a href="/service-companies/luxury-car-rental/elite-rent-a-car/" class="profile">Elite Rent&ndash;A&ndash;Car</a>',
  '<a href="/hotels-and-resorts/">Hotels &amp; Resorts</a> » <a href="/hotels-and-resorts/europe/">Europe</a> » <a href="/hotels-and-resorts/europe/#greece">Greece</a> <br /> <a href="/hotels-and-resorts/europe/danai-beach/" class="profile">Danai Beach Resort &amp; Villas</a>', 
  '<a href="/service-companies/">Service Companies</a> » <a href="/service-companies/private-yacht-charter/">Private Yacht Charter</a> » <a href="/service-companies/private-yacht-charter/europe/#monaco">Europe</a> <br /> <a href="/service-companies/private-yacht-charter/fraser-yachts/" class="profile">Fraser Yachts</a>', 
  '<a href="/hotels-and-resorts/">Hotels &amp; Resorts</a> » <a href="/hotels-and-resorts/africa-and-indian-ocean/">Africa &amp; Indian Ocean</a> » <a href="/hotels-and-resorts/africa-and-indian-ocean/#namibia">Namibia</a> <br /> <a href="/hotels-and-resorts/africa-and-indian-ocean/goche-ganas/" class="profile">GocheGanas Nature Reserve &amp; Wellness Village</a>']});
  myShow.loopsNum = Math.floor(Math.random() * 10) + 10;
}

function initBookSlideshow() {

  if (!$('book-slideshow')) {
		return;
  }
	
  myShow = new Slideshow('book-slideshow', {hu: '/images/book/the-book/', duration: [2500, 6000], images: ['ananda-in-the-himalayas.png','evason-hideaway-spa-at-yao-noi.png','hotel-de-orangerie.png','ichobezi-luxury-safari-boat.png','lebua-at-state-tower.png','nomads-of-the-seas.png', 'residenza-del-moro.png', 'soaring-safaris-cape-town-to-cairo.png']});
}


window.addEvent('load', checkSize);
window.addEvent('resize', checkSize);
window.addEvent('load', initEmptyFields);
window.addEvent('load', initImagePreview);
window.addEvent('load', initMap);
window.addEvent('load', initRandoms);
window.addEvent('load', initProfiles);
window.addEvent('load', initProfileCards);
window.addEvent('load', initSentToFriend);
window.addEvent('load', initRandomProfiles);
window.addEvent('load', initPrint);
window.addEvent('load', initSlideshow);
window.addEvent('load', initBookSlideshow);
window.addEvent('load', removeLoadingMap);
// window.addEvent('load', initDisableSubmit);
