try {
  document.execCommand('BackgroundImageCache', false, true);
} catch(e) {}

/**
 * static object that handles page logic
 */
var Logic = function($){
	/**
	 * private methods and variables
	 */
	var priv = {
		debug	: (resources.debugmode == 'true'),		//enables/disables the error logging
		debugSeverity : 10,	//level of error logging
		console	: $("<ul>").addClass("debug-console"),
				
		initConsole	: function(){
			//if the console has not yet been added to the document, do so now
			if(!priv.console.parentNode){
				$("body").append(priv.console);
			} 
		},
		
		bindEvents : function(){
		    // footer logos
		    $('#logos').bind('click', function(){
		        location.href = resources.path_prefix + '/overbellavakanza.aspx?option=sgranvrcal';
		    });
		
		    // submenus
            $('ul.sub-menu li').hover(
                function(evt){
			        $(this).addClass('hover');
                },
                function(evt){
                    $(this).removeClass('hover');
                }
            ).bind('click', function() {
                location.href = $('a', this).attr('href');
                return false;
            });
			
			//$('#destinations').menu({opener : $('#header li.villas a.menu-button'), position : "bottom", speed : 120});
			
			// travelers select/edit link
			$('#edit-travelers').bind('click', function(){
			    travelers.showTravelersPopup();
			});
			
			$("#ribbon-tag div").bind("click",
		        function(evt){
		            Lightbox.Show(585, 'pSendReaction');
		            return false;
		        }
		    );
		    
		    $("#ribbon-tag div").hover( function() { $(this).addClass('ribbon-hover');}, function() { $(this).removeClass('ribbon-hover'); });
			
			// collapsing of information on "Veel gestelde vragen" page
			if(location.href.indexOf('veelgesteldevragen') != -1){
			    $('a + br + div').each(function(){
			        var $div = $(this);
			        $div.prev().prev().bind('click', function(evt){
			            //close all others
			            $('a + br + div').not($div).hide().removeClass("selected");
			            $(this).siblings("a").andSelf().removeClass("selected");
			            
			            //select this item
			            //scope problem:
			            $self = $(this);
			            $div.toggle(100, function(){
			                if($div.is(":visible")){
			                    $self.addClass("selected");
			                    $div.addClass("selected");   
			                }
			            });
			            
			        });
			    });
			}
			
			//make sure that the links do not have dots around them after clicking
			if($.browser.msie){
			    $("a").bind("focus", function(evt){this.blur();});
			}
        }		
	};
	
	/**
	 * public methods
	 */
	return {		
		/**
		 * initializes the page logic
		 * to be called on $(document).ready
		 */
		OnReady	: function(){
			//add trim method to the string object
			String.prototype.trim = function() {return this.replace(/^\s+|\s+$/g,"");}
			String.prototype.stripTags = function() {return this.replace(/<(.|\n)*?>/g, "");}
			String.format = function()
            {
                if( arguments.length == 0 )
                    return null;

                var str = arguments[0];
                if(str != null)
                {
                    for(var i=1;i<arguments.length;i++)
                    {
                        var re = new RegExp('\\{' + (i-1) + '\\}','gm');
                        str = str.replace(re, arguments[i]);
                    }
            
                    return str;
                }
            }            
            
            if(typeof(Home) != "undefined"){
                Home.OnReady();
            }
            if(typeof(Accommodation) != "undefined"){
                Accommodation.OnReady();
			}
			if(typeof(Search) != "undefined"){
                Search.OnReady();
			}
			if(typeof(bookingLogic) != "undefined"){
			    bookingLogic.OnReady();
			}
			if(typeof(travelers) != "undefined"){
				travelers.OnReady();
			}
			if(typeof(personalItems) != "undefined"){
			    personalItems.Load('alreadyviewed');
			    personalItems.Load('favorites');
				personalItems.ShowItemLinks();
			}
			if(typeof(ImagePreloader) != "undefined"){
				//add the images to preload
				ImagePreloader.Add(resources.path_prefix + '/images/master/nav_bg_grey_1.png', true);
				ImagePreloader.Add(resources.path_prefix + '/images/master/nav_bg_grey_2.png', true);
				ImagePreloader.Add(resources.path_prefix + '/images/master/nav_bg_champ.png', true);
				ImagePreloader.Add(resources.path_prefix + '/images/master/bg-destmenu-ul.png', true);
				ImagePreloader.Add(resources.path_prefix + '/images/master/bg-destmenu-footer.gif', true);
			}
			
			priv.bindEvents();
			
			//firefox select all "issue"
			if($.browser.mozilla){
			    $("body").bind("mousedown", function(evt){
			        if(evt.target.tagName == "BODY"){
			            return false;
			        }
			    });
			}
			
			if(!priv.debug){
			    $("span.error").hide();
			}
		},
				
		OnResize	: function(){
		    Lightbox.OnResize();
		},
		
		getJsParams : function (javascriptfile){
            var params = new Object();

            javascriptfile = javascriptfile + '?';
            var tags = document.getElementsByTagName('script');
            for (var n = 0; n < tags.length; n++)
            {
                var startIndex = tags[n].src.indexOf(javascriptfile);
                if(startIndex != -1){
                   var urlparams = tags[n].src.substring(javascriptfile.length+startIndex);
                   var params = urlparams.split('&');
                   for(var i = 0;i<params.length;i++){
                     var param = params[i].split('=');
                     if(param[1] != null && param[1] != ''){
                        params[param[0]] = param[1];
                     }
                   }
                }
            }
            
            return params;
        },

        getURLParam : function (strParameterName, strURL)
        {
            if(strURL == null || typeof(strURL) == "undefined")
                strURL = location.href;
            
            var splitChar = '?';
            if ( strURL.indexOf (splitChar) == -1 )
                splitChar = '#';
                
            if ( strURL.indexOf (splitChar) > 0 )
            {
                var strParameters = strURL.split (splitChar) [1].split ("&");
                for ( i = 0; i < strParameters.length; i++ )
                {
                    if ( strParameters [i].indexOf ("=") > 0 )
                    {
                        var strParameterValue = strParameters [ i ].split ("=");
                        if ( strParameterValue [0] == strParameterName )
                            return strParameterValue [1].split('#')[0];
                    }
                }
            }
            return "";
        },
        
        removeURLParam : function (strURL, strParameterName)
        {                            
            var newUrl = '';
            var strParameters = strURL.split ("&");
            for ( i = 0; i < strParameters.length; i++ )
            {
                if (strParameters[i].indexOf("=") > 0 && strParameters[i].indexOf(strParameterName+"=") == -1)
                {
                    var strParameterValue = strParameters [ i ].split ("=");
                    if(i == 0){
                        newUrl += strParameterValue[0] + '=' +strParameterValue[1];
                    } else {
                        newUrl += '&'+strParameterValue[0] + '=' +strParameterValue[1];
                    }
                }
            }
            
            return newUrl;
        },
        
        getBottomPage : function () {
            var myHeight = 0;
            if( typeof( window.innerWidth ) == 'number' ) {
                //Non-IE
                myHeight = window.innerHeight;
            } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
                //IE 6+ in 'standards compliant mode'
                myHeight = document.documentElement.clientHeight;
            } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
                //IE 4 compatible
                myHeight = document.body.clientHeight;
            }
            
            var scrOfY = 0;
            if( typeof( window.pageYOffset ) == 'number' ) {
                //Netscape compliant
                scrOfY = window.pageYOffset;
            } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
                //DOM compliant
                scrOfY = document.body.scrollTop;
            } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
                //IE6 standards compliant mode
                scrOfY = document.documentElement.scrollTop;
            }
            
            myHeight = myHeight + scrOfY;
            
            return myHeight;
        },
        		
		/**
		 * handles the writing of debug messages
		 * @param {String} msg
		 * @param {Int} severity: 0 info, 1 wanring, 2 error, 3 critical
		 */
		writeDebug	: function(msg, severity){
			if(typeof(severity) == "undefined"){
				severity = 0;
			}
			
			if(priv.debug && severity <= priv.debugSeverity){
				//check whether debug console exists
				if(typeof(console) != "undefined" && console.log){
					console.log(msg);
				}
				//if no debug console exists: create debug div
				else {
					priv.initConsole();
					$(priv.console).append(
						$("<li>").html(msg)
					);
				}
			}
		},
		
		showNewsletterPopup : function (){
		    $('#newsletter-message').css('color','#000').html('');
		    $('#subscribe-email').val($('#pre-subscribe-email').val());
		    if($('#subscribe-email').val() != '' && $('#subscribe-email').val() != 'email@adres.nl'){
		        Logic.unOrSubscribeNewsletter('aanmelden');
		    }
		    Lightbox.Show(700, 'pNewsletter');
		},
		
		showNewsletterUnSubscribePopup : function (){
		    $('#newsletter-message').css('color','#000').html('');
            $('#textSubscribe').hide();
            $('#textUnSubscribe').show();
            $('.email-block .btn-send').attr('href','javascript:Logic.unOrSubscribeNewsletter(\'afmelden\');');
		    Lightbox.Show(700, 'pNewsletter');
		},
		
		successSubscribeNewsletter : function (result){	
		    $('#lightbox_pNewsletter span.email-block').show();
	        $('#newsletter-busy').css('display','none');       
	        if( result == "1" )
	        {	    
	            $('#newsletter-default .email-block').hide();     
	            $('#newsletter-message').css('color','green').html('U krijgt zo meteen een bevestigingsmail toegezonden waar u een link vindt. Hiermee bevestigt u uw aanmelding.<br /><a href="javascript:Lightbox.Hide();">Sluit dit venster</a><br /><br />');
	        }
	        if( result == "0" )
	        {
	            $('#newsletter-message').css('color','red').html('U heeft zich al opgegeven met dit email adres.<br />');
	        }
	    },
	    
	    successUnsubscribeNewsletter : function (result){	
		    $('#lightbox_pNewsletter span.email-block').show();
	        $('#newsletter-busy').css('display','none');       
	        if( result == "1" )
	        {	    
	            $('#newsletter-default .email-block').hide();     
	            $('#newsletter-message').css('color','green').html('U krijgt zo meteen een bevestigingsmail toegezonden waar u een link vindt. Hiermee bevestigt u uw afnmelding.<br /><a href="javascript:Lightbox.Hide();">Sluit dit venster</a><br /><br />');
	        }
	        if( result == "0" )
	        {
	            $('#newsletter-message').css('color','red').html('Dit emailadres is niet aangemeld voor de nieuwsbrief.<br />');
	        }
	    },
	    	    
	    errorUnOrSubscribeNewsletter : function (result){
	        $('#lightbox_pNewsletter a.btn-send').show();
	        $('#newsletter-busy').css('display','none');
	        //$('#un-or-subscribe-newsletter').hide();
	         $('#newsletter-message').css('color','red').html('Er is een fout opgetreden bij het opslaan van uw emailadres, probeer het op een ander tijdstip nogmaals<br />');
            //Lightbox.Show(500, 'un-or-subscribe-failed');     
	    },
		
		unOrSubscribeNewsletter : function (fid) {
	        // for testing purposes use local send newsletter page below
	        var ajaxUrl = resources.path_prefix + '/utilpages/ajax-addnewsletter.ashx';
	        switch(fid)
	        {
	            case 'aanmelden':
	                var email = $('#subscribe-email').val();
	                if (email == '')
	                {
    	                var email = $('#pre-subscribe-email').val();
	                }
	                break;
                case 'afmelden':
	                var email = $('#subscribe-email').val();
	                break;
	        }
            if(email == 'email@adres.nl'){
                email = '';
            }
	        if(email == ''){
	            $('#newsletter-message').css('color','red').html('Gelieve een correct emailadres in te vullen.<br/>');
	        } else {
	            var reg = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i;
                if (!reg.test(email)) {
                    $('#newsletter-message').css('color','red').html('Gelieve een correct emailadres in te vullen.<br/>');
                } else {
	                $('#lightbox_pNewsletter span.email-block').css('display','none');
	                $('#newsletter-busy').css('display','block');
	                switch(fid)
	                {
	                    case 'aanmelden':
	                        $.ajax({
			                    type: "POST",
			                    url: ajaxUrl,
				                data: 'email='+email+'&fid='+fid,
				                async: true,
                				
			                    success : Logic.successSubscribeNewsletter,
				                error : Logic.errorUnOrSubscribeNewsletter
			                });
			                break;
                        case 'afmelden' :			            
	                        $.ajax({
			                    type: "POST",
			                    url: ajaxUrl,
				                data: 'email='+email+'&fid='+fid,
				                async: true,
                				
			                    success : Logic.successUnsubscribeNewsletter,
				                error : Logic.errorUnOrSubscribeNewsletter
			                });
    			            break;
	                }
                }
	        }
	    },
	    
	    showImage : function(img)
	    { 
	        $('.photo-holder img').each(function() {
	            $(this).removeClass('active');
	        });
	        $('.photo-large img').each(function() {
	            $(this).hide();
	        });
	    
	        $('.' +img + '_large').show();
	        $('.' + img).addClass('active');
	    }
	}
}(jQuery);

var ImagePreloader = function($){
    priv = {
        srcArr : new Array(),
        dummy : null
    };
    
    return {
        Add : function(src, directPreload){
            priv.srcArr.push(src);
            
            if(directPreload){
                var newImg = new Image();
                newImg.src = src;
            }
        },
        
        OnReady : function(){
            //preload all the images
            for(var src in priv.srcArrsrc){
                var newImg = new Image();
                newImg.src = src;
            }
        },
        
        dummy : null
    }
}(jQuery)

var Timer = function(){
    var priv = {
        startTime : new Date(),
        endTime   : null
    };
        
    return {
        Start : function(){
            priv.startTime = new Date();
        },
        
        Stop : function(){
            priv.endTime = new Date();
            return (priv.endTime - priv.startTime);
        },
        
        ShowIntermediate : function(){
            var intermediateTime = new Date();
            return (intermediateTime - priv.startTime); 
        },
        
        GetStartTime : function(){
            return priv.startTime;
        }
    };
};

/**
 * Initiate onload methods and functions
 */
$(document).ready(
	function(){
	    var TotalOnreadyTime = new Timer();
		Logic.OnReady();
		Logic.writeDebug("script time was: " + (TotalOnreadyTime.Stop()) + "ms ", -1);
	}
);

/**
 * Bind resize eventes
 */
$(window).bind('resize', 
	function(){
		Logic.OnResize();
});
