﻿// JavaScript Document
var map;
var selectedCurrency = localization.ru.RUR;
var selectedCurrencyCode = 'RUR';

// Object size
Object.size = function(obj) {
    var size = 0, key;
    for (key in obj) {
        if (obj.hasOwnProperty(key)) size++;
    }
    return size;
};


// Add trim() to any string
String.prototype.trim = function(){
    return this.replace(/^[\s\u00a0]+|[\s\u00a0]+$/g, '');
};
// Add getEpDate() to any string
String.prototype.getEpDate = function(){
    var re = /(\d{2})\.(\d{2})\.(\d{4})/;
    if (!re.test(this)) {
        return '';
    }
    else {
        this.match(re);
        var day = RegExp.$1;
        var month = RegExp.$2;
        var year = RegExp.$3;
        return year + month + day;
    }
};
// Add addDays() to any date
Date.prototype.addDays = function(numDays){
    return new Date(this.getTime() + numDays * 24 * 60 * 60 * 1000);
}

// Extending functionality for Calendar
jQuery.fn.extend({
    mainCalendarSetPrice: function(_text, _priceFor){
        return this.each(function(){
            $("#" + this.id + ":not(.before-today) #price-" + this.id).html(_text).attr("title", _priceFor);
        });
    },
    mainCalendarSetAvailable: function(){
        return this.each(function(){
            $(this).not(".before-today").addClass("available");
        });
    },
    mainCalendarRemoveAvailable: function(){
        return this.each(function(){
            $(this).not(".before-today").removeClass("available");
        });
    },
    mainCalendarSetHoverable: function(){
        return this.each(function(){
            $(this).not(".before-today").addClass("hoverable");
        });
    },
    mainCalendarRemoveHoverable: function(){
        return this.each(function(){
            $(this).not(".before-today").removeClass("hoverable");
        });
    },
    mainCalendarSetLabel: function(_text){
        return this.each(function(){
            $("#" + this.id + ":not(.before-today) #label-" + this.id).text(_text);
        });
    },
    mainCalendarSetGreen: function(){
        return this.each(function(){
            $("#" + this.id + ":not(.before-today) #" + this.id + "-wrap-1").addClass("green");
        });
    },
    mainCalendarRemoveGreen: function(){
        return this.each(function(){
            $("#" + this.id + ":not(.before-today) #" + this.id + "-wrap-1").removeClass("green");
        });
    },
    mainCalendarSetSalad: function(){
        return this.each(function(){
            $("#" + this.id + ":not(.before-today) #" + this.id + "-wrap-1").addClass("salad");
        });
    },
    mainCalendarRemoveSalad: function(_day, _text){
        return this.each(function(){
            $("#" + this.id + ":not(.before-today) #" + this.id + "-wrap-1").removeClass("salad");
        });
    }
});

var iTravel = {
    // iTravel Framework. jQuery 1.3.2 required.
	
	// Weather
	weatherParams: {
		day : "день",
		night : "ночь",
		getIcon : function (_isDay,_cloudness,_falls) {
			var _t = (_isDay)?"day":"night";
			var _c = Math.floor(_cloudness/25); 
			if (_c > 3)
				_c = 3;
			var _r = _c > 0? +_falls +(_c-1)*4+1 : 0; 
			return "/images/weather/"+_t+"/"+_r+".gif";
		},
		getText : function (_cloudness,_falls,_drops) {
			var _t = "";
			if (_drops >= 0.5 && _drops < 2)
				_t = "небольшой ";
			else if (_drops >= 6)
				_t = "сильный ";
			var _f = null;
			switch(+_falls){
				case 1:
					_f="дождь";
					break;
				case 2:
					_f="снег с дождем";
					break;
				case 3:
					_f="снег";
					break;
			}
			var _c = Math.floor(_cloudness/25);
			switch(_c){
				case 0:
				return "ясно";
				case 1:
					return "малооблачно" + ((_f!=null)?", "+_t+_f:"");
				case 2:
					return "облачно" + (_f!=null?", " + _t +_f:"");
				default:
					return "пасмурно" + (_f!=null?", " + _t +_f:"");
			}
		}
	},
	
	setWeatherNew: function(countryCode){
		var rp5Codes = countriesRp5Codes[countryCode];
		if (rp5Codes!=null) {
			for (var i=1;i<=rp5Codes.length;i++) {
				this.setWeather("#j_weather_" + i, rp5Codes[i-1]);
			}
		}
	},
	
	setWeather: function(_ctrl, _resort) {
		var $ctrl = $(_ctrl);
		if (_resort == null || weather[_resort]==null) {
			$ctrl.hide();
			return;
		} else 
			$ctrl.show();
		var _data = weather[_resort];
		$ctrl.find(".j-weather-where").text(_data["title2"]);
		$ctrl.find(".j-more-weather").attr("href","http://rp5.ru/"+_resort+"/ru");
		for (var i=0;i<4;i++) {
			var $column = $ctrl.find(".columns>.column:eq("+i+")");
			var _dataCur = _data.timesteps[i];
			$column.find(".date").text(_dataCur["date"]);
			$column.find(".daynighttemp").html( ((_dataCur["isDay"])?iTravel.weatherParams.day:iTravel.weatherParams.night)+"<br />"+_dataCur["temp"]);
			$column.find(".image img").attr("src",iTravel.weatherParams.getIcon(_dataCur["isDay"],_dataCur["cloud_cover"],_dataCur["falls"]));
			$column.find(".image img").attr("alt",iTravel.weatherParams.getText(_dataCur["cloud_cover"],_dataCur["falls"],_dataCur["drops"]));
			$column.find(".image img").attr("title",iTravel.weatherParams.getText(_dataCur["cloud_cover"],_dataCur["falls"],_dataCur["drops"]));			
			
		}
		$ctrl.css("visibility","visible");
	},

	reloadCaptcha: function(id, src){
		$("#img_"+id).attr("src",src+"?"+(new Date()));
		$.ajax({type:"POST",url:"/VerifyCaptcha.action",data:"a=true",dataType:"json",success:function(data,textStat){ $("#verify_"+id).val(data.captchaExpected); } });
	},

    days_between: function(date1, date2){
        var ONE_DAY = 1000 * 60 * 60 * 24;
        var date1_ms = date1.getTime();
        var date2_ms = date2.getTime();
        var difference_ms = Math.abs(date1_ms - date2_ms);
        return Math.round(difference_ms / ONE_DAY);
    },

    clone: function(obj){
        return jQuery.extend({}, obj);
    },

	toggleControl : function (_ctrl) {
        var $ctrl = $(_ctrl); 
	    if ($ctrl.is(":hidden")) {
	        $ctrl.show();
        } else if ($ctrl.is(":visible")) {
            $ctrl.hide();
	    }
    },

	dateToString : function(_date){
		var date = _date.getDate();
		var month = _date.getMonth() + 1;
		var year = _date.getFullYear();
		if (date < 10) 
			date = "0" + date;
		if (month < 10) 
			month = "0" + month;
		return year.toString() + month.toString() + date.toString();
	},

	stringToDate : function(_date){
		var date = _date.substring(6, 8);
		var month = parseInt(_date.substring(4, 6)) - 1;
		var year = _date.substring(0, 4);
		return new Date(year, month, date);
	},

    getRoubleImg: function(color){
		var _color = color || "37a512_11_0";
        return '<img src="/images/rouble_' + _color + '.gif" class="rouble-image"/>';
    },

    getTextAccordingToCurrency: function(text, color){
        var value = "";
        if (localization.ru.USD == selectedCurrency) {
            value = selectedCurrency + ' ' + iTravel.formatPriceDigits(text);
        }
        else 
            if (localization.ru.RUR == selectedCurrency) {
                value = iTravel.formatPriceDigits(text) + '&nbsp;' + iTravel.getRoubleImg(color);
            //value = iTravel.formatPriceDigits(text) + ' <span class="rur">р<span>уб.</span></span>'
            }
            else {
                value = iTravel.formatPriceDigits(text) + ' ' + selectedCurrency;
            }
        return value;
    },
    
    formatPriceDigits: function(price){
        var _price = price.toString();
        var _output = "";
        var _counter = 1;
        for (i = _price.length - 1; i >= 0; i--) {
            _output = ((_counter - 1) % 3 == 0 && _counter > 3) ? _price.charAt(i) + " " + _output : _price.charAt(i) + _output;
            _counter += 1;
        }
        return _output;
    },
    
    //Initializing Tourist Info
    initInfo: function(){
        // Cloning Left Menu
        var $right_menu = $(".l-info .l-right-col .b-search-criteria-inner");
        $right_menu.html("");
        $("#accordion > ul > li").each(function(){
            $right_menu.append($(this).find("ul").clone());
            $right_menu.children('ul').wrap('<li></li>');
            $right_menu.children('li').hide;
            $right_menu.find("li > ul").show();
            $right_menu.find("a").unbind("click");
            $right_menu.find("a").click(function(){
                var _ind_1 = $right_menu.children("li").index($(this).parent().parent().parent());
                var _ind_2 = $right_menu.children("li:eq(" + _ind_1 + ")").find("ul > li").index($(this).parent());
                iTravel.initInfoSetLevelTwo(_ind_1, _ind_2);
            });
        });
        $("#accordion > ul >li > div > a").click(function(){
            iTravel.initInfoSetLevelOne($("#accordion > ul >li").index($(this).parent().parent()));
            return false;
        });
        $("#accordion > ul >li > div > ul > li > a").click(function(){
            //iTravel.initInfoSetLevelTwo( $("#accordion > ul >li").index($("#accordion > ul >li.active")),$("#accordion > ul >li ul >li").index($(this).parent()) );
            var _ind_1 = $("#accordion > ul > li").index($(this).parent().parent().parent().parent());
            var _ind_2 = $("#accordion > ul > li:eq(" + _ind_1 + ") > div > ul > li").index($(this).parent());
            iTravel.initInfoSetLevelTwo(_ind_1, _ind_2);
            return false;
        });
        
        var ind = 0;
        
        var activeTab = location.hash;
        if (activeTab && activeTab != "#") {
            ind = activeTab.substring(1);
        }
        iTravel.initInfoSetLevelOne(ind);
    },
    initInfoSetHeader: function(_txt){
        $(".l-info .l-right-col h3.b-page-header").text(_txt);
    },
    initInfoSetLevelOne: function(_ind_1){
        //Setting left menu
        $("#accordion > ul >li").removeClass("active");
        $("#accordion > ul ul").hide();
        $("#accordion > ul >li:eq(" + _ind_1 + ")").addClass("active");
        
        //Setting header
        iTravel.initInfoSetHeader($("#accordion > ul >li:eq(" + _ind_1 + ") > div > a").text());
        
        //Setting text notent
        $(".l-info .l-right-col .b-info-content > ul > li > ul > li").hide();
        
        //Setting right menu
        $(".l-info .l-right-col .b-search-criteria-inner > li").hide();
        $(".l-info .l-right-col .b-search-criteria-inner > li:eq(" + _ind_1 + ")").show();
        
        //Hiding next/prev
        $(".l-info .l-right-col .b-controls td h3,.l-info .l-right-col .b-controls td a").hide();
    },
    initInfoSetLevelTwo: function(_ind_1, _ind_2){
        //Hiding right menu
        $(".l-info .l-right-col .b-search-criteria-inner > li").hide();
        
        //Setting header
        iTravel.initInfoSetHeader($("#accordion > ul >li:eq(" + _ind_1 + ") ul > li:eq(" + _ind_2 + ") a").text());
        
        //Setting left menu
        $("#accordion > ul >li:eq(" + _ind_1 + ") > div > ul").show();
        $("#accordion > ul >li:eq(" + _ind_1 + ") > div > ul > li").removeClass("active");
        $("#accordion > ul >li:eq(" + _ind_1 + ") > div > ul > li:eq(" + _ind_2 + ")").addClass("active");
        
        //Showing text
        $(".l-info .l-right-col .b-info-content > ul > li > ul > li").hide();
        $(".l-info .l-right-col .b-info-content ul>li:eq(" + _ind_1 + ") ul>li:eq(" + _ind_2 + ")").show();
        
        //Showing next/prev
        $(".l-info .l-right-col .b-controls td h3").hide();
        $(".l-info .l-right-col .b-controls td a").hide();
        
        //Setting next
        $("#accordion > ul > li:eq(" + _ind_1 + ") > div > ul > li:eq(" + (_ind_2 + 1) + ")").each(function(){
            $(".l-info .l-right-col .b-controls td.next h3").show();
            var $link = $(".l-info .l-right-col .b-controls td.next a");
            $link.text($(this).text());
            $link.show();
            $link.unbind("click");
            $link.click(function(){
                iTravel.initInfoSetLevelTwo(_ind_1, _ind_2 + 1);
                return false;
            });
        });
        
        //Setting prev
        $("#accordion > ul > li:eq(" + _ind_1 + ") > div > ul > li:eq(" + (_ind_2 - 1) + ")").each(function(){
            if ((_ind_2 - 1) >= 0) {
                $(".l-info .l-right-col .b-controls td.prev h3").show();
                var $link = $(".l-info .l-right-col .b-controls td.prev a");
                $link.text($(this).text());
                $link.show();
                $link.unbind("click");
                $link.click(function(){
                    iTravel.initInfoSetLevelTwo(_ind_1, _ind_2 - 1);
                    return false;
                });
            }
        });
    },
    
    //Initializing details expand/collapse
    initDetailCollapse: function(){
        $(".b-parameter-block2:not(.no-hide)").hide();
        $(".b-parameter-block .b-change-details").click(function(){
            $(".b-parameter-block2:not(.no-hide)").hide();
            $(".b-parameter-block").show();
            $(this).parents(".b-parameter-block").hide();
            $(this).parents(".b-parameter-block").next(".b-parameter-block2:not(.no-hide)").show();
            iTravel.resizeTourDetailsPopup();
            return false;
        });
        
        //Confirm button click. Apply changes
        $(".b-parameter-block2:not(.no-hide) .b-button-confirm").click(function(){
            $(this).parents(".b-parameter-block2:not(.no-hide)").hide();
            $(this).parents(".b-parameter-block2:not(.no-hide)").prev(".b-parameter-block").show();
            iTravel.resizeTourDetailsPopup();
            return false;
        });
        
        //Cancel button click. Revert changes
        $(".b-parameter-block2:not(.no-hide) .b-button-cancel").click(function(){
            $(this).parents(".b-parameter-block2:not(.no-hide)").hide();
            $(this).parents(".b-parameter-block2:not(.no-hide)").prev(".b-parameter-block").show();
            iTravel.resizeTourDetailsPopup();
            return false;
        });
    },
    
    //Initializing search filter accordion
    initAccordion: function(_ctrl){
        var $ctrl = $(_ctrl);
        $ctrl.find(".b-search-criteria-expanded").hide();
        $ctrl.find("a.b-search-criteria").click(function(){
            var $link = $(this);
            if ($link.parent().prev().hasClass("expand")) {
                $link.find(".fixed-width-value").hide();
                $link.find(".value").hide();
            }
            else {
                $link.find(".fixed-width-value").show();
                $link.find(".value").show();
            }
            $link.parent().parent().next().slideToggle(0/*'fast'*/, function(){
                if ($link.parent().prev().hasClass("expand")) {
                    $link.parent().prev(".expand").removeClass("expand").addClass("collapse");
                }
                else {
                    $link.parent().prev(".collapse").removeClass("collapse").addClass("expand");
                }
            });
            return false;
        });
        $ctrl.find(".ui-icon.search-select").click(function(){
            $(this).next().children("a.b-search-criteria").click();
        });
    },
    
    initDetailTabs: function(_ctrl){
        var $ctrl = $(_ctrl);
        
        var params = location.hash;
        var paramsList;
        if (params && params != "#") {
            paramsList = params.substring(1).split(";");
        }
        
        var $ul = $ctrl.find(".l-tabs ul");
        $ul.find("a").click(function(){
            $ul.find("li").removeClass("active");
            $(this).parent().addClass("active");
            var ind = $ul.find("a").index($(this));
            $ctrl.find(".b-detail-tab").hide();
            $ctrl.find(".b-detail-tab-" + ind).show();
            iTravel.resizeTourDetailsPopup();
            if (this.id != "j_photos_link") {
                $("#j_photos_block").remove();
                $(".b-detail-tab.b-detail-tab-3").append("<div id='j_photos_block'></div>");
            }
            return false;
        });
        
        // init tours
        $ctrl.find("a.tab-tours").click(function(){
            $("#tab-tours").hide();
            $ctrl.find("div.tab-tours").hide();
            var $link = $(this);
            var id = $link.attr("id");
            $("div.tab-tours." + id).show();
            $("#btnBack").show();
        });
        
        $("#btnBack").click(function(){
            $ctrl.find("div.tab-tours").hide();
            $("#tab-tours").show();
            $(this).hide();
        });

        iTravel.parseAdditionalTabParam(paramsList);
        
        $("#full_desk").click(function(){
            $ul.find("li").removeClass("active");
            $ul.find("li:eq(1)").addClass("active");
            $ctrl.find(".b-detail-tab").hide();
            $ctrl.find(".b-detail-tab-1").show();
            iTravel.resizeTourDetailsPopup();
            return false;
        });
    },

    initDetailTabsClick: function(_ctrl){
        var $ctrl = $(_ctrl);
        
        var params = location.hash, activeTab = '', activeIndex = 0;
        if (params && params != "#") {
            var paramsList = params.substring(1).split(";");
            
            if (paramsList[0].indexOf('tab') == 0) {
                activeTab = paramsList[0];
                var $selected = $ctrl.find("div.b-detail-" + activeTab);
                activeIndex = $ctrl.find("div.b-detail-tab").index($selected);
            }
        }
        if (activeIndex != null && activeIndex >= 0) {
            $ctrl.find(".l-tabs a.b-detail-tab-" + activeIndex).click();
        }
    },
    
    parseAdditionalTabParam: function(arr){
        if (arr) {
            for (var i = 1; i < arr.length; i++) {
                var params = arr[i].split(",");
                if (params[0] == "questions") {
                    iTravel.getAJAXContent('/GetAnswers!' + params[1] + '.action', '#j_questions_block', 'POST', {
                        objectId: params[2],
                        questionId: params[3],
                        method: params[1]
                    });
                }
                else 
                    if (params[0] == "ShowOpinion") {
                        iTravel.getAJAXContent('/ShowOpinion.action', '#opinions_list', 'POST', {
                            opinionId: params[1],
                            hotelId: params[2]
                        });
                    }
            }
        }
    },
    
    initMyPlacesTabs: function(_ctrl){
        var $ctrl = $(_ctrl);
        $ctrl.find(".b-details-tab").hide();
        $ctrl.find(".b-details-tab-0").show();
        var $ul = $ctrl.find(".b-my-places-filter ul");
        $ul.find("li").click(function(){
            $ul.find("li").removeClass("active");
            $(this).addClass("active");
            var ind = $ul.find("li").index($(this));
            $ctrl.find(".b-details-tab").hide();
            $ctrl.find(".b-details-tab-" + ind).show();
            return false;
        });
    },
    
    resizeTourDetailsPopup: function(){
        var _dlg = $(".l-tour-detailed-popup-wrap1").parents(".b-popup");
        var _height = (Number($(".l-tour-detailed-popup-wrap2").css("paddingTop").replace("px", "")) +
        $(".l-details-block").outerHeight() +
        $(".l-tabs").outerHeight() +
        $(".l-details-header").outerHeight() +
        Number($(".l-tour-detailed-popup-wrap2").css("paddingBottom").replace("px", "")) +
        25);
        _dlg.dialog('option', 'height', _height);
        //alert("Adjusted height to '" + _height + "'");
    },
    
	initPromo: function(){
		$(".promo_active").click(function(){
				$(this).hide();
				$(".promo_inactive").show();
				$("#j_checkPromo_popup").toggle("slide", {}, 1000);
				return false;
		});
		iTravel.getPromo();
		$(".promo_hide").click(iTravel.hidePromo); 
    },

    getPromoDiscount: function(){
       var discount=0;
       $.ajax({
	async: false,
        type: 'POST',
        url: '/getPromo.action',
        cache: true,
        dataType: "json",
        success: function(json, textStatus){
		discount=json.discount;
        }
      });
	return discount;
     },

    getPromo: function(){
       $(".promo_inactive").hide();
       $(".promo_active").hide();
       $.ajax({
        type: 'POST',
        url: '/getPromo.action',
        cache: true,
        dataType: "json",
        success: function(json, textStatus){
        	if(json.discount!=0){
        		iTravel.setAJAXContent('<img src="/images/promo/discount_'+json.discount+'.png"/>','.promo_discount');
        		$('.promo_discount').show();
        	}else{
        		$('.promo_active').show();
        	}
        },
        error: function(XMLHttpRequest, textStatus, errorThrown){
        }
      });
     },

     hidePromo: function(){
		var el=$("#b_promo");
			$("#j_checkPromo_popup").toggle("slide", {}, 1000, function(){
				if(el.length==0) {
				if(window.location.href.indexOf('tours.action')>0){
					iTravelAdvSearch.doSearchAdv();
					iTravel.getPromo();
				}else if(window.location.href.indexOf('hotDeals.html')>0){
					iTravel.hotDealsUpdate();
					iTravel.getPromo();
				}else{
				window.location.reload();
				}
			   } else {
				$(".promo_inactive").hide();
				$(".promo_active").show();
				}
			});
		return false;
     },

    submitPromo: function(){
    	 var el=$("#b_promo")[0];
		if(el.value.trim()=='') return false;
		iTravel.getAJAXContent(
			'/verifyPromo.action',
			'#j_checkPromo_popup_inner',
			'POST',
			{promo:el.value}	
		);
    },
    // Where filter for homepage
    initFrom: function(_city, _country, _resort, airport2country2resort, countriesNames, airportsNames, resortsNames){
        iTravel.setCityValues(_city, _country, _resort, airport2country2resort, countriesNames, airportsNames, resortsNames);
    },
    setCityValues: function(_city, _country, _resort, airport2country2resort, countriesNames, airportsNames, resortsNames){
        $(_city).children("option").remove();
        $.each(airport2country2resort, function(i, val){
            $(_city).append('<option value="' + i + '">' + airportsNames[i] + '</option>');
        });
        $(_city).children("option[value=NULL]").attr("selected", "selected");
        iTravel.setCountryValues(_city, _country, _resort, airport2country2resort, countriesNames, airportsNames, resortsNames);
        $(_city).change(function(){
            iTravel.setCountryValues(_city, _country, _resort, airport2country2resort, countriesNames, airportsNames, resortsNames);
        });
        $(_city).selectmenu({
            style: 'dropdown',
            maxHeight: 200
        });
    },
    setCountryValues: function(_city, _country, _resort, airport2country2resort, countriesNames, airportsNames, resortsNames){
        $(_country).selectmenu('destroy');
        $(_country).children("option").remove();
        var selectedCityInd = $(_city).get(0).selectedIndex;
        var selectedCityCode = $(_city).find('option:eq(' + selectedCityInd + ')').attr("value");
        var countries = airport2country2resort[selectedCityCode];
        $.each(countries, function(i, val){
            $(_country).append('<option value="' + i + '">' + countriesNames[i] + '</option>');
        });
        iTravel.setResortValues(_city, _country, _resort, airport2country2resort, countriesNames, airportsNames, resortsNames);
        $(_country).change(function(){
            iTravel.setResortValues(_city, _country, _resort, airport2country2resort, countriesNames, airportsNames, resortsNames);
        });
        $(_country).selectmenu({
            style: 'dropdown',
            maxHeight: 200
        });
    },
    
    setResortValues: function(_city, _country, _resort){
        $(_resort).selectmenu('destroy');
        $(_resort).children("option").remove();
        var selectedCityInd = $(_city).get(0).selectedIndex;
        var selectedCityCode = $(_city).find('option:eq(' + selectedCityInd + ')').attr("value");
        var selectedCountryInd = $(_country).get(0).selectedIndex;
        var selectedCountryCode = $(_country).find('option:eq(' + selectedCountryInd + ')').attr("value");
        var resorts = airport2country2resort[selectedCityCode][selectedCountryCode];
        var resortsOpts = iTravel.getResortsOptions(resorts, "0");
        $(_resort).html("");
        $.each(resortsOpts, function(){
            $(_resort).get(0).appendChild(this);
        });
        $(_resort).selectmenu({
            style: 'dropdown',
            maxHeight: 200
        });
    },
    
    getResortsOptions: function(resorts, selectedResort){
        var optsRegion = {}, options1 = [];
        for (var i = 0; i < resorts.length; i++) {
            if (resort2region[resorts[i]]) {
                var regionId = resort2region[resorts[i]];
                optsRegion[regionId] = optsRegion[regionId] || [];
                optsRegion[regionId].push(iTravel.makeOption(resorts[i], resortsNames[resorts[i]], resorts[i] == selectedResort));
            }
            else {
                options1.push(iTravel.makeOption(resorts[i], resortsNames[resorts[i]], resorts[i] == selectedResort));
            }
        }
        
        $.each(optsRegion, function(regionId, regionOpts){
            var optgr = document.createElement("OPTGROUP");
            optgr.label = regionsNames[regionId];
			optgr.appendChild(iTravel.makeOption(regionId, regionsShortNames[regionId], regionId == selectedResort));
            $.each(regionOpts, function(){
                optgr.appendChild(this);
            })
            options1.push(optgr);
        });
        return options1;
    },
    
    makeOption: function(val, text, selected){
        var opt = document.createElement("OPTION");
        opt.value = val;
        if (selected) {
            opt.selected = "selected";
        }
        opt.innerHTML = text;
        return opt;
    },
    
    getMoscowAirports: function(){
        return ["VKO", "DME", "SVO"];
    },
    
    // Advanced search methods
    extTourSearch: {
        setupFromCityValues: function(data){
            var options = [], shiftStr = '&#160;&#160;&#160;';
            $.each(data.airport2country2resortMap, function(i, val){
                options.push(iTravel.makeOption(i, data.airportNamesMap[i], (data.fromCityCode == i)));
//                if (i == "MOW") {
//                    $.each(data.extra2country2resortMap, function(j, exval){
//                        options.push(iTravel.makeOption(j, shiftStr + data.extraAirportsNamesMap[j], (data.fromCityCode == j)));
//                    });
//                }
            });
            
            $(data.citySelectId).unbind("change").selectmenu("destroy").html("");
            $.each(options, function(){
                $(data.citySelectId).get(0).appendChild(this);
            });
            
            data.fromCityCode = "0";
            $(data.citySelectId).selectmenu({
                style: "dropdown"
            });
            $(data.citySelectId).change(function(){
                var valueItem = $(this).next().children(":first");
                valueItem.text(valueItem.text().trim());
                
                iTravel.extTourSearch.setupToCountryValues(data);
                iTravelAdvSearch.updateFlightsInfo();
            });
            iTravel.extTourSearch.setupToCountryValues(data);
        },
        
        getDestCountries: function(data, selectedCityCode){
            return (jQuery.inArray(selectedCityCode, iTravel.getMoscowAirports()) >= 0) ? data.extra2country2resortMap[selectedCityCode] : data.airport2country2resortMap[selectedCityCode];
        },
        
        setupToCountryValues: function(data){
            if (data.countrySelectId != null) {
                var _selectedCityInd = $(data.citySelectId).get(0).selectedIndex;
                var _selectedCityCode = $(data.citySelectId).find('option:eq(' + _selectedCityInd + ')').attr("value");
                var _countries = iTravel.extTourSearch.getDestCountries(data, _selectedCityCode);
                
                var options = [];
                $.each(_countries, function(i, val){
                    options.push(iTravel.makeOption(i, data.countriesNamesMap[i], (data.toCountryCode == i)));
                });
                
                $(data.countrySelectId).unbind("change").selectmenu("destroy").html("");
                $.each(options, function(){
                    $(data.countrySelectId).get(0).appendChild(this);
                });
                
                
                data.toCountryCode = "0";
                $(data.countrySelectId).selectmenu({
                    style: 'dropdown'
                });
                $(data.countrySelectId).change(function(){
                    iTravel.extTourSearch.setupToResortValues(data);
                    iTravelAdvSearch.updateFlightsInfo();
                });
                iTravel.extTourSearch.setupToResortValues(data);
            }
        },
        
        setupToResortValues: function(data){
            var _selectedCityInd = $(data.citySelectId).get(0).selectedIndex;
            var _selectedCityCode = $(data.citySelectId).find('option:eq(' + _selectedCityInd + ')').attr("value");
            var _selectedCountryInd = $(data.countrySelectId).get(0).selectedIndex;
            var _selectedCountryCode = $(data.countrySelectId).find('option:eq(' + _selectedCountryInd + ')').attr("value");
            var _countries = iTravel.extTourSearch.getDestCountries(data, _selectedCityCode);
            
            var _resorts = _countries[_selectedCountryCode];
            var _resortsHtml = iTravel.getResortsOptions(_resorts, data.toResortIdUi);
            
            $(data.resortSelectId).unbind("change").selectmenu("destroy").html("");
            
            $.each(_resortsHtml, function(){
                $(data.resortSelectId).get(0).appendChild(this);
            });
            
            data.toResortIdUi = "0";
            $(data.resortSelectId).selectmenu({
                style: 'dropdown'
            });
            $(data.resortSelectId).change(function(){
                iTravel.extTourSearch.setupToHotelNames(data);
                iTravelAdvSearch.updateFlightsInfo();
            });
            $(data.resortSelectId).change();
            
            iTravel.extTourSearch.setupToHotelNames(data);
        },
        
        setupToAirportValues: function(data){
            var _selectedCityInd = $(data.citySelectId).get(0).selectedIndex;
            var _selectedCityCode = $(data.citySelectId).find('option:eq(' + _selectedCityInd + ')').attr("value");
            var _selectedCountryInd = $(data.countrySelectId).get(0).selectedIndex;
            var _selectedCountryCode = $(data.countrySelectId).find('option:eq(' + _selectedCountryInd + ')').attr("value");
            
            var _airports = [], arr = ["NULL", "0"];
            if (jQuery.inArray(_selectedCityCode, arr) >= 0) {
                _airports = ["0"];
            }
            else 
                if (jQuery.inArray(_selectedCountryCode, arr) >= 0) {
                    var targetAirports = {
                        "0": true
                    };
                    var _countries = iTravel.extTourSearch.getDestCountries(data, _selectedCityCode);
                    $.each(_countries, function(country, val){
                        $.each(data.country2airportMap[country], function(i, airport){
                            targetAirports[airport] = true;
                        });
                    });
                    for (airportCode in data.allAirportNamesMap) {
                        if (targetAirports[airportCode]) 
                            _airports.push(airportCode);
                    }
                }
                else {
                    _airports = data.country2airportMap[_selectedCountryCode];
                }
            
            var options = [];
            for (var i = 0; i < _airports.length; i++) {
                options.push(iTravel.makeOption(_airports[i], data.allAirportNamesMap[_airports[i]], (data.toAirportCode == _airports[i])));
            }
            
            $(data.airportSelectId).unbind("change").selectmenu("destroy").html("");
            
            $.each(options, function(){
                $(data.airportSelectId).get(0).appendChild(this);
            });
            
            $(data.airportSelectId).selectmenu({
                style: 'dropdown'
            });
            $(data.airportSelectId).change(function(){
                iTravelAdvSearch.updateFlightsInfo();
            });
        },
        
        setupToHotelNames: function(data){
            $(data.hotelSelectId).unbind("change").val("");
            $(data.hotelSelectId).change(function(){
                iTravelAdvSearch.updateHotelDetails();
            });
            iTravelAdvSearch.updateHotelDetails();
        }
    },
    
    // Hotel Stars Sliders Params
    hotelSliderParams: {
        range: true,
        step: 1,
        min: 2,
        max: 5,
        values: [2, 5],
        slide: function(event, ui){
            var $stars = $(ui.handle).parent().prev();
            $stars.children("span").removeClass("active");
            for (var i = ui.values[0] - 1; i < ui.values[1]; i++) {
                $stars.children("span:eq(" + i + ")").addClass("active");
            };
                    },
        change: function(event, ui){
            $("#" + this.id + "_value_0").val($(this).slider("values", 0));
            $("#" + this.id + "_value_1").val($(this).slider("values", 1));
            if (typeof(extSearchData) != "undefined" && event.originalEvent != undefined) {
                // Fire change only when changing from the UI
                iTravel.extTourSearch.setupToHotelNames(extSearchData);
            }
        },
        uno_val_fix: true
    },
    
    getAJAXContent: function(source, destination, type, _data, onSuccess, onError){
        var _type = (type) ? type : "GET";
        this.setAJAXContent('<div class="b-ajax-progress"><img alt="" src="/images/ajax.gif" /></div>', destination);
        $.ajax({
            type: _type,
            url: source,
            data: _data,
            cache: false,
            //timeout: 5000, /* in milliseconds */
            dataType: "html",
            success: function(html, textStatus){
                iTravel.setAJAXContent(html, destination);				
                if (onSuccess && jQuery.isFunction(onSuccess)) {
                    onSuccess();
                }
            },
            error: function(XMLHttpRequest, textStatus, errorThrown){
                iTravel.setAJAXContent('<div class="b-ajax-error">' +
                localization.ru.error_text_default +
/*                '<br />' +
                textStatus +
                '<br />' +
                errorThrown +*/
                '</div>', destination);
                if (onError && jQuery.isFunction(onError)) {
                    onError();
                }
            }
        });
    },
    
    setAJAXContent: function(html, destination){
        var _destination = $(destination);
        _destination.empty().append(html.trim());
    },
    
    createAndShowBookingLoadingPopup : function(){
    	$("#j_booking_load").dialog({
            height: 'auto',
            modal: true,
            autoOpen: true,
            autoResize: true,
            width: 400,
            dialogClass: "b-popup-detail",
            position: 'center',
            stack:true,
            close: function(event, ui){
                iTravel.fullPopupDestroy("j_booking_load");
            }
        });
    },
    
    showBookingLoadingPopup : function(){
    	$("div[aria-labelledby='ui-dialog-title-j_tour_detail']").css('z-index','900');
    	this.createAndShowBookingLoadingPopup();
    },
    
    getLocalizedNights: function(i){
        var _label;
        if (i == 1 || (i > 20 && (i % 10 == 1))) {
            _label = localization.ru.nights.single;
        }
        else 
            if ((i > 1 && i < 5) || (i > 20 && ((i % 10 > 1) && (i % 10 < 5)))) {
                _label = localization.ru.nights.multiple2_4;
            }
            else {
                _label = localization.ru.nights.multiplemore_4;
            }
        return _label;
    },
    
    calendarScroll: null,
    mainCalendarService: null,
    mainCalendarToday: null,
    mainCalendar: null,
    mainCalendarForm: null,
    mainCalendarNow: null,
    mainCalendarAllCosts: null,
    mainClendarTds: null,
    mainCalendarState: 0,
    mainCalendarInProgres: false,
    mainCalendarFirstTourId: '',
    
    initMainCalendar: function(calendar, today, form, data){
        var _calendar = $(calendar);
        var _form = $(form);
        this.mainCalendar = _calendar;
        this.mainCalendarForm = _form;
        this.mainCalendarNow = today;
        this.mainCalendarFirstTourId = 'month7';
        var maxDate = new Date(this.mainCalendarNow);
        maxDate.setMonth(today.getMonth() + 6);
        var tmpDate = new Date(this.mainCalendarNow);
        _calendar.html("");
        //Setting dates to nearest Monday
        var tmpDay = (tmpDate.getDay() == 0) ? 6 : tmpDate.getDay() - 1;
        tmpDate.setDate(tmpDate.getDate() - tmpDay);
        
        //Setting dates to nearest Sunday
        var maxDay = (maxDate.getDay() == 0) ? 6 : maxDate.getDay() - 1;
        maxDate.setDate(maxDate.getDate() + (6 - maxDay));
        
        while (tmpDate <= maxDate) {
            iTravel.mainCalendarAddDay(_calendar, tmpDate);
            tmpDate.setDate(tmpDate.getDate() + 1);
        }
        iTravel.mainCalendarSetToday(_calendar, this.mainCalendarNow);
        iTravel.mainCalendarSetBeforeToday(_calendar, this.mainCalendarNow);
        iTravel.mainCalendarSetMonths(_calendar);
        this.mainClendarTds = iTravel.mainCalendar.find("td:not(.before-today)");
        iTravel.mainCalendarShowInfo();
    },
    
    lastCalendarPostData: null,
    mainCalendarGetData: function(data){
        var currentPostData = jQuery.param(data);
        if (iTravel.lastCalendarPostData == null || iTravel.lastCalendarPostData != currentPostData) {
            iTravel.lastCalendarPostData = currentPostData;
            $("#calendar_loaded").hide();
            $("#calendar_loading").show();
            jQuery.post("/GetListOfAllCosts.action", data, function(){
                iTravel.mainCalendarAllCosts = listAllCostsJs;
                $("#b_tab2_dep_date").change(function(){
                    iTravel.mainCalendarAnalyzeStates();
                });
                $("#b_tab2_nights").change(function(){
                    iTravel.mainCalendarAnalyzeStates();
                });
                $("#b_tab2_dep_var").change(function(){
                    iTravel.mainCalendarAnalyzeStates();
                });
                $("#b_tab2_nights_var").change(function(){
                    iTravel.mainCalendarAnalyzeStates();
                });
                iTravel.mainCalendarAnalyzeStates();
                
                //Init Events
                
                //Reset Calendar link
                $("#j_tab2_calendar_form .reset").click(function(){
                    $("#b_tab2_dep_date").val("").example("дд.мм.гггг");
                    $("#b_tab2_nights").val("7").selectmenu('destroy').selectmenu({
                        style: 'dropdown'
                    });
                    $("#b_tab2_dep_var").val("0").selectmenu('destroy').selectmenu({
                        style: 'dropdown'
                    });
                    $("#b_tab2_nights_var").val("3").selectmenu('destroy').selectmenu({
                        style: 'dropdown'
                    }).change();
                    return false;
                });
                
                //Auto find offer
                $("#j_tab2_calendar_form .auto").click(function(){
                    var _price;
                    
                    var regexDate = /[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{4}/;
                    var todayPlus7 = new Date();
                    todayPlus7.setDate(todayPlus7.getDate() + 7);
                    var _departure = (regexDate.test($("#b_tab2_dep_date").val())) ? iTravel.mainCalendarRaw2Id($("#b_tab2_dep_date").val()) : iTravel.mainCalendarDate2Id(todayPlus7);
                    
                    var _departureVar = $("#b_tab2_dep_var").val();
                    var _nights = iTravel.mainCalendarRaw2Id($("#b_tab2_nights").val());
                    var _nightsVar = $("#b_tab2_nights_var").val();
                    
                    var minDepartureDate = new Date(iTravel.mainCalendarId2Date(_departure));
                    minDepartureDate.setDate(minDepartureDate.getDate() - parseInt(_departureVar));
                    
                    var maxDepartureDate = new Date(iTravel.mainCalendarId2Date(_departure));
                    maxDepartureDate.setDate(maxDepartureDate.getDate() + parseInt(_departureVar));
                    
                    var minNights = parseInt(_nights) - parseInt(_nightsVar);
                    var maxNights = parseInt(_nights) + parseInt(_nightsVar);
                    
                    try {
                        maxNights = maxNights + 1;
                        _price = iTravel.mainCalendarFindOffers(minDepartureDate, maxDepartureDate, minNights, maxNights);
                        if (_price) {
                            iTravel.mainCalendarSetFoundVal(_price);
                            return;
                        }
                        minNights = minNights - 1;
                        _price = iTravel.mainCalendarFindOffers(minDepartureDate, maxDepartureDate, minNights, maxNights);
                        if (_price) {
                            iTravel.mainCalendarSetFoundVal(_price);
                            return;
                        }
                        maxNights = maxNights + 1;
                        _price = iTravel.mainCalendarFindOffers(minDepartureDate, maxDepartureDate, minNights, maxNights);
                        if (_price) {
                            iTravel.mainCalendarSetFoundVal(_price);
                            return;
                        }
                        minNights = minNights - 1;
                        _price = iTravel.mainCalendarFindOffers(minDepartureDate, maxDepartureDate, minNights, maxNights);
                        if (_price) {
                            iTravel.mainCalendarSetFoundVal(_price);
                            return;
                        }
                        maxNights = maxNights + 1;
                        _price = iTravel.mainCalendarFindOffers(minDepartureDate, maxDepartureDate, minNights, maxNights);
                        if (_price) {
                            iTravel.mainCalendarSetFoundVal(_price);
                            return;
                        }
                        minNights = minNights - 1;
                        _price = iTravel.mainCalendarFindOffers(minDepartureDate, maxDepartureDate, minNights, maxNights);
                        if (_price) {
                            iTravel.mainCalendarSetFoundVal(_price);
                            return;
                        }
                        
                        maxDepartureDate.setDate(maxDepartureDate.getDate() + 1);
                        _price = iTravel.mainCalendarFindOffers(minDepartureDate, maxDepartureDate, minNights, maxNights);
                        if (_price) {
                            iTravel.mainCalendarSetFoundVal(_price);
                            return;
                        }
                        
                        minDepartureDate.setDate(minDepartureDate.getDate() - 1);
                        _price = iTravel.mainCalendarFindOffers(minDepartureDate, maxDepartureDate, minNights, maxNights);
                        if (_price) {
                            iTravel.mainCalendarSetFoundVal(_price);
                            return;
                        }
                        maxDepartureDate.setDate(maxDepartureDate.getDate() + 1);
                        _price = iTravel.mainCalendarFindOffers(minDepartureDate, maxDepartureDate, minNights, maxNights);
                        if (_price) {
                            iTravel.mainCalendarSetFoundVal(_price);
                            return;
                        }
                        
                        minDepartureDate.setDate(minDepartureDate.getDate() - 1);
                        _price = iTravel.mainCalendarFindOffers(minDepartureDate, maxDepartureDate, minNights, maxNights);
                        if (_price) {
                            iTravel.mainCalendarSetFoundVal(_price);
                            return;
                        }
                        maxDepartureDate.setDate(maxDepartureDate.getDate() + 1);
                        _price = iTravel.mainCalendarFindOffers(minDepartureDate, maxDepartureDate, minNights, maxNights);
                        if (_price) {
                            iTravel.mainCalendarSetFoundVal(_price);
                            return;
                        }
                        
                        minDepartureDate.setDate(minDepartureDate.getDate() - 1);
                        _price = iTravel.mainCalendarFindOffers(minDepartureDate, maxDepartureDate, minNights, maxNights);
                        if (_price) {
                            iTravel.mainCalendarSetFoundVal(_price);
                            return;
                        }
                        if (!_price) {
                            iTravel.mainCalendarShowNotFound();
                        }
                        
                    } 
                    catch (err) {
                    
                    }
                    return false;
                });
                
                iTravel.mainClendarTds.click(function(){
                    if (iTravel.mainCalendarInProgres) 
                        return false;
                    if (iTravel.mainCalendarState == 0) {
                        iTravel.mainCalendarInProgres = true;
                        var _date = iTravel.mainCalendarId2Raw($(this).attr("id"));
                        $("#b_tab2_dep_date").removeClass("example").val(_date).change();
                        iTravel.mainCalendarInProgres = false;
                        return false;
                    }
                    if (iTravel.mainCalendarState == 1) {
                        iTravel.mainCalendarInProgres = true;
                        var _date = iTravel.mainCalendarId2Raw($(this).attr("id"));
                        $("#b_tab2_dep_date").removeClass("example").val(_date).change();
                        iTravel.mainCalendarInProgres = false;
                        return false;
                    }
                    if (iTravel.mainCalendarState == 2) {
                        iTravel.mainCalendarInProgres = true;
                        var $td = $(this);
                        if ($td.hasClass("hoverable")) {
                            var _departure = iTravel.mainCalendarRaw2Id($("#b_tab2_dep_date").val());
                            var departureDate = iTravel.mainCalendarId2Date(_departure);
                            var arrivalDate = iTravel.mainCalendarId2Date(this.id);
                            var deltaDate = iTravel.days_between(departureDate, arrivalDate);
                            $("#b_tab2_nights option:selected").removeAttr("selected");
                            $("#b_tab2_nights option[value='" + deltaDate + "']").attr("selected", "selected");
                            $("#b_tab2_nights_var option").removeAttr("selected");
                            $("#b_tab2_nights_var option[value='0']").attr("selected", "selected");
                            $("#b_tab2_nights").selectmenu('destroy').selectmenu({
                                style: 'dropdown'
                            });
                            $("#b_tab2_nights_var").selectmenu('destroy').selectmenu({
                                style: 'dropdown'
                            });
                            $("#b_tab2_nights_var").change();
                            
                        }
                        else {
                            var _date = iTravel.mainCalendarId2Raw($(this).attr("id"));
                            $("#b_tab2_dep_date").removeClass("example").val(_date).change();
                        }
                        iTravel.mainCalendarInProgres = false;
                        return false;
                    }
                    if (iTravel.mainCalendarState == 3) {
                        iTravel.mainCalendarInProgres = true;
                        var $td = $(this);
                        $("#b_tab2_dep_var option").removeAttr("selected");
                        $("#b_tab2_dep_var option[value='0']").attr("selected", "selected");
                        $("#b_tab2_dep_var").selectmenu('destroy').selectmenu({
                            style: 'dropdown'
                        });
                        var _date = iTravel.mainCalendarId2Raw($(this).attr("id"));
                        $("#b_tab2_dep_date").removeClass("example").val(_date).change();
                        iTravel.mainCalendarInProgres = false;
                        return false;
                    }
                    if (iTravel.mainCalendarState == 4) {
                        iTravel.mainCalendarInProgres = true;
                        var $td = $(this);
                        $("#b_tab2_dep_var option").removeAttr("selected");
                        $("#b_tab2_dep_var option[value='0']").attr("selected", "selected");
                        $("#b_tab2_dep_var").selectmenu('destroy').selectmenu({
                            style: 'dropdown'
                        });
                        var _date = iTravel.mainCalendarId2Raw($(this).attr("id"));
                        $("#b_tab2_dep_date").removeClass("example").val(_date).change();
                        iTravel.mainCalendarInProgres = false;
                        return false;
                    }
                });
                
                iTravel.mainClendarTds.mouseover(function(){
                    if (iTravel.mainCalendarState == 2) {
                        var $td = $(this);
                        if ($td.hasClass("hoverable")) {
                            $td.mainCalendarSetLabel(localization.ru.arrival);
                            //Coloring days
                            var _departure = iTravel.mainCalendarRaw2Id($("#b_tab2_dep_date").val());
                            var departureDate = iTravel.mainCalendarId2Date(_departure);
                            var arrivalDate = iTravel.mainCalendarId2Date(this.id);
                            while (departureDate.valueOf() <= arrivalDate.valueOf()) {
                                $("#" + iTravel.mainCalendarDate2Id(departureDate)).mainCalendarRemoveSalad().mainCalendarSetGreen();
                                departureDate.setDate(departureDate.getDate() + 1);
                            }
                        }
                    }
                    if (iTravel.mainCalendarState == 3) {
                        var $td = $(this);
                        if ($td.hasClass("hoverable")) {
                            $td.mainCalendarSetLabel(localization.ru.departure);
                            //Coloring days
                            var departureDate = iTravel.mainCalendarId2Date(this.id);
                            var _nightsRange = iTravel.mainCalendarGetNightsRange($("#b_tab2_nights").val(), $("#b_tab2_nights_var").val());
                            var arrivalDate = new Date(departureDate);
                            var nights = $("#b_tab2_nights").val();
                            arrivalDate.setDate(arrivalDate.getDate() + parseInt(nights));
                            
                            $("#" + iTravel.mainCalendarDate2Id(arrivalDate)).mainCalendarSetLabel(localization.ru.arrival);
                            $("#" + iTravel.mainCalendarDate2Id(arrivalDate)).mainCalendarSetPrice(nights + " " + iTravel.getLocalizedNights(nights));
                            
                            while (departureDate.valueOf() <= arrivalDate.valueOf()) {
                                $("#" + iTravel.mainCalendarDate2Id(departureDate)).mainCalendarRemoveSalad().mainCalendarSetGreen();
                                departureDate.setDate(departureDate.getDate() + 1);
                            }
                        }
                    }
                    if (iTravel.mainCalendarState == 4) {
                        var $td = $(this);
                        if ($td.hasClass("hoverable")) {
                            $td.mainCalendarSetLabel(localization.ru.departure);
                            var _id = this.id;
                            var _nightsRange = iTravel.mainCalendarGetNightsRange($("#b_tab2_nights").val(), $("#b_tab2_nights_var").val());
                            jQuery.each(iTravel.mainCalendarAllCosts[_id], function(i, val){
                                if (jQuery.inArray(i, _nightsRange) > -1) {
                                    var _date = iTravel.mainCalendarId2Date(_id);
                                    _date.setDate(_date.getDate() + parseInt(i));
                                    $("#" + iTravel.mainCalendarDate2Id(_date)).mainCalendarSetPrice(i + " " + iTravel.getLocalizedNights(i));
                                }
                            });
                        }
                    }
                });
                
                iTravel.mainClendarTds.mouseout(function(){
                    if (iTravel.mainCalendarState == 2) {
                        var $td = $(this);
                        if ($td.hasClass("hoverable")) {
                            $td.mainCalendarSetLabel("");
                            //Coloring days
                            var _departure = iTravel.mainCalendarRaw2Id($("#b_tab2_dep_date").val());
                            var departureDate = iTravel.mainCalendarId2Date(_departure);
                            var arrivalDate = iTravel.mainCalendarId2Date(this.id);
                            while (departureDate.valueOf() <= arrivalDate.valueOf()) {
                                $("#" + iTravel.mainCalendarDate2Id(departureDate)).mainCalendarRemoveGreen().mainCalendarSetSalad();
                                departureDate.setDate(departureDate.getDate() + 1);
                            }
                        }
                    }
                    if (iTravel.mainCalendarState == 3) {
                        var $td = $(this);
                        if ($td.hasClass("hoverable")) {
                            $td.mainCalendarSetLabel("");
                            //Coloring days
                            var departureDate = iTravel.mainCalendarId2Date(this.id);
                            var arrivalDate = new Date(departureDate);
                            var nights = $("#b_tab2_nights").val();
                            var _nightsRange = iTravel.mainCalendarGetNightsRange($("#b_tab2_nights").val(), $("#b_tab2_nights_var").val());
                            arrivalDate.setDate(arrivalDate.getDate() + parseInt($("#b_tab2_nights").val()));
                            $("#" + iTravel.mainCalendarDate2Id(arrivalDate)).mainCalendarSetPrice("", "");
                            $("#" + iTravel.mainCalendarDate2Id(arrivalDate)).mainCalendarSetLabel("");
                            iTravel.mainCalendarSetToday(iTravel.mainCalendar, iTravel.mainCalendarNow);
                            while (departureDate.valueOf() <= arrivalDate.valueOf()) {
                                $("#" + iTravel.mainCalendarDate2Id(departureDate)).mainCalendarRemoveGreen().mainCalendarSetSalad();
                                departureDate.setDate(departureDate.getDate() + 1);
                            }
                        }
                    }
                    if (iTravel.mainCalendarState == 4) {
                        var $td = $(this);
                        if ($td.hasClass("hoverable")) {
                            $td.mainCalendarSetLabel("");
                            iTravel.mainCalendarSetToday(iTravel.mainCalendar, iTravel.mainCalendarNow);
                            var _id = this.id;
                            var _nightsRange = iTravel.mainCalendarGetNightsRange($("#b_tab2_nights").val(), $("#b_tab2_nights_var").val());
                            jQuery.each(iTravel.mainCalendarAllCosts[_id], function(i, val){
                                if (jQuery.inArray(i, _nightsRange) > -1) {
                                    var _date = iTravel.mainCalendarId2Date(_id);
                                    _date.setDate(_date.getDate() + parseInt(i));
                                    $("#" + iTravel.mainCalendarDate2Id(_date)).mainCalendarSetPrice("");
                                }
                            });
                        }
                    }
                });
                setTimeout(function(){
                    $("#calendar_loading").hide();
                    $("#calendar_loaded").show();
                    $("#j_calendar").scrollTo($('#j_calendar td.available:first'),0);
                }, 100);
            }, "script");
        } else 
        	setTimeout(function(){
                $("#j_calendar").scrollTo($('#j_calendar td.available:first'),0);
            }, 100);
        
    },
    
    mainCalendarSetFoundVal: function(_price){
        $("#b_tab2_dep_date").val(iTravel.mainCalendarId2Raw(_price.day)).removeClass("example");
        $("#b_tab2_nights").val(_price.minPriceFor).selectmenu('destroy').selectmenu({
            style: 'dropdown'
        });
        $("#b_tab2_dep_var").val("0").selectmenu('destroy').selectmenu({
            style: 'dropdown'
        });
        $("#b_tab2_nights_var").val("0").selectmenu('destroy').selectmenu({
            style: 'dropdown'
        }).change();
    },
    
    mainCalendarFindOffers: function(minDepartureDate, maxDepartureDate, minNights, maxNights){
        var _nightsRange = iTravel.mainCalendarGetNightsRangeBy2Dates(minNights, maxNights);
        var _departureRange = iTravel.mainCalendarGetDatesRangeBy2Dates(new Date(minDepartureDate), new Date(maxDepartureDate));
        
        var _hasProposals = false;
        var ret = {};
        //Setting prices and availability
        jQuery.each(iTravel.mainCalendarAllCosts, function(i, val1){
            var minPrice = 10000000;
            var day = "";
            var minPriceFor = 0;
            jQuery.each(val1, function(j, val2){
                if (jQuery.inArray(j, _nightsRange) > -1) {
                    if (parseInt(val2) < minPrice) {
                        minPrice = parseInt(val2);
                        minPriceFor = j;
                        day = i;
                    }
                }
            });
            if (jQuery.inArray(i, _departureRange) > -1 && minPrice != 10000000) {
                _hasProposals = true;
                ret = {
                    day: day,
                    minPriceFor: minPriceFor
                };
            };
                    });
        
        if (!_hasProposals) {
            return false;
        }
        else {
            return ret;
        }
    },
    
    mainCalendarAnalyzeStates: function(){
        //Determining if state 0
        if ($("#b_tab2_dep_date").val() == "" || $("#b_tab2_dep_date").hasClass("example")) {
            iTravel.mainCalendarState = 0;
            iTravel.mainCalendarParseState0();
            return false;
        }
        //Determining if state 1
        if (($("#b_tab2_dep_var").val() == 0) && ($("#b_tab2_nights_var").val() == 0)) {
            iTravel.mainCalendarState = 1;
            iTravel.mainCalendarParseState1();
            return false;
        }
        //Determining if state 2
        if (($("#b_tab2_dep_var").val() == 0) && ($("#b_tab2_nights_var").val() != 0)) {
            iTravel.mainCalendarState = 2;
            iTravel.mainCalendarParseState2();
            return false;
        }
        //Determining if state 3
        if (($("#b_tab2_dep_var").val() != 0) && ($("#b_tab2_nights_var").val() == 0)) {
            iTravel.mainCalendarState = 3;
            iTravel.mainCalendarParseState3();
            return false;
        }
        //Determining if state 4
        if (($("#b_tab2_dep_var").val() != 0) && ($("#b_tab2_nights_var").val() != 0)) {
            iTravel.mainCalendarState = 4;
            iTravel.mainCalendarParseState4();
            return false;
        }
    },
    
    // No departure date defined
    mainCalendarParseState0: function(){
        //Clearing calendar
        iTravel.mainCalendarClear();
        var _nightsRange = iTravel.mainCalendarGetNightsRange($("#b_tab2_nights").val(), $("#b_tab2_nights_var").val());
        var _hasProposals = false;
        
        //Setting prices and availability
        jQuery.each(iTravel.mainCalendarAllCosts, function(i, val1){
            var minPrice = 10000000, minPriceFor = 0;
            jQuery.each(val1, function(j, val2){
                if (jQuery.inArray(j, _nightsRange) > -1) {
                    if (parseInt(val2) < minPrice) {
                        minPrice = parseInt(val2);
                        minPriceFor = j;
                    }
                    $("#" + i).mainCalendarSetAvailable();
                }
            });
            if (minPrice != 10000000) {
                $("#" + i).mainCalendarSetHoverable().mainCalendarSetPrice(iTravel.getTextAccordingToCurrency(minPrice, "555555_10_0"), localization.ru.priceFor.replace("XX", minPriceFor));
                _hasProposals = true;
            }
        });
        
        // Parsing no proposals
        if (!_hasProposals) {
            iTravel.mainCalendarShowWarning();
        }
        setTimeout(function(){
            $("#j_calendar").scrollTo($('#j_calendar td.available:first'),0);
        }, 100);
    },
    
    // Departure date defined, Nights defined
    mainCalendarParseState1: function(){
        //Clearing calendar
        iTravel.mainCalendarClear();
        var _nightsRange = iTravel.mainCalendarGetNightsRange($("#b_tab2_nights").val(), $("#b_tab2_nights_var").val());
        
        //Setting availability
        jQuery.each(iTravel.mainCalendarAllCosts, function(i, val1){
            jQuery.each(val1, function(j, val2){
                if (jQuery.inArray(j, _nightsRange) > -1) {
                    $("#" + i).mainCalendarSetAvailable();
                }
            });
        });
        
        var _departure = iTravel.mainCalendarRaw2Id($("#b_tab2_dep_date").val());
        var _arrival;
        var _nights = $("#b_tab2_nights").val();
        var _price;
        try {
            _price = iTravel.mainCalendarAllCosts[_departure][_nights];
            if (_price) {
                var departureDate = iTravel.mainCalendarId2Date(_departure);
                var arrivalDate = new Date(departureDate);
                arrivalDate.setDate(departureDate.getDate() + parseInt(_nights));
                var _arrival = iTravel.mainCalendarDate2Id(arrivalDate);
                $("#" + _departure).mainCalendarSetPrice(iTravel.getTextAccordingToCurrency(_price, "555555_10_0"), localization.ru.priceFor.replace("XX", _nights));
                $("#" + _departure).mainCalendarSetLabel(localization.ru.departure);
                $("#" + _arrival).mainCalendarSetPrice(_nights + " " + iTravel.getLocalizedNights(_nights)).mainCalendarSetLabel(localization.ru.arrival);
                for (var j = 0; j <= parseInt(_nights); j++) { //Coloring days green
                    var _date = iTravel.mainCalendarDate2Id(departureDate);
                    $("#" + _date).mainCalendarSetGreen();
                    departureDate.setDate(departureDate.getDate() + 1);
                }
            }
            else {
                iTravel.mainCalendarShowWarning();
            }
        } 
        catch (err) {
            iTravel.mainCalendarShowWarning();
        }
        
        //Init events
        // Drag and Drop disabled in IE6 and IE7
        if (!(jQuery.browser.msie && (jQuery.browser.version.substr(0, 1) == 6 || jQuery.browser.version.substr(0, 1) == 7))) {
            $("#label-" + _departure).wrapInner('<div id="#label-departure-' + _departure + '"></div>');
            $("#label-" + _departure).children("div").draggable({
                revert: true
            });
            $("#label-" + _arrival).wrapInner('<div id="#label-arrival-' + _arrival + '"></div>');
            $("#label-" + _arrival).children("div").draggable({
                revert: true
            });
            iTravel.mainClendarTds.droppable({
                drop: function(event, ui){
                    if (ui.draggable[0].id.indexOf("departure") > -1) {
                        var _date = iTravel.mainCalendarId2Raw($(this).attr("id"));
                        $("#b_tab2_dep_date").removeClass("example").val(_date).change();
                    }
                    if (ui.draggable[0].id.indexOf("arrival") > -1) {
                        var departureDate = iTravel.mainCalendarId2Date(_departure);
                        var arrivalDate = iTravel.mainCalendarId2Date(this.id);
                        var ONE_DAY = 1000 * 60 * 60 * 24;
                        if ((arrivalDate - departureDate) < 2 * ONE_DAY || (arrivalDate - departureDate) > 22 * ONE_DAY) {
                            //iTravel.mainCalendarShowWarning(); //Disabled by request
                        }
                        else {
                            var deltaDate = iTravel.days_between(departureDate, arrivalDate);
                            $("#b_tab2_nights option:selected").removeAttr("selected");
                            $("#b_tab2_nights option[value='" + deltaDate + "']").attr("selected", "selected");
                            $("#b_tab2_nights").selectmenu('destroy').selectmenu({
                                style: 'dropdown'
                            }).change();
                        }
                    }
                }
            });
        }
        setTimeout(function(){
            $("#j_calendar").scrollTo($('#j_calendar td.available:first'),0);
        }, 100);
    },
    
    mainCalendarParseState2: function(){
        //Clearing calendar
        iTravel.mainCalendarClear();
        var _nightsRange = iTravel.mainCalendarGetNightsRange($("#b_tab2_nights").val(), $("#b_tab2_nights_var").val());
        
        //Setting availability
        jQuery.each(iTravel.mainCalendarAllCosts, function(i, val1){
            jQuery.each(val1, function(j, val2){
                if (jQuery.inArray(j, _nightsRange) > -1) {
                    $("#" + i).mainCalendarSetAvailable();
                }
            });
        });
        
        var _departure = iTravel.mainCalendarRaw2Id($("#b_tab2_dep_date").val());
        var _nights = $("#b_tab2_nights").val();
        var _nightsVar = $("#b_tab2_nights_var").val();
        
        try {
            var maxArrival = 0;
            var minPrice = 10000000;
            var minPriceFor = 0;
            jQuery.each(iTravel.mainCalendarAllCosts[_departure], function(i, val){
                if (jQuery.inArray(i, _nightsRange) > -1) {
                    var departureDate = iTravel.mainCalendarId2Date(_departure);
                    var arrivalDate = new Date(departureDate);
                    arrivalDate.setDate(departureDate.getDate() + parseInt(i));
                    var _arrival = iTravel.mainCalendarDate2Id(arrivalDate);
                    $("#" + _arrival).mainCalendarSetPrice(i + " " + iTravel.getLocalizedNights(i)).mainCalendarSetHoverable();
                    maxArrival = (maxArrival < parseInt(i)) ? parseInt(i) : maxArrival;
                    if (minPrice > val) {
                        minPrice = val;
                        minPriceFor = i;
                    }
                }
            });
            if (maxArrival != 0) {
                $("#" + _departure).mainCalendarSetPrice(iTravel.getTextAccordingToCurrency(minPrice, "555555_10_0"), localization.ru.priceFor.replace("XX", minPriceFor));
                $("#" + _departure).mainCalendarSetLabel(localization.ru.departure);
                var departureDate = iTravel.mainCalendarId2Date(_departure);
                for (var j = 0; j <= maxArrival; j++) { //Coloring days salad
                    var _dateId = iTravel.mainCalendarDate2Id(departureDate);
                    $("#" + _dateId).mainCalendarSetSalad();
                    departureDate.setDate(departureDate.getDate() + 1);
                }
            }
            else {
                iTravel.mainCalendarShowWarning();
            }
        } 
        catch (err) {
            iTravel.mainCalendarShowWarning();
        }
        
        //Init events
        // Drag and Drop disabled in IE6 and IE7
        if (!(jQuery.browser.msie && (jQuery.browser.version.substr(0, 1) == 6 || jQuery.browser.version.substr(0, 1) == 7))) {
            $("#label-" + _departure).wrapInner('<div id="#label-departure-' + _departure + '"></div>');
            $("#label-" + _departure).children("div").draggable({
                revert: true
            });
            iTravel.mainClendarTds.droppable({
                drop: function(event, ui){
                    if (ui.draggable[0].id.indexOf("departure") > -1) {
                        var _date = iTravel.mainCalendarId2Raw($(this).attr("id"));
                        $("#b_tab2_dep_date").removeClass("example").val(_date).change();
                    }
                }
            });
        }
    },
    
    mainCalendarParseState3: function(){
        //Clearing calendar
        iTravel.mainCalendarClear();
        var _nightsRange = iTravel.mainCalendarGetNightsRange($("#b_tab2_nights").val(), $("#b_tab2_nights_var").val());
        var _departureRange = iTravel.mainCalendarGetDatesRange($("#b_tab2_dep_date").val(), $("#b_tab2_dep_var").val());
        var _hasProposals = false;
        
        //Setting prices and availability
        jQuery.each(iTravel.mainCalendarAllCosts, function(i, val1){
            var minPrice = 10000000;
            var minPriceFor = 0;
            jQuery.each(val1, function(j, val2){
                if (jQuery.inArray(j, _nightsRange) > -1) {
                    if (parseInt(val2) < minPrice) {
                        minPrice = parseInt(val2);
                        minPriceFor = j;
                    }
                    $("#" + i).mainCalendarSetAvailable();
                }
            });
            if (jQuery.inArray(i, _departureRange) > -1 && minPrice != 10000000) {
                $("#" + i).mainCalendarSetHoverable().mainCalendarSetPrice(iTravel.getTextAccordingToCurrency(minPrice, "555555_10_0"), localization.ru.priceFor.replace("XX", minPriceFor));
                _hasProposals = true;
            }
        });
        
        if (!_hasProposals) {
            iTravel.mainCalendarShowWarning();
        }
        else {
            //Coloring period
            var _departureMinDate = iTravel.mainCalendarId2Date(iTravel.mainCalendarRaw2Id($("#b_tab2_dep_date").val()));
            var _departureMaxDate = new Date(_departureMinDate);
            _departureMinDate.setDate(_departureMinDate.getDate() - parseInt($("#b_tab2_dep_var").val()));
            _departureMaxDate.setDate(_departureMaxDate.getDate() + parseInt($("#b_tab2_dep_var").val()) + parseInt($("#b_tab2_nights").val()));
            while (_departureMinDate.valueOf() <= _departureMaxDate.valueOf()) {
                $("#" + iTravel.mainCalendarDate2Id(_departureMinDate)).mainCalendarSetSalad();
                _departureMinDate.setDate(_departureMinDate.getDate() + 1);
            }
        }
        setTimeout(function(){
            $("#j_calendar").scrollTo($('#j_calendar td.available:first'),0);
        }, 100);
    },
    
    mainCalendarParseState4: function(){
        //Clearing calendar
        iTravel.mainCalendarClear();
        var _nightsRange = iTravel.mainCalendarGetNightsRange($("#b_tab2_nights").val(), $("#b_tab2_nights_var").val());
        var _departureRange = iTravel.mainCalendarGetDatesRange($("#b_tab2_dep_date").val(), $("#b_tab2_dep_var").val());
        var _hasProposals = false;
        
        //Setting prices and availability
        jQuery.each(iTravel.mainCalendarAllCosts, function(i, val1){
            var minPrice = 10000000;
            var minPriceFor = 0;
            jQuery.each(val1, function(j, val2){
                if (jQuery.inArray(j, _nightsRange) > -1) {
                    if (parseInt(val2) < minPrice) {
                        minPrice = parseInt(val2);
                        minPriceFor = j;
                    }
                    $("#" + i).mainCalendarSetAvailable();
                }
            });
            if (jQuery.inArray(i, _departureRange) > -1 && minPrice != 10000000) {
                $("#" + i).mainCalendarSetHoverable().mainCalendarSetPrice(iTravel.getTextAccordingToCurrency(minPrice, "555555_10_0"), localization.ru.priceFor.replace("XX", minPriceFor));
                _hasProposals = true;
            };
                    });
        if (!_hasProposals) {
            iTravel.mainCalendarShowWarning();
        }
        else {
            //Coloring period
            var _departureMinDate = iTravel.mainCalendarId2Date(iTravel.mainCalendarRaw2Id($("#b_tab2_dep_date").val()));
            var _departureMaxDate = new Date(_departureMinDate);
            _departureMinDate.setDate(_departureMinDate.getDate() - parseInt($("#b_tab2_dep_var").val()));
            _departureMaxDate.setDate(_departureMaxDate.getDate() + parseInt($("#b_tab2_dep_var").val()) + parseInt($("#b_tab2_nights").val()) + parseInt($("#b_tab2_nights_var").val()));
            while (_departureMinDate.valueOf() <= _departureMaxDate.valueOf()) {
                $("#" + iTravel.mainCalendarDate2Id(_departureMinDate)).mainCalendarSetSalad();
                _departureMinDate.setDate(_departureMinDate.getDate() + 1);
            }
        }
        setTimeout(function(){
            $("#j_calendar").scrollTo($('#j_calendar td.available:first'),0);
        }, 100);
    },
    
    mainCalendarClear: function(){
        var _tds = iTravel.mainClendarTds;
        iTravel.mainCalendarShowInfo();
        _tds.each(function(){//Cleaning table
            var $td = $(this);
            $td.mainCalendarRemoveAvailable();
            $td.mainCalendarRemoveHoverable();
            $td.mainCalendarSetLabel("");
            $td.mainCalendarRemoveGreen();
            $td.mainCalendarRemoveSalad();
            $td.mainCalendarSetPrice("", "");
            if (!(jQuery.browser.msie && (jQuery.browser.version.substr(0, 1) == 6 || jQuery.browser.version.substr(0, 1) == 7))) {
                $td.droppable("destroy");
            }
        });
        iTravel.mainCalendarSetToday(iTravel.mainCalendar, iTravel.mainCalendarNow);
    },
    
    mainCalendarGetNightsRange: function(val1, val2){
        var _val1 = parseInt(val1);
        var _val2 = parseInt(val2);
        var values = [];
        for (var i = (_val1 - _val2); i <= (_val1 + _val2); i++) {
            values.push(i.toString());
        }
        return values;
    },
    
    mainCalendarGetDatesRange: function(val1, val2){
        var _date1 = iTravel.mainCalendarId2Date(iTravel.mainCalendarRaw2Id(val1));
        var _grade = parseInt(val2);
        var values = [];
        for (var i = -(_grade); i <= _grade; i++) {
            var _tmpDate = new Date(_date1);
            _tmpDate.setDate(_date1.getDate() + i);
            values.push(iTravel.mainCalendarDate2Id(_tmpDate));
        }
        return values;
    },
    
    mainCalendarGetNightsRangeBy2Dates: function(val1, val2){
        var _val1 = parseInt(val1);
        var _val2 = parseInt(val2);
        var values = [];
        for (var i = _val1; i <= _val2; i++) {
            values.push(i.toString());
        }
        return values;
    },
    
    mainCalendarGetDatesRangeBy2Dates: function(val1, val2){
        var _date1 = val1;
        var _date2 = val2;
        var values = [];
        while (_date1 <= _date2) {
            values.push(iTravel.mainCalendarDate2Id(_date1));
            _date1.setDate(_date1.getDate() + 1);
        }
        return values;
    },
    
    mainCalendarRaw2Id: function(_string){
        return _string.substring(6, 10) + _string.substring(3, 5) + _string.substring(0, 2);
    },
    mainCalendarId2Raw: function(_string){
        return _string.substring(6, 8) + "." + _string.substring(4, 6) + "." + _string.substring(0, 4);
    },
    mainCalendarDate2Id: function(_date){
        var date = _date.getDate();
        var month = _date.getMonth() + 1;
        var year = _date.getFullYear();
        if (date < 10) 
            date = "0" + date;
        if (month < 10) 
            month = "0" + month;
        return year.toString() + month.toString() + date.toString();
    },
    mainCalendarId2Date: function(_id){
        var date = _id.substring(6, 8);
        var month = parseInt((_id.substring(4, 5) == "0") ? _id.substring(5, 6) : _id.substring(4, 6)) - 1;
        var year = _id.substring(0, 4);
        return new Date(year, month, date);
    },
    mainCalendarSetMonths: function(_calendar){
        var trs = $(_calendar).find("tr");
        var totalTr = trs.length;
        $(_calendar).find("td").each(function(){
            var cellid = this.id;
            if (cellid.substr(6) == "01") {
                var month = cellid.substr(4, 2);
                month = parseInt((month.substr(0, 1) == 0) ? month.substr(1, 1) : month) - 1;
                var date = new Date(cellid.substr(0, 4), month, cellid.substr(6, 2));
                var day = (date.getDay() == 0) ? 6 : date.getDay() - 1;
				//var tr = (day <= 3) ? $(this).parent() : $(this).parent().next();
                var tr = (day == 0) ? $(this).parent() : $(this).parent().next();
				//Writing stair
				if (day!=0) {					
					var _tmpDate1 = new Date(date);
					var _tmpDate2 = new Date(date); _tmpDate2.setDate(_tmpDate2.getDate()+7);
					$("#"+iTravel.mainCalendarDate2Id(_tmpDate1)).addClass("b-stair-up-first");
					$("#"+iTravel.mainCalendarDate2Id(_tmpDate2)).addClass("b-stair-none");
					for (var i=(day+1);i<7;i++) {						
						_tmpDate1.setDate(_tmpDate1.getDate()+1);
						_tmpDate2.setDate(_tmpDate2.getDate()+1);
						$("#"+iTravel.mainCalendarDate2Id(_tmpDate1)).addClass("b-stair-up");
						$("#"+iTravel.mainCalendarDate2Id(_tmpDate2)).addClass("b-stair-none");						
					}
				}
                tr.addClass("month-start");
                tr.attr("id", "month" + month);
            };
         });
        
        $(_calendar).find('tr:first').addClass("month-start");
        $(_calendar).find('tr:first:not([id])').each(function(){
            //Verifying that first month has label
            var tr = $(this);
            var cellid = tr.children("td:first").attr("id");
            var month = cellid.substr(4, 2);
            month = parseInt((month.substr(0, 1) == 0) ? month.substr(1, 1) : month) - 1;
            var date = new Date(cellid.substr(0, 4), month, cellid.substr(6, 2));
            var day = (date.getDay() == 0) ? 6 : date.getDay() - 1;
            tr.addClass("month-start");
            tr.attr("id", "month" + month);
        });
        $(_calendar).find('tr:not(.month-start) th').remove();
        $(_calendar).find('tr.month-start').each(function(){
            var $this = $(this);
            var ind = trs.index($this);
            var nextInd = trs.index($this.nextAll("tr.month-start"));
            nextInd = (nextInd == -1) ? totalTr : nextInd;
            var th = $(this).find("th");
            th.attr("rowspan", (nextInd - ind));
        });
        trs.filter("tr[id^=month]").each(function(){
            $(this).find("th").html(iTravel.writeVerticalMonth(this.id.replace("month", "")));
        });
    },
    writeVerticalMonth: function(_month){
        _month = _month.toLowerCase();
        return '<div class="b-month b-month-' + _month + '">&nbsp;</div>';
    },
    mainCalendarSetToday: function(_calendar, _date){
        $(_calendar).find("#" + iTravel.mainCalendarDate2Id(_date)).addClass("today").find(".label").text(localization.ru.today);
    },
    mainCalendarSetBeforeToday: function(_calendar, _date){
        var i = -1;
        var curDate = new Date(_date);
        while (i > -7) {
            curDate.setDate(curDate.getDate() - 1);
            $("#" + iTravel.mainCalendarDate2Id(curDate)).addClass("before-today");
            i = i - 1;
        }
    },
    mainCalendarAddDay: function(_calendar, _day){
        //Adding Days to Calendar
        if (_day.getDay() == 1) {
            _calendar.append('<tr><th>&nbsp;</th></tr>');
        }
        _calendar.find("tr:last").append('<td id="' + iTravel.mainCalendarDate2Id(_day) + '"><div class="wrap-1" id="' + iTravel.mainCalendarDate2Id(_day) + '-wrap-1"><div class="label" id="label-' + iTravel.mainCalendarDate2Id(_day) + '">&nbsp;</div><div class="date">' + _day.getDate() + '</div><div class="price" id="price-' + iTravel.mainCalendarDate2Id(_day) + '">&nbsp;</div></div></td>');
    },
    
    mainCalendarShowInfo: function(_text){
        $("#b_tab2_messages .message").hide();
        $("#b_tab2_messages .info").show();
        if (_text) {
            $("#b_tab2_messages .info").text(_text);
        }
    },
    mainCalendarShowWarning: function(_text){
        $("#b_tab2_messages .message").hide();
        $("#b_tab2_messages .warning").show();
        if (_text) {
            $("#b_tab2_messages .warning").text(_text);
        }
    },
    mainCalendarShowNotFound: function(_text){
        $("#b_tab2_messages .message").hide();
        $("#b_tab2_messages .not-found").show();
        if (_text) {
            $("#b_tab2_messages .warning").text(_text);
        }
    },
    
    priceSliderParams: {
        range: true,
        min: pricesLimits[selectedCurrencyCode][0],
        max: pricesLimits[selectedCurrencyCode][1],
        step: pricesLimits[selectedCurrencyCode][2],
        values: [pricesLimits[selectedCurrencyCode][0], pricesLimits[selectedCurrencyCode][1]],
        
        switchCurrency: function(oldCurrency, newCurrency){
            if (oldCurrency != newCurrency) {
                var values = this.values;
                var ratio = pricesRatios[oldCurrency][newCurrency];
                var roundFactor = pricesLimits[newCurrency][2];
                
                this.min = pricesLimits[newCurrency][0];
                this.max = pricesLimits[newCurrency][1];
                this.step = pricesLimits[newCurrency][2];
                this.values = [Math.round(values[0] * ratio / roundFactor) * roundFactor, Math.round(values[1] * ratio / roundFactor) * roundFactor];
                
                if (this.values[0] < this.min || isNaN(this.values[0])) 
                    this.values[0] = this.min;
                if (this.values[1] > this.max || isNaN(this.values[1])) 
                    this.values[1] = this.max;
            }
        },
        
        slide: function(event, ui){
            var $prices = $(ui.handle).parent().prev();
            $prices.children(".min").children("span").html(iTravel.getTextAccordingToCurrency(ui.values[0], "37a512_11_0"));
            $prices.children(".max").children("span").html(iTravel.getTextAccordingToCurrency(ui.values[1], "37a512_11_0"));
        },
        
        change: function(event, ui){
            $("#" + this.id + "_value_0").val($(this).slider("values", 0));
            $("#" + this.id + "_value_1").val($(this).slider("values", 1));
            $("#" + this.id + "_label_0").html(iTravel.getTextAccordingToCurrency(ui.values[0], "000000_14_0"));
            $("#" + this.id + "_label_1").html(iTravel.getTextAccordingToCurrency(ui.values[1], "000000_14_0"));
        }
    },
    
    initSelectPrice: function(ctrl, _slider, _input, _labelsPrefix){
        var _ctrl = $(ctrl);
        var _currency = ['RUR', 'USD', 'EUR'];
        
        _ctrl.find("a").click(function(){
            _ctrl.find("span.inner").removeClass("active");
            var ind = _ctrl.find("a").index($(this));
            $(this).parent().addClass("active");
            $(this).blur();
            
            var oldCurrency = selectedCurrencyCode;
            var newCurrency = _currency[ind];
            $(_input).val(newCurrency);
            selectedCurrency = localization.ru[newCurrency];
            selectedCurrencyCode = newCurrency;
            
            // Reinitialize options container
            iTravel.priceSliderParams.values = $(_slider).slider('option', 'values');
            iTravel.priceSliderParams.switchCurrency(oldCurrency, newCurrency);
            
            // Reinitialize slider options
            $(_slider).slider('option', 'min', iTravel.priceSliderParams.min);
            $(_slider).slider('option', 'max', iTravel.priceSliderParams.max);
            $(_slider).slider('option', 'step', iTravel.priceSliderParams.step);
            $(_slider).slider('option', 'values', iTravel.priceSliderParams.values);
            
            // Update slider labels
            var $prices = $(_slider).prev();
            $prices.children(".min").children("span").html(iTravel.getTextAccordingToCurrency(iTravel.priceSliderParams.values[0], "37a512_11_0"));
            $prices.children(".max").children("span").html(iTravel.getTextAccordingToCurrency(iTravel.priceSliderParams.values[1], "37a512_11_0"));
            
            // Update extra labels
            $(_labelsPrefix + "_0").html(iTravel.getTextAccordingToCurrency(iTravel.priceSliderParams.values[0], "000000_14_0"));
            $(_labelsPrefix + "_1").html(iTravel.getTextAccordingToCurrency(iTravel.priceSliderParams.values[1], "000000_14_0"));
            
            return false;
        });
        
        $(_slider).slider(iTravel.priceSliderParams).each(function(){
            $(this).children("a:eq(0)").addClass("ui-slider-handle-left");
            $(this).children("a:eq(1)").addClass("ui-slider-handle-right");
            
            var $prices = $(_slider).prev();
            $prices.children(".min").children("span").html(iTravel.getTextAccordingToCurrency(iTravel.priceSliderParams.values[0], "37a512_11_0"));
            $prices.children(".max").children("span").html(iTravel.getTextAccordingToCurrency(iTravel.priceSliderParams.values[1], "37a512_11_0"));
        });
        
        $(_labelsPrefix + "_0").html(iTravel.getTextAccordingToCurrency(iTravel.priceSliderParams.values[0], "000000_14_0"));
        $(_labelsPrefix + "_1").html(iTravel.getTextAccordingToCurrency(iTravel.priceSliderParams.values[1], "000000_14_0"));
    },
    
    childrenMax: 2,
    childrenLastVal: 10,
    initAdultAdd: function(ctrl, label, label2, _input){
        var _ctrl = $(ctrl);
        var _label = $(label);
        var _label2 = $(label2);
        _ctrl.find("a").click(function(){
            _ctrl.find("li>span").removeClass("active");
            var ind = _ctrl.find("a").index($(this));
            $(this).parent().addClass("active");
            $(this).blur();
            _label.text((ind == 0) ? ((ind + 1) + " " + localization.ru.adults.single) : ((ind + 1) + " " + localization.ru.adults.multiple));
            _label2.text((ind == 0) ? ((ind + 1) + " " + localization.ru.adults2.single) : ((ind + 1) + " " + localization.ru.adults2.multiple));
            if (_input) {
                $(_input).val((_ctrl.find("a").index($(this)) + 1));
            }
            return false;
        });
    },
    adultSetNum: function(ctrl, numAdults){
        $(ctrl).find("a:eq(" + (numAdults - 1) + ")").click();
    },
    
    initChildrenAdd: function(ctrl, label, ages){
        var _ctrl = $(ctrl);
        var _label = $(label);
        var _addPanel = _ctrl.find(".add-child");
        var _addBtn = _ctrl.find(".add-child a");
        var _setAgePanel = _ctrl.find(".set-age");
        var _setAgeBtn = _ctrl.find(".set-age a");
        var _setAgeInput = _ctrl.find(".set-age input");
        
        _ctrl.find(".one-child .delete-item").unbind("click").click(function(){
            iTravel.childrenRemove(_ctrl, label, 0);
            return false;
        });
        _ctrl.find(".second-child .delete-item").unbind("click").click(function(){
            iTravel.childrenRemove(_ctrl, label, 1);
            return false;
        });
        
        iTravel.childrenLastVal = _setAgeInput.val();
        _addBtn.unbind("click").click(function(){
            _setAgePanel.show();
            _setAgeInput.val("");
            _addPanel.hide();
            setTimeout(function(){
                _setAgeInput.get(0).select();
            }, 10);
            setTimeout(function(){
                _setAgeInput.get(0).focus();
            }, 20);
            return false;
        });
        _setAgeInput.unbind("blur").blur(function(){
            var _val = (this.value != "") ? parseInt(this.value) : "";
            this.value = _val;
            var _inp = $(this);
            if (iTravel.childrenValidate(_val)) {
                iTravel.childrenLastVal = _val;
				iTravel.childrenAdd(ctrl, parseInt(this.value), label);
            } 
            if (_ctrl.find(".values input").length < 2) {
                _addPanel.show();
            }
            if ($.browser.opera) { setTimeout(function(){_setAgePanel.hide();},1); } else {_setAgePanel.hide();}
        });
        _setAgeInput.unbind("keypress").keypress(function(e){
            var charCode = e.which;
            if (charCode > 31 && (charCode < 48 || charCode > 57)) 
                return false;
            if (charCode == 13 && iTravel.childrenValidate(this.value)) {
                this.blur();
            }
        });
        
        if (ages != null && jQuery.isArray(ages)) {
            $(ages).each(function(i){
                iTravel.childrenAdd(ctrl, ages[i], label);
            });
        }
    },
    
    childrenValidate: function(_val){
        _val = parseInt(_val);
        if (!(_val >= 0 && _val <= 17)) {
            return false;
        }
        else {
            return true;
        }
    },
    childrenAdd: function(ctrl, age, label){
        var _ctrl = $(ctrl);
        var _values = _ctrl.find(".values");
        var _childrenNum = _values.children("input").length;
        if (_childrenNum < iTravel.childrenMax) {
            _values.append('<input type="hidden" value="' + age + '" />');
            iTravel.childrenSetNum(ctrl, label);
        }
        else {
            //Show Error Message
        }
    },
    childrenRemoveAll: function(ctrl, label){
        $(ctrl).find(".values").children("input").each(function(){
            iTravel.childrenRemove(ctrl, label, 0);
        });
    },
    childrenRemove: function(ctrl, label, ind){
        var _ctrl = $(ctrl);
        var _values = _ctrl.find(".values");
        _values.children("input:eq(" + ind + ")").remove();
        iTravel.childrenSetNum(ctrl, label);
    },
    childrenSetNum: function(ctrl, label){
        var _ctrl = $(ctrl);
        var _label = $(label);
        var _values = _ctrl.find(".values");
        var _childrenNum = _values.children("input").length;
        if (_childrenNum == 0) {
            _label.text(localization.ru.children.zero);
            _ctrl.find(".one-child").hide();
            _ctrl.find(".add-child").removeClass("last").addClass("only");
            _ctrl.find(".set-age").removeClass("last").addClass("only");
            _ctrl.find(".set-age input").val("");
        }
        if (_childrenNum == 1) {
            _label.text(_childrenNum + " " + localization.ru.children.single);
            //_ctrl.find(".b-children-expanded").hide();
            _ctrl.find(".one-child").show();
            _ctrl.find(".second-child").hide();
            //_ctrl.find(".can-expand-item").hide();
            _ctrl.find(".one-child").find(".years").text(iTravel.childrenSetAge(_values.children("input:eq(0)").val(),1));
            _ctrl.find(".add-child").removeClass("only").addClass("last");
            _ctrl.find(".set-age").removeClass("only").addClass("last");
            //_ctrl.find(".set-age input").val("");
            _ctrl.find(".add-child").show();
            
        }
        if (_childrenNum == 2) {
            _label.text(_childrenNum + " " + localization.ru.children.single);
            //_ctrl.find(".b-children-expanded").hide();
            _ctrl.find(".second-child").show();
            _ctrl.find(".can-expand-item").hide();
            _ctrl.find(".second-child").find(".years").text(iTravel.childrenSetAge(_values.children("input:eq(1)").val(),2));
            _ctrl.find(".add-child").hide();
            //setTimeout(function(){_ctrl.find(".set-age").hide();},500);
            //_ctrl.find(".add-child").removeClass("only").addClass("last");
            //_ctrl.find(".set-age").removeClass("only").addClass("last");
        }
        
        if (_childrenNum > 1 && _childrenNum <= 4) {
            _label.text(_childrenNum + " " + localization.ru.children.multiple2_4);
        }
        if (_childrenNum > 0 && _childrenNum > 4) {
            _label.text(_childrenNum + " " + localization.ru.children.multiplemore_4);
        }
    },
    
    childrenSetAge: function(_val, count){
        var years_num = _val;
        var years_label = (years_num == 0) ? localization.ru.age.multiplemore_4 : ((years_num == 1) ? localization.ru.age.single : ((years_num > 1 && years_num <= 4) ? localization.ru.age.multiple2_4 : localization.ru.age.multiplemore_4));
        var _label =  years_num + " " + years_label;
        iTravel.refreshChildPersonItem(count,_label);
        return _label;
    },
    
    refreshChildPersonItem: function(count,_label) {
    	$("#child_name_label"+count).text(", " + _label);
    },
    
    removeCompareTour: function(obj){
        var i = $('a.delete').index(obj) + 1;
        $('.compare tr td:nth-child(' + i + '), .compare tr th:nth-child(' + i + ')').remove();
    },
    
    myTourCheck: function(obj){
        var checkedBoxes = $("#j_my_tours .checkbox-td input:checked");
        if (checkedBoxes.length <= 1) {
            $("#j_tours_compare>a").removeClass("g-btn-green-2").addClass("g-btn-gray");
        }
        else {
            $("#j_tours_compare>a").removeClass("g-btn-gray").addClass("g-btn-green-2");
        }
        
        $("#hotels_number").removeClass("hotels-1 hotels-2 hotels-3 hotels-4");
        if (checkedBoxes.length != 0) {
            $("#hotels_number").addClass("hotels-" + Math.min(checkedBoxes.length, 4));
        }
        
        var result = true;
        if (checkedBoxes.length <= 4) {
            $("#j_tours_warning").hide();
        }
        else {
            $("#j_tours_warning").show();
            result = false;
        }
        return result;
    },
    
    myTourAdd: function(data){
        iTravel.getAJAXContent("/myTours!add.action", "#j_my_tours_block", "POST", data);
        var id = data['tour.tourId'];
        $("#tour_" + id).find("#add").hide();
        $("#tour_" + id + "_popup").find("#add").hide();
        $("#tour_" + id + "_map").find("#add").hide();
        $("#tour_" + id).find("#added").show();
        $("#tour_" + id + "_popup").find("#added").show();
        $("#tour_" + id + "_map").find("#added").show();
        if (typeof addedTours != "undefined" && jQuery.isArray(addedTours)) {
            addedTours.push(id);
        }
    },
    
    myTourDelete: function(data){
        iTravel.getAJAXContent("/myTours!delete.action", "#j_my_tours_block", "POST", data);
        var id = data['tour.tourId'];
        $("#tour_" + id).find("#added").hide();
        $("#tour_" + id + "_map").find("#added").hide();
        $("#tour_" + id).find("#add").show();
        $("#tour_" + id + "_map").find("#add").show();
    },
    
    fullPopupDestroy: function(id){
        var div = $("div[aria-labelledby='ui-dialog-title-" + id + "']");
        div.html("");
        div.remove();
        $("body").append("<div id='" + id + "'></div>");
    },
    
    getTourDetailWithCriteria: function(data) {
//    	data = iTravelAdvSearch.addCriteriaToData(data,crit,"searchCriteria")
    	data = mergeObject(data,crit,"searchCriteria",["firstBookingDate","calendarFirstDate","calendarLastDate","searchDate"]);
    	iTravel.getTourDetail(data);
    },
    
    getTourDetail: function(data){
        iTravel.getTourDetailEx(data, "/ShowTourDetails.action");
    },
    getTourDetailEx: function(data, action){
        $(document).ready(function(){
            iTravel.getAJAXContent(action, "#j_tour_detail", "POST", data);
        });
        $("#j_tour_detail").dialog({
            height: "auto",
            modal: true,
            autoOpen: false,
            autoResize: true,
            width: 702,
            dialogClass: "b-popup-detail",
            close: function(event, ui){
                iTravel.fullPopupDestroy("j_tour_detail");
            }
        });
        $("#j_tour_detail").dialog('open');
    },
    
    removeCompareHotel: function(obj){
        var i = $('a.delete').index(obj) + 1;
        $('.compare tr td:nth-child(' + i + '), .compare tr th:nth-child(' + i + ')').remove();
    },
    
    removeCompareHotelUp: function(obj){
        var i = $('a.b-dialog-close').index(obj) + 1;
        $('.compare tr td:nth-child(' + i + '), .compare tr th:nth-child(' + i + ')').remove();
    },
    
    myHotelCheck: function(obj){
        var checkedBoxes = $("#j_my_hotels_block .checkbox-td input:checked");
        if (checkedBoxes.length <= 1) {
            $("#j_my_hotels_block .b-hotels-comparison>a").addClass("g-btn-gray").removeClass("g-btn-green-2");
        }
        else {
            $("#j_my_hotels_block .b-hotels-comparison>a").removeClass("g-btn-gray").addClass("g-btn-green-2");
        }
        
        $("#hotels_number").removeClass("hotels-1 hotels-2 hotels-3 hotels-4");
        if (checkedBoxes.length != 0) {
            $("#hotels_number").addClass("hotels-" + Math.min(checkedBoxes.length, 4));
        }
        
        var result = true;
        if (checkedBoxes.length <= 4) {
            $("#j_my_hotels_block p.warning").hide();
        }
        else {
            $("#j_my_hotels_block p.warning").show();
            result = false;
        }
        return result;
    },
    
    myHotelAdd: function(data){
        iTravel.getAJAXContent("/myHotels!add.action", "#j_my_hotels_block", "POST", data);
        var id = data['hotel.hotelId'];
        $("#hotel_" + id).find("#add").hide();
        $("#hotel_" + id + "_map").find("#add").hide();
        $("#hotel_" + id).find("#added").show();
        $("#hotel_" + id + "_map").find("#added").show();
        if (typeof addedHotels != "undefined" && jQuery.isArray(addedHotels)) {
            addedHotels.push(id);
        }
    },
    
    myHotelDelete: function(data){
        iTravel.getAJAXContent("/myHotels!delete.action", "#j_my_hotels_block", "POST", data);
        var id = data['hotel.hotelId'];
        $("#hotel_" + id).find("#add").show();
        $("#hotel_" + id + "_map").find("#add").show();
        $("#hotel_" + id).find("#added").hide();
        $("#hotel_" + id + "_map").find("#added").hide();
    },
    
    getHotelDetail: function(data){
        $(document).ready(function(){
            iTravel.getAJAXContent("/getHotelDetails.action", "#j_detail_tabs", "POST", data);
        });
    },
    
    hotDealsInit: function(){
        var query = location.search.substring(1);
        var params = query.split("&");
        for (i = 0; i < params.length; i++) {
            var param = params[i].split("=");
            $('#hotdeals_filter_' + param[0] + ' > a').removeClass("selected");
            $('#hotdeals_filter_' + param[0] + ' > a[name=' + param[1] + ']').addClass("selected");
            var count = $('#hotdeals_filter_' + param[0] + ' > a[name=' + param[1] + ']').addClass("selected").size();
            if (count == 0) 
                $('#hotdeals_filter_' + param[0] + ' > a:last').addClass("selected");
        }
        $(".hotdeals-filter-price-item").hover(function(){
            if (!$(this).hasClass("selected")) 
                $(this).addClass("hover");
        }, function(){
            if (!$(this).hasClass("selected")) 
                $(this).removeClass("hover");
        });
    },
    
    hotDealsUpdate: function(options){
        $("#j_filters_disabler").css({
            top: $(".l-hotdeals-top").position().top,
            left: $(".l-hotdeals-top").position().left
        });
        $("#j_filters_disabler").width($(".l-hotdeals-top").outerWidth());
        $("#j_filters_disabler").height($(".l-hotdeals-top").outerHeight());
        $("#j_filters_disabler").show();
        
        var postData = {
            town: $("#hotdeals_filter_town a.selected").attr("name"),
            country: $("#hotdeals_filter_country a.selected").attr("name"),
            price: $("#hotdeals_filter_price a.selected").attr("name"),
            date: $("#hotdeals_filter_date a.selected").attr("name"),
            period: $("#hotdeals_filter_period a.selected").attr("name")
        };
        $.extend(postData, {
            groupBy: "price",
            currentPage: 1
        }, options || {});
        iTravel.getAJAXContent("/hotDeals.action", "#j_hot_deals_block", "POST", postData, function(){
            $("#j_filters_disabler").hide();
        }, function(){
            $("#j_filters_disabler").hide();
        });
    },
    
    carouselTabUpdate: function(){
        $("#j_tabs_disabler").css({
            top: $("#j_detail_tabs .l-tabs").position().top - 6,
            left: $("#j_detail_tabs .l-tabs").position().left
        });
        $("#j_tabs_disabler").width($("#j_detail_tabs .l-tabs").outerWidth());
        $("#j_tabs_disabler").height($("#j_detail_tabs .l-tabs").outerHeight());
        $("#j_tabs_disabler").show();
    },
    
    setPrices: function(){
        $("div.country").each(function(){
			var $parent = $(this).find("p:first");
            var name = $parent.find("a:first").attr("name");
	    var promo_discount=new Number(iTravel.getPromoDiscount());
            if (countriesHotDealsPrices[name]) {
		    var price=countriesHotDealsPrices[name];
		    if(promo_discount>0){
          		var bprice= new Number(countriesHotDealsBasePrices[name]);
		        price=Math.ceil((price-price*promo_discount/100));
		    }
                    $parent.find('span[id=' + name + ']').text(iTravel.formatPriceDigits(price));
                $parent.show();
            }
        });
    },
    
    showPopup: function(ctrl, action, data){
        $(document).ready(function(){
            iTravel.getAJAXContent(action, "#" + ctrl, "POST", data, function(){
                $("#" + ctrl).dialog({
                    height: "auto",
                    modal: true,
                    autoOpen: false,
                    autoResize: true,
                    bgiframe: true,
                    width: 702,
                    dialogClass: "b-popup-detail",
                    position: "top",
                    close: function(event, ui){
                        iTravel.fullPopupDestroy(ctrl);
                    }
                });
                $("#" + ctrl).dialog('open');
            });
        });
    },
    
    //init Hotel Stars rating
    initStarRate: function(jObj){
        var oldRate;
        jObj.mouseover(function(e){
            oldRate = "rating-stars rating-" + $(this).next("input").val(v);
            var width = $(this).width();
            var x = e.pageX - $(this).offset().left;
            var v = parseInt((x / width) * 5) + 1;
            $(this).parent().get(0).className = "";
            $(this).parent().addClass("rating-stars rating-" + v);
        }).mousemove(function(e){
            var width = $(this).width();
            var x = e.pageX - $(this).offset().left;
            var v = parseInt((x / width) * 5) + 1;
            $(this).parent().get(0).className = "";
            $(this).parent().addClass("rating-stars rating-" + v);
        }).mouseout(function(){
            $(this).parent().get(0).className = "";			
            $(this).parent().addClass("rating-stars rating-" + $(this).next("input").val());
        }).click(function(e){
            oldRate;
            var width = $(this).width();
            var x = e.pageX - $(this).offset().left;
            var v = parseInt((x / width) * 5) + 1;
            $(this).parent().get(0).className = "";
            $(this).next("input").val(v);
            $(this).parent().addClass("rating-stars rating-" + v);
            oldRate = "rating-stars rating-" + v;
        });
    },
    
    getAdProposal: function(){
        var data = {
            fromCity: getCity(),
            "searchCriteria.toCountryCode": getCountry(),
            "searchCriteria.toResortIdUi": getResort(),
            "searchCriteria.hotelCategoryMinRank": $("#j_hotel_slider_value_0").val(),
            "searchCriteria.hotelCategoryMaxRank": $("#j_hotel_slider_value_1").val(),
            "searchCriteria.departureDate": getDepartDate(),
            "searchCriteria.departureDateVariants": $("#b_tab2_dep_var").val(),
            "searchCriteria.numNights": $("#b_tab2_nights").val(),
            "searchCriteria.numNightsVariants": $("#b_tab2_nights_var").val()
        };
        iTravel.getAJAXContent("/adProposal.action", "#j_hotel_photo", "POST", data);
    },
    
    expandTourMap: function(selectedMarker){
        $(".l-left-col>h2.g-green").hide();
	    $(".l-left-col").addClass("l-left-col-expanded");
        $(".b-expanded-map-4").show();
        $(".b-expanded-map-4").append($("#j_map_3").removeClass("b-map-3").addClass("b-map-4"));
        iTravelMaps.initializeGoogleMap1("j_map_3", "tour2", "/images/bg-google-map-4", selectedMarker);
        $("#j_expand_map").hide();
        $("#j_collapse_map").parents('div:first').show();
        $("#j_collapse_map").show();
    },
    collapseTourMap: function(){
        $(".l-left-col>h2.g-green").show();
        $(".b-expanded-map-4").hide();
        $("#j_map_3_wrap").prepend($("#j_map_3").removeClass("b-map-4").addClass("b-map-3"));
        iTravelMaps.initializeGoogleMap1("j_map_3", "tour1", "/images/bg-google-map-3");
        $("#j_expand_map").show();
		$(".l-left-col").removeClass("l-left-col-expanded");
        $("#j_collapse_map").parents('div:first').hide();
        $("#j_collapse_map").hide();
    },
	getSortOrder: function(_ctrl, sorting, defaultOrder) {
		$ctrl = $(_ctrl);
		$parent = $ctrl.parents('span:first');
		var order = defaultOrder;
		if ($parent.hasClass('active')) {
			if ($parent.hasClass('desc')) {
				$parent.removeClass('desc').addClass('asc');
				$ctrl.find('img').attr('src', '/images/sort-asc.gif');
				order = true;
			} else {
				$parent.removeClass('asc').addClass('desc');
				$ctrl.find('img').attr('src', '/images/sort-desc.gif');
				order = false;
			}
		} else {
			// move image
			$ctrl.find('span').append($('#j_sort_panel .active img'));
			$('#j_sort_panel .active').removeClass('active').removeClass('asc').removeClass('desc');
			$parent.addClass('active');
			$parent.addClass((defaultOrder)?'asc':'desc');
			$ctrl.find('img').attr('src', '/images/sort-'+((defaultOrder)?'asc':'desc')+'.gif');
		}
		return order;
	},
	sortTours:function (_ctrl, sorting, defaultOrder) {
		var order = iTravel.getSortOrder(_ctrl, sorting, defaultOrder);
		iTravelAdvSearch.doSearch({'searchCriteria.order':sorting, 'searchCriteria.sortAscending':order, 'searchCriteria.currentPage':1});
		return false;
//		iTravel.getAJAXContent('/tours!sort.action', '#toursList', 'POST' , data, function(){$('#j_collapse_map').click();});
	},
	sortHotels:function (_ctrl, sorting, defaultOrder) {
		var order = iTravel.getSortOrder(_ctrl, sorting, defaultOrder);
		iTravel.getAJAXContent('/hotelInfo!sort.action', '#hotelsList', 'POST' , {'sortCriteria.order':sorting, 'sortCriteria.sortAscending':order}, function(){$('#j_collapse_map').click();});
	}
};

var iTravelAdvSearch = {
    updateFlightsInfo: function(){
        var text = "", arr = ["NULL", "0"], toCountrySelected = false;
        
        var fromCityCode = $("#j_tour_start_city").find("option:selected").val();
        if (jQuery.inArray(fromCityCode, arr) < 0) {
		/*
            if (jQuery.inArray(fromCityCode, iTravel.getMoscowAirports()) >= 0) {
                text += localization.ru.moscow + ", " + localization.ru.airport_prefix +
                " " +
                $("#j_tour_start_city").find("option:selected").text().trim();
            }
            else 
			*/
                text += $("#j_tour_start_city").find("option:selected").text();
        }
        
        if (jQuery.inArray($("#j_tour_arrival").find("option:selected").val(), arr) < 0) {
            text += " - " + $("#j_tour_arrival").find("option:selected").text();
            toCountrySelected = true;
        }
        if (jQuery.inArray($("#j_tour_resort").find("option:selected").val(), arr) < 0) {
			$ctrl = $("#j_tour_resort").find("option:selected");
			if ($ctrl.val() < 0) {
				text += ", " + $ctrl.parent().attr("label").trim();
			} else
            text += ", " + $("#j_tour_resort").find("option:selected").text().trim();
		}
        /*
        if (jQuery.inArray($("#j_tour_arrival_airport").find("option:selected").val(), arr) < 0) {
            if (text.length > 0) 
                text += (toCountrySelected ? ", " : " - ");
            text += localization.ru.airport_prefix + " " +
            $("#j_tour_arrival_airport").find("option:selected").text();
        }
		*/
        $("#j_tour_flights_label").text(text.trim());
    },
    
    updateNightsVariants: function(n1, n2, n5){
        var nights1 = n1.substr(2), nights2 = n2.substr(2), nights5 = n5.substr(2);
        var numNights = Number($("#j_number_of_nights").find("option:selected").val());
        var numVariants = Number($("#nights_pl_min_3").find("option:selected").val());
        var text = "";
        if (numVariants == 0) {
            var value = numNights % 100, value2 = numNights % 10;
            if (value > 10 && value < 20) 
                text += numNights + " " + nights5;
            else 
                if (value2 > 1 && value2 < 5) 
                    text += numNights + " " + nights2;
                else 
                    if (value2 == 1) 
                        text += numNights + " " + nights1;
                    else 
                        text += numNights + " " + nights5;
        }
        else {
            var minNights = (numNights - numVariants < 2) ? 2 : numNights - numVariants;
            var maxNights = (numNights + numVariants > 21) ? 21 : numNights + numVariants;
            text = minNights + " - " + maxNights + " " + nights5;
        }
        $("#j_number_of_nights_label").text(text);
    },
    
    updateDatesVariants: function(){
        var numVariants = Number($("#flight_variants").find("option:selected").val());
        var date = $("#j_tour_date").datepicker("getDate");
        var text = "";
        if (numVariants == 0) {
            text = date.getDate() + " " + localization.ru.calendarMonthsRod[date.getMonth()].toLowerCase();
        }
        else {
            var daysToMillis = 24 * 60 * 60 * 1000;
            var minDate = new Date(date.getTime() - (numVariants * daysToMillis));
            var maxDate = new Date(date.getTime() + (numVariants * daysToMillis));
            if (minDate.getMonth() == maxDate.getMonth()) {
                text = minDate.getDate() + " - " + maxDate.getDate() + " " +
                localization.ru.calendarMonthsRod[minDate.getMonth()].toLowerCase();
            }
            else {
                text = minDate.getDate() + " " + localization.ru.calendarMonthsRod[minDate.getMonth()].toLowerCase() + " - " +
                maxDate.getDate() +
                " " +
                localization.ru.calendarMonthsRod[maxDate.getMonth()].toLowerCase();
            }
        }
        $("#j_tour_date_label").text(text);
    },
    
    updateHotelDetails: function(){
        if ($("#j_hotel_slider").length <= 0) 
            return;
        var stars = $("#j_hotel_slider").slider("values");
        if (stars != undefined) {
            var arr = ["NULL", "0", ""];
            if ($("#j_hotel_name").is("select")) {
                if (jQuery.inArray($("#j_hotel_name").find("option:selected").val(), arr) < 0) {
                    $("#j_hotel_name_label").text($("#j_hotel_name").find("option:selected").text() + ", ");
                }
                else {
                    $("#j_hotel_name_label").text("");
                }
            }
            else {
                var text = $("#j_hotel_name").val();
                if (text.length > 0) 
                    text += ", ";
                $("#j_hotel_name_label").text(text);
            }
            if (stars[0] != stars[1]) {
                $("#j_hotel_category_label").text(stars[0] + "* - " + stars[1] + "*");
            }
            else {
                $("#j_hotel_category_label").text(stars[0] + "*");
            }
        }
    },
    
    updateMealDetails: function(defaultValue){
        var checked = [], inputs = $("#meal_codes").find(":checkbox");
        inputs.each(function(i){
            if ($(this).attr("checked")) 
                checked.push($(this).attr("id"));
        });
        if (checked.length == inputs.length || checked.length == 0) 
            checked = [defaultValue];
        $("#j_meal_details_label").text(checked.join(", "));
    },
    
    updateLeisureDetails: function(defaultValue){
        var checked = [], inputs = $("#leisure_types").find(":checkbox");
        inputs.each(function(i){
            if ($(this).attr("checked")) 
                checked.push($(this).parent().next().children("label").text());
        });
        if (checked.length == inputs.length || checked.length == 0) 
            checked = [defaultValue];
        $("#j_leisure_type_label").text(checked.join(", "));
    },
    
    updateCheckedInfo: function(contId, labelId, defaultValue){
        var checked = [];
        $(contId).find(":checkbox:checked").each(function(i){
            checked.push($(this).parent().next().children("label").text());
        });
        if (checked.length == 0) 
            checked = [defaultValue];
        $(labelId).text(checked.join(", "));
    },
    
    searchHotelName: function(text){
        var htmlNode = $("#dummy_div");
        var textlat = text.replace(/[^a-z ]/ig, ""); // remove any non-word chars
        var textRE = new RegExp(textlat, "ig");
        var countryCode = $("#j_tour_arrival").find("option:selected").val();
        var resortId = $("#j_tour_resort").find("option:selected").val();
        var minRank = $("#j_hotel_slider_value_0").val();
        var maxRank = $("#j_hotel_slider_value_1").val();
        
        var result = [];
        for (var i = 0; i < hotels.length; i++) {
            var hotel = hotels[i];
            if (countryCode != "0" && hotel.countryCode != countryCode) 
                continue;
            if (resortId != "0" && hotel.resortId != resortId) 
                continue;
            if (hotel.rank < minRank || hotel.rank > maxRank) 
                continue;
            if (hotel.name.search(textRE) >= 0) 
                result.push({
                    text: htmlNode.html(hotel.name).text(),
                    rank: hotel.rank
                });
        }
        return result;
    },
    
    switchSliderValues: function(ctrl, newValues){
        // Switch slider values
        var _ctrl = $(ctrl);
        _ctrl.slider("values", 0, newValues[0]);
        _ctrl.slider("values", 1, newValues[1]);
        iTravel.hotelSliderParams.values = $("#j_hotel_slider").slider("values");
        
        // Adjust star styles
        var stars = _ctrl.prev();
        stars.children("span").removeClass("active");
        for (var i = _ctrl.slider("values", 0) - 1; i < _ctrl.slider("values", 1); i++) {
            stars.children("span:eq(" + i + ")").addClass("active");
        }
    },
    
    fillCriteriaFromFields: function(crit) {
        var startCity = $("#j_tour_start_city").val();
        if ((startCity != "0") && (startCity != "NULL")) {
        	crit["fromCityCode"] = $("#j_tour_start_city").val();
        }
        else {
        	crit["fromCityCode"] = "";
        }
        if ($("#j_tour_arrival").val() != "0") {
            crit["toCountryCode"] = $("#j_tour_arrival").val();
        }
        if ($("#j_tour_resort").val() != "0") {
            crit["toResortIdUi"] = $("#j_tour_resort").val();
        }
        if ($("#j_tour_arrival_airport").val() != "0") {
            crit["toAirportCode"] = $("#j_tour_arrival_airport").val();
        }
        
        crit["departureDate"] = $("#j_tour_date").val().getEpDate();
        crit["departureDateVariants"] = $("#flight_variants").val();
        crit["numNights"] = $("#j_number_of_nights").val();
        crit["numNightsVariants"] = $("#nights_pl_min_3").val();
        crit["numAdults"] = $("#j_tour_filter_adults_input").val();
        
        crit["childrenAgesUi"] = "";
        $("#j_tour_filter_kids_buttons .values input").each(function(i){
            if (i > 0) 
                crit["childrenAgesUi"] = crit["childrenAgesUi"].concat(",");
            crit["childrenAgesUi"] = crit["childrenAgesUi"].concat($(this).val());
        });
        
        crit["minPriceUi"] = $(".prices .min span").text().replace(/\D/g, "");
        crit["maxPriceUi"] = $(".prices .max span").text().replace(/\D/g, "");
        crit["currency"] = $("#j_price_slider_value_2").val();
        
        crit["hotelName"] = $("#j_hotel_name").val();
        crit["hotelCategoryMinRank"] = $("#j_hotel_slider_value_0").val();
        crit["hotelCategoryMaxRank"] = $("#j_hotel_slider_value_1").val();
        
        $("#meal_codes input:checked").each(function(i){
            crit["mealCodes[" + i + "]"] = $(this).val();
        });
        
        crit["familyLeisure"] = $("#family").is(":checked");
        crit["youthLeisure"] = $("#youth").is(":checked");
        crit["premiumLeisure"] = $("#premium").is(":checked");
        crit["spaLeisure"] = $("#spa").is(":checked");
        crit["sportLeisure"] = $("#sport").is(":checked");
        crit["businessLeisure"] = $("#business").is(":checked");
    },
        
    doSearch: function(aditData){    	    	
    	var data = {};  
    	data = mergeObject(data,crit,"searchCriteria",["firstBookingDate","calendarFirstDate","calendarLastDate","searchDate"]);    	
    	if(aditData) {
    		data = mergeObject(data,aditData,null,[]);
        }    	
        iTravel.getAJAXContent("/tours!advancedSearch.action", "#toursList", "POST", data, function(){$('#j_collapse_map').click();});
        $("#j_map_3").html('');
        return false;
    },
    
    doSearchAdv: function(){
      iTravelAdvSearch.fillCriteriaFromFields(crit);
      iTravelAdvSearch.doSearch({"searchCriteria.currentPage":1});
      return false;
    }
    
// Old search    
//    doSearch: function(page,sorting,oreder){
//        var data = {};
//                      
//        if(page) {
//        	data["currentPage"] = page;
//        } else {
//        	data["currentPage"] = 1;//$("#tour_search_page").val();
//        }
//
//        var startCity = $("#j_tour_start_city").val();
//        if ((startCity != "0") && (startCity != "NULL")) {
//            data["searchCriteria.fromCityCode"] = $("#j_tour_start_city").val();
//        }
//        else {
//            data["searchCriteria.fromCityCode"] = "";
//        }
//        if ($("#j_tour_arrival").val() != "0") {
//            data["searchCriteria.toCountryCode"] = $("#j_tour_arrival").val();
//        }
//        if ($("#j_tour_resort").val() != "0") {
//            data["searchCriteria.toResortId"] = $("#j_tour_resort").val();
//        }
//        if ($("#j_tour_arrival_airport").val() != "0") {
//            data["searchCriteria.toAirportCode"] = $("#j_tour_arrival_airport").val();
//        }
//        
//        data["searchCriteria.departureDate"] = $("#j_tour_date").val().getEpDate();
//        data["searchCriteria.departureDateVariants"] = $("#flight_variants").val();
//        data["searchCriteria.numNights"] = $("#j_number_of_nights").val();
//        data["searchCriteria.numNightsVariants"] = $("#nights_pl_min_3").val();
//        data["searchCriteria.numAdults"] = $("#j_tour_filter_adults_input").val();
//        
//        data["searchCriteria.childrenAgesUi"] = "";
//        $("#j_tour_filter_kids_buttons .values input").each(function(i){
//            if (i > 0) 
//                data["searchCriteria.childrenAgesUi"] = data["searchCriteria.childrenAgesUi"].concat(",");
//            data["searchCriteria.childrenAgesUi"] = data["searchCriteria.childrenAgesUi"].concat($(this).val());
//        });
//        
//        data["searchCriteria.minPriceUi"] = $(".prices .min span").text().replace(/\D/g, "");
//        data["searchCriteria.maxPriceUi"] = $(".prices .max span").text().replace(/\D/g, "");
//        data["searchCriteria.currency"] = $("#j_price_slider_value_2").val();
//        
//        data["searchCriteria.hotelName"] = $("#j_hotel_name").val();
//        data["searchCriteria.hotelCategoryMinRank"] = $("#j_hotel_slider_value_0").val();
//        data["searchCriteria.hotelCategoryMaxRank"] = $("#j_hotel_slider_value_1").val();
//        
//        $("#meal_codes input:checked").each(function(i){
//            data["searchCriteria.mealCodes[" + i + "]"] = $(this).val();
//        });
//        
//        data["searchCriteria.familyLeisure"] = $("#family").is(":checked");
//        data["searchCriteria.youthLeisure"] = $("#youth").is(":checked");
//        data["searchCriteria.premiumLeisure"] = $("#premium").is(":checked");
//        data["searchCriteria.spaLeisure"] = $("#spa").is(":checked");
//        data["searchCriteria.sportLeisure"] = $("#sport").is(":checked");
//        data["searchCriteria.businessLeisure"] = $("#business").is(":checked");
//        
//        iTravel.getAJAXContent("/tours!advancedSearch.action", "#toursList", "POST", data);
//        $("#j_map_3").html('');
//        return false;
//    }
};

var iTravelSocial = {
    maxCharactersNum: 1024,
    textAreaLimitTextSize: function(field){
        if (field.value.length > iTravelSocial.maxCharactersNum) {
            field.value = field.value.substring(0, iTravelSocial.maxCharactersNum);
        }
    },
    
    textAreaAssignEvents: function(field){
        var _field = $(field);
        _field.unbind("keydown").unbind("keyup").unbind("mouseout");
        _field.keydown(function(){
            iTravelSocial.textAreaLimitTextSize(this);
        });
        _field.keyup(function(){
            iTravelSocial.textAreaLimitTextSize(this);
        });
        _field.mouseout(function(){
            iTravelSocial.textAreaLimitTextSize(this);
        });
    },
    
    addOpinion: function(data){
        iTravel.getAJAXContent("/AddOpinion!saveAndShowForHotel.action", "#opinions_list", "POST", data, function(){
            iTravelSocial.addOpinionSuccessCallback();
        }, function(){
            iTravelSocial.addOpinionErrorCallback();
        });
    },
    addOpinionSuccessCallback: function(){
        $("#j_opinions_link").click();
    },
    addOpinionErrorCallback: function(){
        $("#j_opinions_link").click();
    },
    
    showQuestionPopup: function(data){
        $(document).ready(function(){
            iTravel.getAJAXContent("/ShowQuestionPopup!" + data.method + ".action", "#j_new_question", "POST", data, function(){
                $("#j_new_question").dialog({
                    height: "auto",
                    modal: true,
                    autoOpen: false,
                    autoResize: true,
                    bgiframe: true,
                    width: 702,
                    dialogClass: "b-popup-detail",
                    position: 'top',
                    close: function(event, ui){
                        iTravel.fullPopupDestroy("j_new_question");
                    }
                });
                $("#j_new_question").dialog('open');
            });
        });
    },
    
    updateQuestionsList: function(data){
        iTravel.getAJAXContent("/GetQuestions!" + data.method + ".action", "#j_questions_block", "POST", data, function(){ /* workaround for jQuery.dialog resizing */
            $("#j_questions_link").click();
        }, function(){
            $("#j_questions_link").click();
        });
    },
    
    addQuestion: function(data){
        var dataForAddQuestion = iTravel.clone(data);
        dataForAddQuestion['questionDto.question'] = $("#j_question_question_textarea").val();
        dataForAddQuestion['questionDto.description'] = $("#j_question_description_textarea").val();
        dataForAddQuestion['questionDto.anonymousUserName'] = $("#opinion_anonymous_name").val();
        dataForAddQuestion['questionDto.anonymousUserEmail'] = $("#opinion_anonymous_name").val();


        $(document).ready(function(){
            iTravel.getAJAXContent("/AddQuestion!" + data.method + ".action", "#j_new_question", "POST", dataForAddQuestion, function(){
                $("#j_new_question").dialog('close');
                iTravelSocial.updateQuestionsList(data);
            }, function(){
                $("#j_new_question").dialog('close');
                iTravelSocial.updateQuestionsList(data);
            });
        });
    },
    
    updateQuestion: function(data){
        var dataForUpdateQuestion = iTravel.clone(data);
        dataForUpdateQuestion['questionDto.question'] = $("#j_question_question_textarea").val();
        dataForUpdateQuestion['questionDto.description'] = $("#j_question_description_textarea").val();
        $(document).ready(function(){
            iTravel.getAJAXContent("/myQuestions!update.action", "#j_questions_block", "POST", dataForUpdateQuestion);
            $("#j_new_question").dialog('close');
        });
    },
    
    showAddAnswerPopup: function(data){
        $(document).ready(function(){
            iTravel.getAJAXContent("/ShowAddAnswerPopup.action", "#j_new_answer", "POST", data, function(){
                $("#j_new_answer").dialog({
                    height: "auto",
                    modal: true,
                    autoOpen: false,
                    autoResize: true,
                    bgiframe: true,
                    width: 702,
                    dialogClass: "b-popup-detail",
                    position: 'top',
                    close: function(event, ui){
                        iTravel.fullPopupDestroy("j_new_answer");
                    }
                });
                $("#j_new_answer").dialog('open');
            });
        });
    },
    
    updateAnswersList: function(data){
        iTravel.getAJAXContent("/GetAnswers!" + data.method + ".action", "#j_questions_block", "POST", data, function(){
            $("#j_questions_link").click();
        }, function(){
            $("#j_questions_link").click();
        });
    },
    
    addAnswer: function(data){
        var dataForAddAnswer = iTravel.clone(data);
        dataForAddAnswer['answerDto.answerText'] = $("#j_answer_textarea").val();
        $(document).ready(function(){
            iTravel.getAJAXContent("/AddAnswer.action", "#j_new_answer", "POST", dataForAddAnswer, function(){
                $("#j_new_answer").dialog('close');
                iTravelSocial.updateAnswersList(data);
            }, function(){
                $("#j_new_answer").dialog('close');
                iTravelSocial.updateAnswersList(data);
            });
        });
    },
    
    rateAnswer: function(data){
        $(document).ready(function(){
            iTravel.getAJAXContent("/RateAnswer.action", "#j_useful_buttons_" + data.answerId, "POST", data);
        });
    },
    
    rateOpinion: function(data){
        $(document).ready(function(){
            iTravel.getAJAXContent("/RateOpinion.action", "#j_opinion_useful_buttons", "POST", data);
        });
    },
    
    myPlaceWasHereAdd: function(data){
        iTravel.getAJAXContent("/setMyPlacesWasHere.action", "#my_places_list", "POST", data);
        for (var property in data) {
            var id = data[property];
            break;
        }
        $("#placeAdd_" + id).hide();
        $("#placeOpinion_" + id).show();
        $("#number_" + id).removeClass("green");
        $("#number_" + id).addClass("gray");
    },
    
    addMyPlace: function(data){
        iTravel.getAJAXContent("/addToMyPlacesBySearch.action", "#my_places_list", "POST", data);
        $("#j_map_2").html('');
    },
    
    deleteMyPlace: function(data){
        iTravel.getAJAXContent("/deleteMyPlace.action", "#my_places_list", "POST", data);
        $("#j_map_2").html('');
    },
    
	getAJAXPopup: function(source, popup, popup_inner, type, _data){
        var _type = (type) ? type : "GET";
		$(popup).dialog({
			height: "auto",
			modal: true,
			autoOpen: true,
			autoResize: true,
			bgiframe: true,
			width: 702,
			dialogClass: "b-popup-detail",
			position: "center",
			close: function(event, ui){
				$(popup).dialog('destroy');
				$(popup_inner).html('');				
			}
		});
        $(popup_inner).html('<div class="b-ajax-progress"><img alt="" src="/images/ajax.gif" /></div>');
        $.ajax({
            type: _type,
            url: source,
            data: _data,
            cache: false,
            //timeout: 5000, /* in milliseconds */
            dataType: "html",
            success: function(html, textStatus){                
				$(popup).dialog('option', 'position', 'top');
				$(popup_inner).html(html);
            },
            error: function(XMLHttpRequest, textStatus, errorThrown){
                $(popup_inner).html('<div class="b-ajax-error">' + localization.ru.error_text_default +'<br />' + textStatus + '<br />' + errorThrown + '</div>');               
            }
        });
    },
	
    addHotelReview: function(data){
		iTravelSocial.getAJAXPopup("/AddOpinion.action", "#j_new_review", "#j_new_review_inner", "POST", data);
    },
    
    editHotelReview: function(data){
		iTravelSocial.getAJAXPopup("/AddOpinion!edit.action", "#j_new_review", "#j_new_review_inner", "POST", data);
    },
    
    showHotelReviewPreview: function(data){
		iTravelSocial.getAJAXPopup("/AddOpinion!preview.action", "#j_new_preview", "#j_new_preview_inner", "POST", data);
    },
	
	timestamp: function() {
	  return '?ts_=' + new Date().getTime();
	}
};

var iTravelMaps = {
    initializeGoogleMap1: function(_id, page, bOverlay, selectedMarker){
        var sOpts = {};
        
        function MShadowOverlay(MOptions){
            MOptions = MOptions ? MOptions : {};
            sOpts = MOptions;
        }
        function iTravelZoomControl(){
        }
        function iTravelMapTypeControl(){
        }
		function iTravelPanoMapTypeControl(){
        }
		function iTravelWikiControl(){
        }
		
		// The allowed region which the whole map must be within
		var allowedBounds = new GLatLngBounds(new GLatLng(-89,-180), new GLatLng(86,180));
		
		function checkBounds() {
			// Perform the check and return if OK
			
			if (allowedBounds.contains(map.getCenter())) {
			  return;
			}			
			// It`s not OK, so find the nearest allowed point and move there
			var C = map.getCenter();
			var X = C.lng();
			var Y = C.lat();			
	
			var AmaxX = allowedBounds.getNorthEast().lng();
			var AmaxY = allowedBounds.getNorthEast().lat();
			var AminX = allowedBounds.getSouthWest().lng();
			var AminY = allowedBounds.getSouthWest().lat();	
			if (X < AminX) {X = AminX;}
			if (X > AmaxX) {X = AmaxX;}
			if (Y < AminY) {Y = AminY;}
			if (Y > AmaxY) {Y = AmaxY;}
			map.setCenter(new GLatLng(Y,X));
		}

	
        
        MShadowOverlay.prototype = new GOverlay();
        MShadowOverlay.prototype.initialize = function(map){
            this.map = map;
            this.img = document.createElement('IMG');
            this.img.style.position = 'absolute';
            if (sOpts.overlaySrc) {
                this.setSrc(sOpts.overlaySrc);
            }
            else {
                this.setSrc('/images/bg-google-map');
            }
            this.map.getPane(G_MAP_OVERLAY_LAYER_PANE).appendChild(this.img);
            this.center = this.map.getCenter();
            this.zoom = this.map.getZoom();			
            this.shiftX = 0;
            this.shiftY = 0;
            return this.img;
        };
        
        MShadowOverlay.prototype.redraw = function(force){
            var z = this.map.getZoom();
            if (this.zoom != z) {
                this.center = this.map.getCenter();
                this.zoom = this.map.getZoom();
                this.shiftX = this.deltaX;
                this.shiftY = this.deltaY;
                return;
            }
            //var proj = this.map.getCurrentMapType().getProjection();
            //var center = this.map.getCenter();
			
            //var px = proj.fromLatLngToPixel(center, z);					
            //var cPx = proj.fromLatLngToPixel(this.center, z);									
            //this.deltaX = px.x - cPx.x + this.shiftX;
            //this.deltaY = px.y - cPx.y + this.shiftY;				
			var neCoord = this.map.fromLatLngToDivPixel(this.map.getBounds().getNorthEast());
			var swCoord = this.map.fromLatLngToDivPixel(this.map.getBounds().getSouthWest());				
			this.deltaX = swCoord.x;			
            this.deltaY = neCoord.y;
			
            this.img.style.marginLeft = this.deltaX + 'px';
            this.img.style.marginTop = this.deltaY + 'px';
        };
        MShadowOverlay.prototype.remove = function(){
            this.img.parentNode.removeChild(this.img);
        };
        MShadowOverlay.prototype.copy = function(){
            return new MShadowOverlay();
        };
        MShadowOverlay.prototype.setSrc = function(_src){
            this.img.src = ($.browser.msie && $.browser.version == "6.0") ? _src + '.gif' : _src + '.png';
        };
        
		var wikiLayer = new GLayer("org.wikipedia.ru");
					
        iTravelZoomControl.prototype = new GControl();
        iTravelZoomControl.prototype.initialize = function(map){
            var container = document.createElement("div");
            container.id = "gmap_container_zoom";
			
            var zoomOut = document.createElement("a");
			$(zoomOut).click(function(){return false;}).text("-").attr("href","#").addClass("gmap-zoomout").addClass("zoom").attr("title",localization.ru.gmapZoomOut).attr("alt",localization.ru.gmapZoomOut);
            container.appendChild(zoomOut);
            GEvent.addDomListener(zoomOut, "click", function(){
                map.zoomOut();				
            });
			var zoomIn = document.createElement("a");
			$(zoomIn).click(function(){return false;}).text("+").attr("href","#").addClass("gmap-zoomin").addClass("zoom").attr("title",localization.ru.gmapZoomIn).attr("alt",localization.ru.gmapZoomIn);
            container.appendChild(zoomIn);
            GEvent.addDomListener(zoomIn, "click", function(){
                map.zoomIn();				
            });
            
            map.getContainer().appendChild(container);
            return container;
        };
        
        iTravelZoomControl.prototype.getDefaultPosition = function(){
            return new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(11, 11));
        };
        
        iTravelMapTypeControl.prototype = new GControl();
        iTravelMapTypeControl.prototype.initialize = function(map){
            var container = document.createElement("div");
            container.id = "gmap_container_type";
            
            var satellite = document.createElement("img");
            satellite.src = ($.browser.msie && $.browser.version == "6.0") ? "/images/btn-gmap-satellite.gif" : "/images/btn-gmap-satellite.png";
            satellite.alt = satellite.title = localization.ru.satellite;
            $(satellite).hide();
            GEvent.addDomListener(satellite, "click", function(){
                map.setMapType(G_HYBRID_MAP);
                $(satellite).hide();
                $(normalMap).show();
            });
            var normalMap = document.createElement("img");
            normalMap.src = ($.browser.msie && $.browser.version == "6.0") ? "/images/btn-gmap-map.gif" : "/images/btn-gmap-map.png";
            normalMap.alt = normalMap.title = localization.ru.map;
            GEvent.addDomListener(normalMap, "click", function(){
                map.setMapType(G_NORMAL_MAP);
                $(satellite).show();
                $(normalMap).hide();
            });
            
            container.appendChild(satellite);
            container.appendChild(normalMap);
            map.getContainer().appendChild(container);
            return container;
        }
        iTravelMapTypeControl.prototype.getDefaultPosition = function(){
            return new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(8, 11));
        }
        
		iTravelPanoMapTypeControl.prototype = new GControl();
        iTravelPanoMapTypeControl.prototype.initialize = function(map){
            var container = document.createElement("div");
            container.id = "gmap_container_pano";
            var me = this;
			
            var panoramio = document.createElement("img");			
            panoramio.src = ($.browser.msie && $.browser.version == "6.0") ? "/images/btn-gmap-pano.gif" : "/images/btn-gmap-pano.png";
            panoramio.alt = panoramio.title = localization.ru.panoramio;
            GEvent.addDomListener(panoramio, "click", function(){
                $(panoramio).hide();
				$(panoramioPressed).show();
				if (me.panoLayer) {
			        me.panoLayer.enable();
			    } else {
					var opt_opts = {};
					//page = 'tour2';
					// add other big maps
					if (page == "tour2") {
						$.extend(opt_opts, {to: "40", size: "small", popup: "large"});
					}
					me.panoLayer = new PanoramioLayer(map, opt_opts);
					me.panoLayer.enable();
			    }
            });

            var panoramioPressed = document.createElement("img");
			// fix button image
            panoramioPressed.src = ($.browser.msie && $.browser.version == "6.0") ? "/images/btn-gmap-pano-pressed.gif" : "/images/btn-gmap-pano-pressed.png";
            panoramioPressed.alt = panoramioPressed.title = localization.ru.panoramio;
			$(panoramioPressed).hide();
            GEvent.addDomListener(panoramioPressed, "click", function(){
                $(panoramioPressed).hide();
				$(panoramio).show();
				if (me.panoLayer) {
					if (me.panoLayer.getEnabled()) {
				        me.panoLayer.disable();
					}
			    }
            });

            container.appendChild(panoramio);
            container.appendChild(panoramioPressed);
            map.getContainer().appendChild(container);
            return container;
        }
        iTravelPanoMapTypeControl.prototype.getDefaultPosition = function(){
            return new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(78, 11));
        }
		
		iTravelWikiControl.prototype = new GControl();
        iTravelWikiControl.prototype.initialize = function(map){
            var container = document.createElement("div");
            container.id = "gmap_container_wiki";
            var me = this;
			
            var wiki = document.createElement("img");			
            wiki.src = ($.browser.msie && $.browser.version == "6.0") ? "/images/btn-gmap-wiki.gif" : "/images/btn-gmap-wiki.png";
            wiki.alt = wiki.title = localization.ru.wiki;
            GEvent.addDomListener(wiki, "click", function(){
                $(wiki).hide();
				$(wikiPressed).show();
				map.addOverlay(wikiLayer);
            });

            var wikiPressed = document.createElement("img");
			// fix button image
            wikiPressed.src = ($.browser.msie && $.browser.version == "6.0") ? "/images/btn-gmap-wiki-pressed.gif" : "/images/btn-gmap-wiki-pressed.png";
            wikiPressed.alt = wikiPressed.title = localization.ru.panoramio;
			$(wikiPressed).hide();
            GEvent.addDomListener(wikiPressed, "click", function(){
                $(wikiPressed).hide();
				$(wiki).show();
				map.removeOverlay(wikiLayer);
            });

            container.appendChild(wiki);
            container.appendChild(wikiPressed);
            map.getContainer().appendChild(container);
            return container;
        }
        iTravelWikiControl.prototype.getDefaultPosition = function(){
            return new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(148, 11));
        }
        
        if (GBrowserIsCompatible()) {
            // Display the map, with some controls and set the initial location
            map = new google.maps.Map2(document.getElementById(_id));
            map.setMapType(G_HYBRID_MAP);
            map.addControl(new iTravelZoomControl());
            map.addControl(new iTravelMapTypeControl());
			map.addControl(new iTravelPanoMapTypeControl());
			map.addControl(new iTravelWikiControl());
			
            
            //Map behavior for Home page
            if (page == "home") {
                //Analyzing
                iTravelMaps.analyzeHomeState();
            }
            
            if (page == "tour1") {
                //Analyzing
                iTravelMaps.analyzeTour1State();
            }
            if (page == "tour2") {
                iTravelMaps.analyzeTour2State(selectedMarker);
            }
            if (page == "tour3") {
                iTravelMaps.analyzeTour3State();
            }
            if (page == "myplaces") {
                iTravelMaps.analyzeMyPlaces1State();
            }
            if (page == "countries1") {
                iTravelMaps.analyzeCountries1State();
            }
            if (page == "countries2") {
                iTravelMaps.analyzeCountries2State();
            }
            if (page == "countries3") {
                iTravelMaps.analyzeCountries3State(selectedMarker);
            }
            if (page == "countries4") {
                iTravelMaps.analyzeCountries4State(selectedMarker);
            }
            
            iTravelMaps.mapShadow = new MShadowOverlay({
                overlaySrc: bOverlay
            });
            map.addOverlay(iTravelMaps.mapShadow);
			GEvent.addListener(map, "move", function() {													 
				checkBounds();
			});
			// ====== Restricting the range of Zoom Levels =====
			// Get the list of map types      
			var mt = map.getMapTypes();
			// Overwrite the getMinimumResolution() and getMaximumResolution() methods
			for (var i=0; i<mt.length; i++) {
				mt[i].getMinimumResolution = function() {return 2;}		
			}


        }
        else {
            // display a warning if the browser was not compatible
            alert("Sorry, the Google Maps is not available");
        }
    },
    
    mapShadow: null,
    homeState: 0,
    countryState: "",
	
	correctMapZoom : function (_map,_zoom) {
		setTimeout(function(){
			var latlng = _map.getCenter();
			var zoom = _zoom;
			_map.setMapType(G_SATELLITE_MAP); //remove after Google fix issue
			_map.getCurrentMapType().getMaxZoomAtLatLng(latlng, function(response) {
			    zoom = (zoom<response['zoom'])?zoom:response['zoom'];
			    if (response && response['status'] == G_GEO_SUCCESS) { _map.setCenter(latlng, zoom);  }
		  	});		
			_map.setMapType(G_HYBRID_MAP); //remove after Google fix issue
		},1000);		
	},
	setMapZoomLogic : function (map,zoom,latlngbounds,markersLength) {
		var _zoom = (!(markersLength==1&&zoom!=null))?map.getBoundsZoomLevel(latlngbounds):zoom;						
        map.setCenter(latlngbounds.getCenter(), _zoom);
		iTravelMaps.correctMapZoom(map,_zoom);
	},
    
    analyzeCountries1State: function(){
        var latlngbounds = new GLatLngBounds();
		var zoom = null;
		var markersLength = Object.size(countriesLinks);
        jQuery.each(countriesLinks, function(i, val){
            //hotel-hash
            var opts = {};
            opts.country = countriesNames[i];
            opts.url = val;
			zoom = opts["zoom"];
			iTravelMaps.addMarker(map, countriesMaps[i]["lat"], countriesMaps[i]["long"], "green", "country-link", opts);
            latlngbounds.extend(new GLatLng(countriesMaps[i]["lat"], countriesMaps[i]["long"]));
        });
		iTravelMaps.setMapZoomLogic(map,zoom,latlngbounds,markersLength);
        map.enableScrollWheelZoom();
    },
    
    analyzeCountries2State: function(){
        var latlngbounds = new GLatLngBounds();
		var zoom = null;
		var markersLength = 0;
        if (iTravelMaps.countryState == "") {
			markersLength = Object.size(country2resortLinks);
            jQuery.each(country2resortLinks, function(i, val){
                //hotel-hash
                var opts = {};
                opts.country = countriesNames[i];
                opts.countryId = i;
				zoom = countriesMaps[i]["zoom"];
				iTravelMaps.addMarker(map, countriesMaps[i]["lat"], countriesMaps[i]["long"], "green", "country-link2", opts);
                latlngbounds.extend(new GLatLng(countriesMaps[i]["lat"], countriesMaps[i]["long"]));
            });
        }
        else {
			markersLength = (country2resortLinks[iTravelMaps.countryState]).length;
            jQuery.each(country2resortLinks[iTravelMaps.countryState], function(){
                //hotel-hash
                var resortInfo = resortsMaps[this];
                var opts = {};
                opts.resort = resortsNames[this];
                opts.url = resortsLinks[this];
				zoom = resortInfo["zoom"];
				iTravelMaps.addMarker(map, resortInfo["lat"], resortInfo["long"], "yellow", "resort-link2", opts);
                latlngbounds.extend(new GLatLng(resortInfo["lat"], resortInfo["long"]));
            });
        }
        iTravelMaps.setMapZoomLogic(map,zoom,latlngbounds,markersLength);
        map.enableScrollWheelZoom();
    },
    
    analyzeCountries3State: function(selectedMarker){
        var latlngbounds = new GLatLngBounds();
		var zoom = null;
		var markersLength = country2resortLinks[selectedMarker].length;
        for (var i = 0; i < markersLength; i++) {
            var resortId = country2resortLinks[selectedMarker][i];
            var opts = {};
            opts.text = resortsNames[resortId];
			opts.zoom = resortsMaps[resortId]["zoom"];
			opts.weather = getTemp(resortsMaps[resortId].rp5);
            iTravelMaps.addMarker(map, resortsMaps[resortId]["lat"], resortsMaps[resortId]["long"], "yellow", "resorts", opts);
            latlngbounds.extend(new GLatLng(resortsMaps[resortId]["lat"], resortsMaps[resortId]["long"]));
        }
        iTravelMaps.setMapZoomLogic(map,zoom,latlngbounds,markersLength);
        map.enableScrollWheelZoom();
    },
    
    analyzeCountries4State: function(selectedMarker){
        var latlngbounds = new GLatLngBounds();
		var zoom = (defaultHotelZoom)?defaultHotelZoom:15;
		var markersLength = 0;
        jQuery.each(baseHotelMaps, function(i, val){
            if (val["lat"] != "" && val["long"] != "") {
                var opts = {};
                opts.text = val.text;
                iTravelMaps.addMarker(map, val["lat"], val["long"], parseInt(i) + 1, "resorts", opts);
                latlngbounds.extend(new GLatLng(val["lat"], val["long"]));
				markersLength += 1;
            }
        });        
        iTravelMaps.setMapZoomLogic(map,zoom,latlngbounds,markersLength);
        map.enableScrollWheelZoom();
    },
    
    analyzeMyPlaces1State: function(){
        var latlngbounds = new GLatLngBounds();
        var zoom = null;
		var markersLength = 0;
		if (Object.size(myPlacesHotelMaps)>0) {
			zoom = (defaultHotelZoom)?defaultHotelZoom:15;
			jQuery.each(myPlacesHotelMaps, function(i, val){
				if (val["lat"] != "" && val["long"] != "") {
					var opts = {};
					opts.text = val.text;
					iTravelMaps.addMarker(map, val["lat"], val["long"], "", "hotel", opts);
					latlngbounds.extend(new GLatLng(val["lat"], val["long"]));
					markersLength += 1;
				}
			});
		}
		if (Object.size(myPlacesCountryMaps)>0) {
			for (var i = 0; i < myPlacesCountryMaps.length; i++) {
				var countryCode = myPlacesCountryMaps[i];
				if (countriesMaps[countryCode]) {
					var countryCoord = countriesMaps[countryCode];
					var opts = {};
					opts.text = countriesNames[countryCode];
					zoom = countryCoord["zoom"];
					opts.weather = getTemp(countryCoord.rp5);
					iTravelMaps.addMarker(map, countryCoord["lat"], countryCoord["long"], "green", "resorts", opts);
					latlngbounds.extend(new GLatLng(countryCoord["lat"], countryCoord["long"]));
					markersLength += 1;
				}
			}
		}
		if (Object.size(myPlacesResortMaps)>0) {
			for (var i = 0; i < myPlacesResortMaps.length; i++) {
				var resortId = myPlacesResortMaps[i];
				if (resortsMaps[resortId]) {
					var resortCoord = resortsMaps[resortId];
					var opts = {};
					opts.text = resortsNames[resortId];
					zoom = resortCoord["zoom"];
					opts.weather = getTemp(resortCoord.rp5);
					iTravelMaps.addMarker(map, resortCoord.lat, resortCoord["long"], "yellow", "resorts", opts);
					latlngbounds.extend(new GLatLng(resortCoord.lat, resortCoord["long"]));
					markersLength += 1;
				}
			}
		}        
        iTravelMaps.setMapZoomLogic(map,zoom,latlngbounds,markersLength);
        map.enableScrollWheelZoom();
    },
    
    analyzeTour1State: function(){
        var latlngbounds = new GLatLngBounds();
        var count = 1;
		var zoom = (defaultHotelZoom)?defaultHotelZoom:15;
		var markersLength = 0;
        jQuery.each(toursMaps, function(i, val){
            if (val["lat"] != "" && val["long"] != "") {
                //hotel-hash
                var opts = {};
                opts.title = val.hotelName;
                opts.tourPrice = val.tourPrice;				
                opts.hash = i.replace("hid-","");				
                iTravelMaps.addMarker(map, val["lat"], val["long"], count, "hotel-hash", opts);
                latlngbounds.extend(new GLatLng(val["lat"], val["long"]));
				markersLength += 1;
            }
            count += 1;
        });        
        iTravelMaps.setMapZoomLogic(map,zoom,latlngbounds,markersLength);
    },
    
    analyzeTour2State: function(selectedMarker){
        var latlngbounds = new GLatLngBounds();
        var count = 1;
        var _marker = null;
		var zoom = (defaultHotelZoom)?defaultHotelZoom:15;
		var markersLength = 0;
        jQuery.each(toursMaps, function(i, val){
            if (val["lat"] != "" && val["long"] != "") {
                var opts = {};
                opts.tourPrice = val.tourPrice;
                opts.hotelImg = val.hotelImg;
                opts.hotelName = val.hotelName;
                opts.country = countriesNames[val.countryCode];
                opts.countryCode = val.countryCode;
                opts.resortName = resortsNames[val.resortId];
                opts.resortId = val.resortId;
                opts.hotelCategory = val.hotelCategory;
                opts.tourId = i.replace("hid-","");
                opts.masterTourId = val.tourId;
                opts.isTour = val.isTour;
                opts.isHotel = val.isHotel;
                opts.leisure = val.leisure;
                if (count == selectedMarker) {
                    opts.markerToReturn = true;
                };
                var returned = iTravelMaps.addMarker(map, val["lat"], val["long"], count, "hotel-card", opts);
                if (returned) {
                    _marker = returned;
                };
                latlngbounds.extend(new GLatLng(val["lat"], val["long"]));
				markersLength += 1;
            }
            count += 1;
        });
        iTravelMaps.setMapZoomLogic(map,zoom,latlngbounds,markersLength);
		if (selectedMarker) {
            map.setCenter(_marker.marker.getPoint());
            _marker.marker.openInfoWindow(_marker.popupBody);
        };
        map.enableScrollWheelZoom();
    },
    
    analyzeTour3State: function(){
        var latlngbounds = new GLatLngBounds();
		var markersLength = Object.size(hotel);
		var zoom = (defaultHotelZoom)?defaultHotelZoom:15;
		var markersLength = 0;
        jQuery.each(hotel, function(i, val) {
          if (val["lat"] != "" && val["long"] != "") {		
            var opts = {};
            opts.text = val.text;			
            iTravelMaps.addMarker(map, val["lat"], val["long"], "", "hotel", opts);
            latlngbounds.extend(new GLatLng(val["lat"], val["long"]));
			markersLength += 1;
		  }
        });
        iTravelMaps.setMapZoomLogic(map,zoom,latlngbounds,markersLength);
        map.enableScrollWheelZoom();
    },
    
    analyzeHomeState: function(){
        if ($("#b_tab1_to").val() == "0") {
            iTravelMaps.homeState = 0;
            iTravelMaps.processHomeState0();
        }
        else {
            iTravelMaps.homeState = 1;
            iTravelMaps.processHomeState1();
        }
    },
    
    processHomeState0: function(){
        var selectedCity = $("#b_tab1_from_city").val();
        var selectedCountry = $("#b_tab1_to").val();
        var latlngbounds = new GLatLngBounds();
        var countries = {};
		var zoom = null;
        if (selectedCity == "NULL") { //no city selected
            jQuery.each(airport2country2resort, function(i, vali){
                jQuery.each(airport2country2resort[i], function(j, valj){
                    if (j != "0") {
                        countries[j] = countriesMaps[j];
                    }
                });
            });
        }
        else {
            jQuery.each(airport2country2resort[selectedCity], function(j, valj){
                if (j != "0") {
                    countries[j] = countriesMaps[j];
                }
            });
        }
		var markersLength = Object.size(countries);
        jQuery.each(countries, function(i, val){
            var opts = {};
            opts.title = countriesNames[i];
            var minPrice = minCountriesPrices[i] || "0";
            opts.minPrice = localization.ru.priceFrom + iTravel.formatPriceDigits(minPrice) + ' ' + localization.ru.RUR;
            opts.weather = val.weather;
            opts.text = val.text;
            opts.countryId = i;
			zoom = val.zoom;
            opts.flightTime = (selectedCity == "NULL") ? flightTime[i][countriesMaps[i]["origin"]] : flightTime[i][selectedCity];
            opts.weather = getTemp(val["rp5"]);
            iTravelMaps.addMarker(map, val["lat"], val["long"], "green", "country", opts);
            latlngbounds.extend(new GLatLng(val["lat"], val["long"]));
        });
        iTravelMaps.setMapZoomLogic(map,zoom,latlngbounds,markersLength);
    },
    
    processHomeState1: function(){
        var selectedCity = $("#b_tab1_from_city").val();
        var selectedCountry = $("#b_tab1_to").val();
        var latlngbounds = new GLatLngBounds();
		var zoom = null;
        var markersLength = (airport2country2resort[selectedCity][selectedCountry]).length;
        jQuery.each(airport2country2resort[selectedCity][selectedCountry], function(){
            if (this != "0") {
                var opts = {};
                var val = resortsMaps[this];
                opts.title = resortsNames[this];
                var minPrice = minResortsPrices[this] || "0";
                opts.minPrice = localization.ru.priceFrom + iTravel.formatPriceDigits(minPrice) + ' ' + localization.ru.RUR;
                opts.weather = val.weather;
                opts.text = val.text;
				zoom = val.zoom;
                opts.resortId = this;
                if (val.rp5 != null)
                	opts.weather = getTemp(val.rp5);
                iTravelMaps.addMarker(map, val["lat"], val["long"], "yellow", "resort", opts);
                latlngbounds.extend(new GLatLng(val["lat"], val["long"]));
            }
        });		
		iTravelMaps.setMapZoomLogic(map,zoom,latlngbounds,markersLength);
    },
    
    addMarker: function(map, lat, lng, marker, popup, opts){
    	var _type = (marker) ? marker : "green";
        var customIcon = new GIcon();
        customIcon.image = '/images/markers-' + _type + '/image.png';
        customIcon.shadow = '/images/markers-' + _type + '/shadow.png';
        customIcon.iconSize = new GSize(20, 34);
        customIcon.shadowSize = new GSize(37, 34);
        customIcon.iconAnchor = new GPoint(10, 34);
        customIcon.infoWindowAnchor = new GPoint(10, 0);
        customIcon.printImage = '/images/markers-' + _type + '/printImage.gif';
        customIcon.mozPrintImage = '/images/markers-' + _type + '/mozPrintImage.gif';
        customIcon.printShadow = '/images/markers-' + _type + '/printShadow.gif';
        customIcon.transparent = '/images/markers-' + _type + '/transparent.png';
        customIcon.imageMap = [13, 0, 15, 1, 16, 2, 17, 3, 18, 4, 18, 5, 19, 6, 19, 7, 19, 8, 19, 9, 19, 10, 19, 11, 19, 12, 19, 13, 18, 14, 18, 15, 17, 16, 16, 17, 15, 18, 14, 19, 14, 20, 13, 21, 13, 22, 12, 23, 12, 24, 12, 25, 12, 26, 11, 27, 11, 28, 11, 29, 11, 30, 11, 31, 11, 32, 11, 33, 8, 33, 8, 32, 8, 31, 8, 30, 8, 29, 8, 28, 8, 27, 8, 26, 7, 25, 7, 24, 7, 23, 6, 22, 6, 21, 5, 20, 5, 19, 4, 18, 3, 17, 2, 16, 1, 15, 1, 14, 0, 13, 0, 12, 0, 11, 0, 10, 0, 9, 0, 8, 0, 7, 0, 6, 1, 5, 1, 4, 2, 3, 3, 2, 4, 1, 6, 0];
        var point = new GLatLng(lat, lng);
        var markerOptions;
        var popupBody;
        if (popup == "country") {
            markerOptions = {
                icon: customIcon,
                title: opts.title + " (" + opts.minPrice + ")"
            };
            popupBody = iTravelMaps.generateCountryHtml(opts);
            var marker = new GMarker(point, markerOptions);
            GEvent.addListener(marker, "click", function(){
                marker.openInfoWindowHtml(popupBody);
            });
            map.addOverlay(marker);
        }
        
        if (popup == "resorts") {
            markerOptions = {
                icon: customIcon,
                title: opts.text
            };
            var marker = new GMarker(point, markerOptions);
            map.addOverlay(marker);
        }
        
        if (popup == "hotel") {
            var redIcon = new GIcon(G_DEFAULT_ICON);
            redIcon.image = "http://www.google.com/mapfiles/marker.png";
            markerOptions = {
                icon: redIcon,
                title: opts.text
            };
            var marker = new GMarker(point, markerOptions);
            map.addOverlay(marker);
        }
        
        if (popup == "resort") {
            markerOptions = {
                icon: customIcon,
                title: opts.title + " (" + opts.minPrice + ")"
            };
            
            popupBody = iTravelMaps.generateResortHtml(opts);
            var marker = new GMarker(point, markerOptions);
            GEvent.addListener(marker, "click", function(){
                marker.openInfoWindowHtml(popupBody);
            });
            map.addOverlay(marker);
        }
        
        if (popup == "hotel-card") {
            markerOptions = {
                icon: customIcon,
                title: (opts.tourPrice != "") ? (opts.hotelName + " (" + opts.tourPrice + ")") : opts.hotelName
            };
            
            popupBody = iTravelMaps.generateHotelHtml(opts);
            var marker = new GMarker(point, markerOptions);
            //GEvent.addListener(marker, "click", function() {
            marker.bindInfoWindow(popupBody);
            //});
            map.addOverlay(marker);
            if (opts.markerToReturn) {
                return {
                    marker: marker,
                    popupBody: popupBody
                };
            }
            else {
                return false;
            }
        }
        
        if (popup == "hotel-hash") {
            markerOptions = {
                icon: customIcon,
                title: (opts.tourPrice != "") ? (opts.title + " (" + opts.tourPrice + ")") : opts.title
            };
            var marker = new GMarker(point, markerOptions);
            GEvent.addListener(marker, "click", function(){
                location.hash = "tour-" + opts.hash;
            });
            map.addOverlay(marker);
        }
        
        if (popup == "country-link") {
            markerOptions = {
                icon: customIcon,
                title: opts.country
            };
            var marker = new GMarker(point, markerOptions);
            GEvent.addListener(marker, "click", function(){
                location.href = opts.url;
            });
            map.addOverlay(marker);
        }
        if (popup == "country-link2") {
            markerOptions = {
                icon: customIcon,
                title: opts.country
            };
            var marker = new GMarker(point, markerOptions);
            GEvent.addListener(marker, "click", function(){
                iTravelMaps.countryState = opts.countryId;
                iTravelMaps.initializeGoogleMap1("j_map_1", "countries2", "/images/bg-google-map-5");
            });
            map.addOverlay(marker);
        }
        if (popup == "resort-link2") {
            markerOptions = {
                icon: customIcon,
                title: opts.resort
            };
            var marker = new GMarker(point, markerOptions);
            GEvent.addListener(marker, "click", function(){
                location.href = opts.url;
            });
            map.addOverlay(marker);
        }
    },
    
    generateHotelHtml: function(opts){
        var html = '';
        var onclickText = '';
        var flag = false;
        
        html += '<div class="b-hotel-popup">';
        html += '<img class="picture" src="' + opts.hotelImg + '" /><div class="right-section">';
        html += '<span class="price">' + opts.tourPrice + '</span><span class="hotel-name">' + opts.hotelName + '</span>';
        html += '<div class="g-clear"></div><div class="hotel-location">' + opts.country + ', <a>' + opts.resortName + '</a></div>';
        html += '<span class="hotel-stars stars-' + opts.hotelCategory + '">&nbsp;</span><div class="g-clear"></div>';

        if (opts.leisure.length > 0) {
          html += '<div class="hotel-parameter">';
          for (var i = 0; i < opts.leisure.length; i++) {
            html += '<span class="ico-hotel-service ' + opts.leisure[i] + '">&nbsp;</span>';
          }
	  html += '</div>';
        }

        if (opts.isTour) {
            for (var i = 0; i < addedTours.length; i++) {
                if (addedTours[i] == opts.masterTourId) {
                    flag = true;
                }
            }
            html += '<div><a href="#tour-' + opts.tourId + '">' + localization.ru.tourDetails + '</a></div>';
            html += '<div class="links" id="tour_' + opts.masterTourId + '_map">';
            html += '<a id="add" class="add-to-my-tours" onclick="';
            
            html += 'iTravel.myTourAdd({\'tour.tourId\':' + opts.masterTourId + ',\'tour.hotelId\':' + opts.tourId +
            ',\'tour.hotelName\':\'' +
            opts.hotelName +
            '\',\'tour.rank\':' +
            opts.hotelCategory +
            ',\'tour.countryCode\':\'' +
            opts.countryCode +
            '\',\'tour.resortId\':' +
            opts.resortId +
            '}); return false;';
            
            html += '" href="#"';
            if (flag) 
                html += ' style="display: none"';
            html += '>' + localization.ru.addToMyTour + '</a>';
            html += '<a id="added" href="#" onclick="return false;" class="add-to-my-tours added"';
            if (!flag) 
                html += ' style="display: none"';
            html += '>' + localization.ru.addedToMyTour + '</a>';
            
            onclickText = 'iTravel.getTourDetail({tourId:' + opts.masterTourId + ',hotelId:' + opts.tourId + ',showHotel:false});return false;';
        }
        
        if (opts.isHotel) {
            for (var i = 0; i < addedHotels.length; i++) {
                if (addedHotels[i] == opts.tourId) {
                    flag = true;
                }
            }
            html += '<div><a href="#tour-' + opts.tourId + '">' + localization.ru.hotelDetails + '</a></div>';
            html += '<div class="links" id="hotel_' + opts.tourId + '_map">';
            html += '<a id="add" class="add-to-my-tours" onclick="';
            
            
            html += 'iTravel.myHotelAdd({\'hotel.hotelId\':' + opts.tourId + ',\'hotel.hotelName\':\'' + opts.hotelName + '\',\'hotel.rank\':' +
            opts.hotelCategory +
            ',\'hotel.countryCode\':\'' +
            opts.countryCode +
            '\',\'hotel.resortId\':' +
            opts.resortId +
            '}); return false;';
            
            html += '" href="#"';
            if (flag) 
                html += ' style="display: none"';
            html += '>' + localization.ru.addToMyHotel + '</a>';
            html += '<a id="added" href="#" onclick="return false;" class="add-to-my-tours added"';
            if (!flag) 
                html += ' style="display: none"';
            html += '>' + localization.ru.addedToMyHotel + '</a>';
            
            onclickText = 'location.href=\'/getHotelDetails.action?hotelId=' + opts.tourId + '\'';
        }
        
        html += '<a onclick="' + onclickText + '" href="#" class="g-btn-green-2"><span>' + localization.ru.selectBtn + '</span></a>';
        html += '<div class="g-clear"></div></div></div><div class="g-clear"></div></div>';
        return html;
    },
    
    generateCountryHtml: function(opts){
    	var html = "";
        html += '<div class="b-country-popup"><table>';
        html += '<tr><td class="country left">' + opts.title + '</td><td class="right"><span class="b-pseudo-input"><span>' + opts.minPrice + '</span></span></td></tr>';
        if (opts.weather!=null)
        	html += '<tr><td class="left">' + localization.ru.weather + '</td><td class="right"><span class="b-pseudo-input"><span>' + opts.weather + '</span></span></td></tr>';
        html += '<tr><td class="left">' + localization.ru.flightTime + '</td><td class="right"><span class="b-pseudo-input"><span>' + opts.flightTime + '</span></span></td></tr>';
        html += '</table>';
        html += '<div class="text">' + opts.text + '</div>';
        html += '<div class="button"><a class="g-btn-green-2" href="#" onclick="iTravelMaps.setCountryHome(\'' + opts.countryId + '\'); ;return false;"><span>' + localization.ru.selectBtn + '</span></a><div class="g-clear">&nbsp;</div></div>';
        html += '</div>';
        return html;
    },
    
    setCountryHome: function(countryId){
        if ($("#b_tab1_from_city").val() == "NULL") {
            $("#b_tab1_from_city").val(countriesMaps[countryId].origin).selectmenu('destroy').selectmenu({
                style: 'dropdown'
            }).change();
            $("#b_tab1_to").val(countryId).selectmenu('destroy').selectmenu({
                style: 'dropdown'
            }).change();
        }
        else {
            $("#b_tab1_to").val(countryId).selectmenu('destroy').selectmenu({
                style: 'dropdown'
            }).change();
        }
    },
    
    generateResortHtml: function(opts){
        var html = "";
        html += '<div class="b-country-popup"><table>';
        html += '<tr><td class="country left">' + opts.title + '</td><td class="right"><span class="b-pseudo-input"><span>' + opts.minPrice + '</span></span></td></tr>';
        if (opts.weather!=null)
        	html += '<tr><td class="left">' + localization.ru.weather + '</td><td class="right"><span class="b-pseudo-input"><span>' + opts.weather + '</span></span></td></tr>';
        html += '</table>';
        html += '<div class="text">' + opts.text + '</div>';
        html += '<div class="button"><a class="g-btn-green-2" href="#" onclick="iTravelMaps.setResortHome(\'' + opts.resortId + '\'); ;return false;"><span>' + localization.ru.selectBtn + '</span></a><div class="g-clear">&nbsp;</div></div>';
        html += '</div>';
        return html;
    },
    
    setResortHome: function(resortId){
        $("#b_tab1_resort").val(resortId).selectmenu('destroy').selectmenu({
            style: 'dropdown'
        }).change();
    },
    
    switchBlocks: function(elToHide, elToShow){
        $(elToHide).hide();
        $(elToShow).show();
    }
};



function fixPNG(element, method) {
 if (/MSIE (5\.5|6).+Win/.test(navigator.userAgent)) {
  var src;
  if (element.tagName=='IMG'||element.tagName=='INPUT') {
   if (/\.png$/.test(element.src)) {
    src = element.src;
    element.src = "/images/blank.gif";
   }
  } else {
   src = element.currentStyle.backgroundImage.match(/url\("(.+\.png)"\)/i);
   if (src) {
    src = src[1];
    element.runtimeStyle.backgroundImage="none";
   }
  }
  
  if (method) {
    if (src) element.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + src + "',sizingMethod='scale')";
  } else {
    if (src) element.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + src + "',sizingMethod='crop')";
  }
 }
};

$(document).ready(function() {
	$("div.country.hotelsCatalog ul li b.g-green").each(function(i, e)
			{
			 var temp = getTemp(e.id);
			 if (temp == null)
				 return;
			 $(e).html( temp )
			})
	});

$(document).ready(function() {
	$("div.country.hotelsCatalogSearch ul li b.g-green").each(function(i, e)
			{
			 var rp5Id = resortsMaps[e.id]["rp5"];
			 if (rp5Id == null)
				 return;
			 $(e).html( getTemp(rp5Id) )
			})
	});

function mergeObject(dest,source,actionParamName,ignore) {
	if(!dest) {
		dest = {};
	}	
	
	$.each(source, function(index, value) {
		if(source[index] != null && ($.inArray(index, ignore) == -1)) {
			if(actionParamName) {
				dest[actionParamName+"."+index] = value;
			} else {
				dest[index] = value;
			}
		}
		   
	});

	
	
//	var i;
//	for (i in source) {
//		if(i && source[i] && ($.inArray(i, ignore) == -1)) {
//			if(actionParamName) {
//				dest[actionParamName+"."+i] = source[i];
//			} else {
//				dest[i] = source[i];
//			}
//		}
//	}
	
	return dest;
}
	
function getTemp(id) {
	if (window.weather != undefined) {
	var wthr = weather[id];
	if (wthr!=null)
		return wthr.dayTemp;
	}
	return null;
}

function getMinYear4Chld(_currentDate,_age){
	return _currentDate.getFullYear() - _age - 1;
}
