﻿function SetupTabs(enableTabDeselection,mapWidth,mapHeight) {
     //(?) adiciono a class 'tabbed' aos fieldsets que vou querer incorporar na tabulação
    $("#navigation li").each(function() {
        var tabID = $(this).children("a").attr("href");
        $(tabID).addClass("tabbed");
    });


    //(?) escondo as tabs sujeitas à tabulação
    $("fieldset.tabbed").hide();


    //(?) configuro a tab activa
    $("#navigation li.active").children("a").addClass("active");
    $("#navigation li.active").removeClass("active");
    var activeTab = $("#navigation li a.active").attr("href");
    $(activeTab).show();

    $("#navigation li a").click(function() {

        var clickedItem = $(this).attr("href");
        var currentItem = $("#navigation li a.active").attr("href");

        if (enableTabDeselection == 0 && (clickedItem == currentItem)) {
            //unselect
            $("fieldset.tabbed").hide();
            $("#navigation li a").removeClass("active");
        }
        else {
            //select another
            $("fieldset.tabbed").hide();
            $("#navigation li a").removeClass("active");
            var newTab = $(this).attr("href");
            $(newTab).show();
            $(this).addClass("active");
        }

        // if it´s the tabLocation/Map, need to create the map
        if (clickedItem == "#tabLocation") {
              
            var latitude = $(".jquerySelector_Latitude").text();
            var longitude = $(".jquerySelector_Longitude").text();
            if (latitude != "" && longitude != "") {
                LoadGoogleMap(latitude, longitude,mapWidth,mapHeight);
            }
        }

        return false;
    });

}

function SetupOnlyMap(latitude, longitude, mapWidth, mapHeight) {

    if (latitude != "" && longitude != "") {
        LoadGoogleMap(latitude, longitude, mapWidth, mapHeight);
    }
}


// Função que se baseia no atributo title para reordenar os vários nodes no DOM
function SetupDOMNodesPosition() {

    $(document).ready(function() {
        var $tabNodes = $(".iwkPropertyDetail").children("div");
        var reorderedTabNodes = new Array($tabNodes.length);

        $tabNodes.each(function() {
            reorderedTabNodes[$(this).attr("title")] = $(this);
        });

        for (var i = 0; i < reorderedTabNodes.length; i++) {
            $(".iwkPropertyDetail").append(reorderedTabNodes[i]);
        }

        $tabNodes.each(function() {
            $(this).removeAttr("title");
        });

        return false;
    });

}


function SetupActionsPanel(clientID, scheduleVisitValue, requestInfoValue, recommendInfoValue,printPageURL,propertyID,cookieName,favoriteSuccessfullyAdded,favoriteAlreadyExists,favoriteCookiesUnavailable,handlerPath) {
    //Actions

    $(document).ready(function() {
        var ddlRequestPurpose = "#" + clientID + "_ddlRequestPurpose";
        var txtRequestName = "#" + clientID + "_txtRequestName";
        var txtRequestFriendName = "#" + clientID + "_txtRequestFriendName";
        var txtRequestFriendEmail = "#" + clientID + "_txtRequestFriendEmail";
        
        //In firsttime FriendName and email are hidden
        $(".requestFriendEmail").hide();
        $(".requestFriendName").hide();

        $(".propertyScheduleVisit").click(function() {
            DisplayTabIfNecessary(".propertyScheduleVisit");
        	ScrollToForm(scheduleVisitValue);
        });

        $(".propertyRequestInfo").click(function() {
            DisplayTabIfNecessary(".propertyRequestInfo");
        	ScrollToForm(requestInfoValue);
        });

        $(".propertyRecommend").click(function() {
            DisplayTabIfNecessary(".propertyRecommend");
        	ScrollToForm(recommendInfoValue);
        });

        $(".propertyPrint").click(function() {
            if (propertyID > 0) {
                window.location = printPageURL + "?cid=" + propertyID.toString();
            }
        });
        
        function DisplayTabIfNecessary(option) {
			
        	try {
	        	var $contactTab = $('#tabInfoRequest');
	        	var $contactMenuItem = $('a[href="#tabInfoRequest"]');
	        	        	        	        	
	        	if(!$contactTab.is(':visible')) {
	        		
	        		$("fieldset.tabbed").hide();
	        		$contactTab.show();
	        		
	        		$("#navigation li a").removeClass("active");
	        		$contactMenuItem.addClass("active");
	        	}
	    	} catch(erro) {
	    		
	    	}
        	
        };

        $(".propertyAddFavorite").click(function() {
            if (propertyID > 0) {
                if ($.cookies.test()) {
                    var v = ($.cookies.get(cookieName) != null) ? $.cookies.get(cookieName).toString().split(',') : new Array();

                    var p = -1;
                    for (var i = 0; i < v.length; i++) {
                        if (v[i] == propertyID) {
                            p = i
                            break;
                        }
                    }

                    if (p == -1) {
                        v.push(propertyID);
                        $.cookies.set(cookieName, v.join(','));
                        alert(favoriteSuccessfullyAdded);

                        $.ajax({
                            type: "POST",
                            url: handlerPath + "/UpdateFavoritesStats.ashx",
                            data: { PropertyID: propertyID }
                        });
                    } else {
                        alert(favoriteAlreadyExists);
                    }
                } else {
                    $(this).attr('checked', false);
                    alert(favoriteCookiesUnavailable);
                }
            }
        });

        $(ddlRequestPurpose).change(function() {
            TogglePurposeFields();
        });

        function ScrollToForm(ddlValue) {
            var scrollTime = 800;
            $.scrollTo('#tabInfoRequest',
                       scrollTime,
                       { onAfter: function() {
                           $(ddlRequestPurpose).val(ddlValue);
                           $(txtRequestName).focus();
                           TogglePurposeFields();
                       }
                       });
        }

        function TogglePurposeFields() {
            if ($(ddlRequestPurpose).val() == recommendInfoValue) {
                $(".requestFriendEmail").show();
                $(".requestFriendName").show();
                $(".requestCalendar").hide();
                $(".requestAccomplishTime").hide();
                $(".requestSchedule").hide();
                $(".requestPhone").hide();
            }
            else {
                $(".requestFriendEmail").hide();
                $(".requestFriendName").hide();
                $(".requestCalendar").show();
                $(".requestAccomplishTime").show();
                $(".requestSchedule").show();
                $(".requestPhone").show();
            }
        }

    });
}

function SetupSubmitForm(clientID,mandatoryFieldsFeedback,invalidEmail,invalidFriendEmail, recommendInfoValue,handlersPath,sendingSuccess,sendingError) {
    $(document).ready(function() {
        var btnSend = "#" + clientID + "_btnSend";
        var txtName = "#" + clientID + "_txtRequestName";
        var txtEmail = "#" + clientID + "_txtRequestEmail";
        var txtFriendName = "#" + clientID + "_txtRequestFriendName";
        var txtFriendEmail = "#" + clientID + "_txtRequestFriendEmail";
        var txtPhone = "#" + clientID + "_txtRequestPhone";
        var txtMessage = "#" + clientID + "_txtRequestMessage";
        var ddlRequestPurpose = "#" + clientID + "_ddlRequestPurpose";
        var ddlRequestSchedule = "#" + clientID + "_ddlRequestSchedule";
        var ddlRequestCalendar = "#" + clientID + "_ddlRequestCalendar";
        var ddlRequestAccomplishTime = "#" + clientID + "_ddlRequestAccomplishTime";
        var chkRequestBccCopy = "#" + clientID + "_chkRequestBccCopy";
        var ownerEmail = "#" + clientID + "_hdfOwnerEmail";
        //propertyInfo
        var ref = "#" + clientID + "_lblReference";
        var purpose = "#" + clientID + "_lblPurpose";
        var type = "#" + clientID + "_lblType";
        var price = "#" + clientID + "_lblPrice";

        $(btnSend).click(function() {

            if ($(ddlRequestPurpose).val() != recommendInfoValue) {
                RemoveMandatoryFieldClass(txtFriendEmail);
                RemoveMandatoryFieldClass(txtFriendName);
            }
            else {
                RemoveMandatoryFieldClass(txtPhone);
                RemoveMandatoryFieldClass(txtMessage);
            }
            var mandatoryFields = $(".mandatory");
            if (isSubmitValid(mandatoryFields) == false) {
                alert(mandatoryFieldsFeedback);
                return false;
            }

            if (IsEmailValid($(txtEmail).val()) == false) {
                alert(invalidEmail);
                return false;
            }

            if (IsEmailValid($(txtFriendEmail).val()) == false) {
                alert(invalidFriendEmail);
                return false;
            }

            //Put again the mandatory fields
            AddMandatoryFieldClass(txtFriendEmail);
            AddMandatoryFieldClass(txtFriendName);
            AddMandatoryFieldClass(txtPhone);
            AddMandatoryFieldClass(txtMessage);

            SubmitForm();

            return false;
        });

        //Remove the class mandatory from a control
        function RemoveMandatoryFieldClass(control) {
            if ($(control).is(".mandatory")) {
                $(control).removeClass("mandatory");
                //add temp class to add the mandatory class later
                $(control).addClass("tempMandatory");
            }
        }

        //ADD the class mandatory from a control
        function AddMandatoryFieldClass(control) {
            if ($(control).is(".tempMandatory")) {
                //remove the temp class
                $(control).removeClass("tempMandatory");

                $(control).addClass(" mandatory");
            }
        }

        //Verify if a list of values(mandatoryfields) are filled. if not, the submit is not valid
        function isSubmitValid(aValues) {
            var isValid = true;
            $(aValues).each(function() {
                if ($(this).val() <= 0 || $(this).val() == 'null' || $(this).val() == '') { isValid = false; }
                if (isValid == false) { return false; }
            });
            if (isValid == true) { return true; } else { return false; }
        }

        //verify if the email is valid
        function IsEmailValid(email) {
            if (email != "") {
                var regExp = /^.+@.+\..{2,3}$/;
                return regExp.test(email);
            } else {
                return true;
            }
        }

        //Send the values to the handler to send the email
        function SubmitForm() {
            var myUrl = window.location.toString();
            $.ajax({
                type: "POST",
                url: handlersPath + "/PropertyDetailContactForm.ashx",
                data: {
                    Name: $(txtName).val(),
                    Email: $(txtEmail).val(),
                    FriendName: $(txtFriendName).val(),
                    FriendEmail: $(txtFriendEmail).val(),
                    Phone: $(txtPhone).val(),
                    Message: $(txtMessage).val(),
                    Calendar: $(ddlRequestCalendar + " option:selected").text(),
                    Schedule: $(ddlRequestSchedule + " option:selected").text(),
                    AccomplishTime: $(ddlRequestAccomplishTime + " option:selected").text(),
                    SendBccCopy: $(chkRequestBccCopy).is(':checked'),
                    PurposeID: $(ddlRequestPurpose).val(),
                    Purpose: $(ddlRequestPurpose + " option:selected").text(),
                    PropertyReference: $(ref).text(),
                    PropertyType: $(type).text(),
                    PropertyPurpose: $(purpose).text(),
                    PropertyPrice: $(price).text(),
                    PropertyUrl: myUrl,
                    OwnerEmail:$(ownerEmail).val()
                },
                success: function(r) {
                    if (r.toLowerCase() == 'true') {
                        alert(sendingSuccess);
                        ResetForm();
                    } else {
                        alert(sendingError);
                    }

                    return false;
                },
                error: function(r) { alert(sendingError); }
            });
        }

        //Reset the form to initial state
        function ResetForm() {
            $(txtName).val("");
            $(txtFriendName).val("");
            $(txtEmail).val("");
            $(txtFriendEmail).val("");
            $(txtPhone).val("");
            $(txtMessage).val("");
            $(chkRequestBccCopy).attr('checked', false);
            $(ddlRequestAccomplishTime).val(0);
            $(ddlRequestSchedule).val(0);
            $(ddlRequestCalendar).val(0);
            $(ddlRequestPurpose).val(0);
            $(".requestFriendEmail").hide();
            $(".requestFriendName").hide();
            $(".requestCalendar").show();
            $(".requestAccomplishTime").show();
            $(".requestSchedule").show();
            $(".requestPhone").show();
        }



    });
}



/*=====================BEGIN MAP SETUP===================================*/
function LoadGoogleMap(latitude, longitude,mapWidth,mapHeight) {
    try {
        var showScale = false;
        var showMapControl = true;
        var showTypeControl = true;
        var showOverviewControl = false;
        var divMap_ID = "dMap";
        $(document).ready(function() {
            var _mapDiv = document.getElementById(divMap_ID);
            $(_mapDiv).css("width", mapWidth+"px");
            $(_mapDiv).css("height", mapHeight +"px");
            if (_mapDiv) {
                var map = new GMap2(document.getElementById(divMap_ID));
                /* Marker.Objects */
                var gPoints = []; gPoints[0] = new GLatLng(latitude, longitude);
                var gMarkers = []; gMarkers[0] = new GMarker(gPoints[0]);
                /* Load&Setup Map */
                var loaded = LoadMarkers(map, gMarkers);
                if (loaded) {
                    var centered = CenterMap(map, gPoints);
                    var setupedControls = SetupControls(map, showTypeControl, showScale, showMapControl, showOverviewControl);
                }
            }

        });
    } catch (err) {
    }
}

/* Adiciona os marcadores ao mapa */
function LoadMarkers(map, gMarkers) {
    var loaded;
    try {
        for (var i = 0; i < gMarkers.length; i++) {
            map.addOverlay(gMarkers[i]);
        }
        loaded = true;
    }
    catch (err) {
        loaded = false;
    }
    return loaded;
}

/* Centra o viewport do mapa de acordo com os pontos nele existentes (+) Ajusta o zoom de acordo com as necessidades */
function CenterMap(map, gPoints) {
    var centered;
    try {
        var latlngbounds = new GLatLngBounds();
        for (var i = 0; i < gPoints.length; i++) {
            latlngbounds.extend(gPoints[i]);
        }
        map.setCenter(latlngbounds.getCenter(), map.getBoundsZoomLevel(latlngbounds));
        centered = true;
    }
    catch (err) {
        centered = false;
    }
    return centered;
}

/* Configura os controlos a apresentar no mapa (Zoom, Scale, etc.) */
function SetupControls(map, showTypeControl, showScale, showMapControl, showOverviewControl) {
    var setuped;
    try {
        if (showTypeControl)
            map.addControl(new GMapTypeControl());
        if (showScale)
            map.addControl(new GScaleControl());
        if (showMapControl)
            map.addControl(new GLargeMapControl3D());
        if (showOverviewControl)
            map.addControl(new GOverviewMapControl());
        setuped = true;
    }
    catch (err) {
        setuped = false;
    }
    return setuped;
}
/*=====================END MAP SETUP===================================*/

function setEmbed(objContent, innerHTML) {
    document.getElementById(objContent).innerHTML = innerHTML;
}






/*===================== Photo Gallery ===================================*/
/*===================== Photo Gallery ===================================*/
/*===================== Photo Gallery ===================================*/
/*===================== Photo Gallery ===================================*/
/*===================== Photo Gallery ===================================*/

function SetupGallery(mainPhotoWidth, mainPhotoHeight, thumbnailWidth, thumbnailHeight, slideshowTimeout, opacityLevel, scrollThumbnails, scrollerViewport, label_nextPhotoButton, label_prevPhotoButton, label_stopSlideshowButton, label_startSlideshowButton, label_pagingInfo_prefix, label_pagingInfo_separator) {

    $(window).load(function() {

        function GalleryParameters() {
            if (mainPhotoWidth > 0) this.mainPhotoWidth = mainPhotoWidth;
            if (mainPhotoHeight > 0) this.mainPhotoHeight = mainPhotoHeight;
            if (thumbnailWidth > 0) this.thumbnailWidth = thumbnailWidth;
            if (thumbnailHeight > 0) this.thumbnailHeight = thumbnailHeight;
            if (slideshowTimeout > 0) this.slideshowTimeout = slideshowTimeout;
            if (opacityLevel > 0) this.opacityLevel = opacityLevel;
            this.scrollThumbnails = scrollThumbnails;
            if (scrollerViewport > 0) this.scrollerViewport = scrollerViewport;
            if (label_nextPhotoButton != '') this.label_nextPhotoButton = label_nextPhotoButton;
            if (label_prevPhotoButton != '') this.label_prevPhotoButton = label_prevPhotoButton;
            if (label_stopSlideshowButton != '') this.label_stopSlideshowButton = label_stopSlideshowButton;
            if (label_startSlideshowButton != '') this.label_startSlideshowButton = label_startSlideshowButton;
            if (label_pagingInfo_prefix != 'none') this.label_pagingInfo_prefix = label_pagingInfo_prefix;
            if (label_pagingInfo_separator != '') this.label_pagingInfo_separator = label_pagingInfo_separator;
        }

        $('.iwkGallery').BuildGallery(new GalleryParameters());

    });

};

(function($) {
    $.fn.BuildGallery = function(options) {

        //Options Class
        var defaults = {

            mainPhotoWidth: 456,
            mainPhotoHeight: 342,

            thumbnailWidth: 90,
            thumbnailHeight: 60,

            opacityLevel: 0.5,

            slideshowTimeout: 5000,
            currentThumbnail_cssClass: 'current',               // thumbnail item (li) corresponding to current photo

            scrollThumbnails: true,
            scrollerViewport: 470,

            cssClass_nextPhotoButton: 'nextPhoto',
            cssClass_prevPhotoButton: 'prevPhoto',
            cssClass_stopSlideshowButton: 'stopSlideshow',
            cssClass_startSlideshowButton: 'startSlideshow',

            label_nextPhotoButton: 'Seguinte',
            label_prevPhotoButton: 'Anterior',
            label_stopSlideshowButton: 'Parar',
            label_startSlideshowButton: 'Iniciar',

            cssClass_pagingInfo: 'pagingInfo',
            label_pagingInfo_prefix: 'Fotos:',
            label_pagingInfo_separator: 'de'


        };
        //... extending options object with defaults values
        var options = $.extend(defaults, options);


        return this.each(function() {



            /******************************************************************************************************
            @ Var Setup
            *******************************************************************************************************/

            var $gallery = $('ul', $(this)),                    // gallery = ul
                $thumbnails = $('ul > li', $(this)),            // thumbnail = li + img
                $photos = $('ul > li > img', $(this)),          // photo = img
                $mainPhoto_holder = $('.mainPhoto', $(this)),   // mainPhoto_holder = div + img
                $mainPhoto = $('.mainPhoto > img', $(this)),    // mainPhoto = img
                $mainPhotoLink,
                $currentPhoto = $('li:first', $gallery),
                $pagingInfoCurrent;

            var photosDimensions = CollectPhotosDimensions($photos),
                slideshowOn = false,
                slideshowTimer,
                currentScrollPosition = 0,
                rewindSlideshowOrder = false,           // handling var to detect when the scroller needs to jump to the end (backing action)
                zoomAnimationID = "iwkGalleryZoom";     // ID of fancybox zoom plugin family



            /******************************************************************************************************
            @ Thumbnails Setup
            *******************************************************************************************************/

            if ($photos.length > 1) {

                // 1. thumbnail's dimension setup
                $thumbnails.width(options.thumbnailWidth).height(options.thumbnailHeight);
                $photos.width(options.thumbnailWidth).height(options.thumbnailHeight);

                // 2. thumbnail's default opacity
                $photos.fadeTo('slow', options.opacityLevel);

                // 3. thumbnail hovering
                $thumbnails.hover(
                    function() {
                        if (!$(this).hasClass(options.currentThumbnail_cssClass)) {
                            $(this).children().stop().fadeTo('fast', 1);
                            $(this).css('cursor', 'pointer');
                        }
                    },
 			        function() {
 			            if (!$(this).hasClass(options.currentThumbnail_cssClass)) {
 			                $(this).children().stop().fadeTo('fast', options.opacityLevel);
 			            }
 			        }
 			    );

                // 4. thumbnail clicking
                $thumbnails.click(function() {
                    StopSlideshow($onOff_btn);
                    ActivatePhoto($(this));
                    return false;
                });

            }
            else {
                $('.thumbnails').hide();
            }



            /******************************************************************************************************
            @ Main Image Setup
            *******************************************************************************************************/

            // 1. setup container dimensions
            $mainPhoto_holder.width(options.mainPhotoWidth).height(options.mainPhotoHeight);
            $mainPhoto_holder.css('line-height', options.mainPhotoHeight + 'px');



            /******************************************************************************************************
            @ Zoom Controling
            *******************************************************************************************************/

            // 1. Wrap main photo with an hyperlink to the zoom photo
            $mainPhoto.wrap('<a rel="' + zoomAnimationID + '" href="" title="" />');

            // 2. Reset vars
            $mainPhotoLink = $('.mainPhoto > a', $(this));
            $mainPhoto = $('.mainPhoto > a > img', $(this));

            // 3. Append hidden links to the zoomPhoto family, to allow navigation
            $photos.each(function() {
                $mainPhoto_holder.append('<a rel="' + zoomAnimationID + '" href="' + $(this).attr('src') + '" title="' + $(this).attr('alt') + '" style="display:none;"></a>');
            });

            // 4.
            function UpdateZoomControl($photoItem) {

                var new_imageSrc = $photoItem.children().attr('src');
                var new_imageTitle = $photoItem.children().attr('alt');

                var old_imageSrc = $mainPhoto.attr('src');
                var old_imageTitle = $mainPhoto.attr('alt');

                $mainPhoto_holder.children('a').filter('a[href=' + new_imageSrc + ']').attr('rel', 'nada');
                $mainPhoto_holder.children('a').filter('a[href=' + old_imageSrc + ']').attr('rel', zoomAnimationID);

                $mainPhotoLink.attr('href', new_imageSrc).attr('title', new_imageTitle);

            };

            $('a[rel=' + zoomAnimationID + ']', $(this)).fancybox({
                'transitionIn': 'elastic',
                'transitionOut': 'elastic',
                'titlePosition': 'over'
            });

            $mainPhotoLink.click(function() {
                StopSlideshow($onOff_btn);
            });



            /******************************************************************************************************
            @ PagingInfo
            *******************************************************************************************************/
            if ($photos.length > 1) {

                $(this).prepend('<span class="' + options.cssClass_pagingInfo + '">' +
                                    '<span>' + options.label_pagingInfo_prefix + ' </span>' +
                                    '<span class="current">1</span>' +
                                    '<span> ' + options.label_pagingInfo_separator + ' </span>' +
                                    '<span class="total">' + $photos.length + '</span>' +
                                '</span>');

                $pagingInfoCurrent = $('.' + options.cssClass_pagingInfo + ' .current');

            }



            /******************************************************************************************************
            @ Navigation Setup
            *******************************************************************************************************/

            if ($photos.length > 1) {

                // 1. adding controls to the page
                $(this).prepend('<a href="#" id="iwkGalleryNext" class="' + options.cssClass_nextPhotoButton + '">' + options.label_nextPhotoButton + '</a>')
                   .prepend('<a href="#" id="iwkGalleryPrevious" class="' + options.cssClass_prevPhotoButton + '">' + options.label_prevPhotoButton + '</a>')
                   .prepend('<a href="#" id="iwkGalleryOnOff" class="' + options.cssClass_startSlideshowButton + '">' + options.label_startSlideshowButton + '</a>');

                var $onOff_btn = $('#iwkGalleryOnOff', $(this)),
                    $next_btn = $('#iwkGalleryNext', $(this)),
                    $previous_btn = $('#iwkGalleryPrevious', $(this));

                // 2. stop/play action
                $onOff_btn.click(function() {
                    if (slideshowOn) {
                        // the slideshow is running, stop it and advice user that he can start it again
                        StopSlideshow($onOff_btn);
                    }
                    else {
                        // the slideshow is stopped, start it and advice user that he can stop it now
                        PlaySlideshow($onOff_btn);
                    }
                    return false;
                });

                // 3. next action
                $next_btn.click(function() {
                    StopSlideshow($onOff_btn);
                    ActivatePhoto(GetNextPhoto());
                    return false;
                });

                // 4. previous action
                $previous_btn.click(function() {
                    StopSlideshow($onOff_btn);
                    ActivatePhoto(GetPreviousPhoto());
                    return false;
                });

            }



            /******************************************************************************************************
            @ Scrolling Thumbnails
            *******************************************************************************************************/

            // if the scrolling thumbnail option is active
            if (options.scrollThumbnails) {

                // 1. wrap the thumbnail's list with to divs...
                $gallery.wrap('<div class="thumbnailsWrapper"><div class="thumbnailsScroller" /></div>');

                // 2. setuping wrapper divs
                var $thumbnailsWrapper = $('.thumbnailsWrapper', $(this)),
                    $thumbnailsScroller = $('.thumbnailsScroller', $(this));

                // 2.1. limiting the viewport and removing scroller
                $thumbnailsWrapper.width(options.scrollerViewport)
                                  .height($thumbnails.filter(':first').outerHeight() + 25)
                                  .css('overflow', 'hidden');

                // 2.2. holding the floated thumbnails in one line (div's width will be equal to sum. of all thumbnails
                $thumbnailsScroller.width($thumbnails.filter(':first').outerWidth(true) * ($thumbnails.length + 2));

                // 3. setuping scroller
                var thumbnailWidth = $thumbnails.filter(':first').outerWidth(true),
                    visibleThumbnails = Math.floor(options.scrollerViewport / thumbnailWidth);

                function Scroll(steps) {
                    // 3.1. if the end of the list weren't reached
                    var endOfList = (currentScrollPosition + steps + visibleThumbnails > $photos.length);
                    if (!endOfList || rewindSlideshowOrder) {
                        // 3.2. the scroller should be moved @steps from it's current position
                        currentScrollPosition = currentScrollPosition + steps;
                        // 3.3. but if I've to grant that the new current isn't negative
                        if (currentScrollPosition <= 0)
                            currentScrollPosition = 0;
                        // 3.4. ok... let's scroll it
                        //$thumbnailsWrapper.scrollLeft(thumbnailWidth * currentScrollPosition);
                        $thumbnailsWrapper.animate({
                            scrollLeft: thumbnailWidth * currentScrollPosition
                        }, { "duration": "slow", "easing": "easeInBack" }, function() {
                            //another effect: easeOutCirc
                        });
                        // 3.5. Resenting rewindSlideshowOrder
                        rewindSlideshowOrder = false;
                    }
                };
                // window.Scroll = Scroll;

            }



            /******************************************************************************************************
            @ Auxiliar Functions
            *******************************************************************************************************/

            // resets .mainPhoto object
            function ActivatePhoto($photoItem) {

                // 1. setup current class
                $thumbnails.removeClass(options.currentThumbnail_cssClass);
                $photoItem.addClass(options.currentThumbnail_cssClass);

                // 2. setup opacity levels
                $thumbnails.not('.' + options.currentThumbnail_cssClass).children().animate({ opacity: options.opacityLevel });
                if (!$(this).hasClass(options.currentThumbnail_cssClass)) {
                    $photoItem.children().animate({ opacity: 1 }, 1500);
                }

                // 3. main photo change
                $mainPhoto.fadeOut('fast', function() {

                    // 3.0. zoom control links reset
                    UpdateZoomControl($photoItem);

                    // 3.1. image source path change
                    $(this).attr('src', $photoItem.children().attr('src'));
                    $(this).attr('title', $photoItem.children().attr('title'));

                    // 3.2. image size treatment

                    // 3.2.1. get dimensions
                    var index = $photoItem.prevAll().length;
                    var originalWidth = photosDimensions[index][0],
                        originalHeight = photosDimensions[index][1],
                        maxWidth = options.mainPhotoWidth,
                        maxHeight = options.mainPhotoHeight,
                        newWidth = originalWidth,
                        newHeight = originalHeight,
                        resized = false;

                    // 3.2.2. calculate new dimensions (if needded);
                    if (originalWidth > originalHeight) {
                        //landscape
                        if (originalWidth > maxWidth) {
                            //needs to be resized (based on maxWidth)
                            resized = true;
                            newWidth = maxWidth;
                            newHeight = (originalHeight * maxWidth / originalWidth);
                            if (newHeight > maxHeight) {
                                //needs to be resized (based on maxHeight)
                                var wrongHeight = newHeight;
                                newHeight = maxHeight;
                                newWidth = (maxHeight * newWidth / wrongHeight);
                            }
                        }
                    }
                    else {
                        if (originalWidth < originalHeight) {
                            //portrait
                            if (originalHeight > maxHeight) {
                                //needs to be resized (based on maxHeight)
                                resized = true;
                                newHeight = maxHeight;
                                newWidth = (originalWidth * maxHeight / originalHeight);
                                if (newWidth > maxWidth) {
                                    //needs to be resized (based on maxWidth)
                                    var wrongWidth = newWidth;
                                    newWidth = maxWidth;
                                    newHeight = (maxWidth * newHeight / wrongWidth);
                                }
                            }
                        }
                    }

                    // 3.2.3. object image resize
                    $(this).width(newWidth);
                    $(this).height(newHeight);

                    // vertical align to middle if photo is smaller then the containers
                    $(this).css('vertical-align', 'inherit');
                    if (!resized) {
                        if (originalWidth < maxWidth || originalHeight < maxHeight) {
                            $(this).css('vertical-align', 'middle');
                        }
                    }

                    // 3.2.4. image display
                    $(this).fadeIn();

                    // 3.2.5. adjusts current photo
                    $currentPhoto = $photoItem;

                    // 3.2.6. update current photo in paging info
                    if ($photos.length > 1) {
                        $pagingInfoCurrent.text(index + 1);
                    }

                });

                // 4. scroll thumbnails
                if (options.scrollThumbnails) {
                    var scrollPage = $photoItem.prevAll().length - currentScrollPosition;
                    var steps = scrollPage - (Math.floor(visibleThumbnails / 2));

                    var a = $photos.length - Math.floor(visibleThumbnails / 2) - 1;
                    if (steps >= a)
                        steps = a - Math.floor(visibleThumbnails / 2);

                    Scroll(steps);
                }

            };

            // inits the timer that makes slideshow happens
            function PlaySlideshow($control) {

                ActivatePhoto(GetNextPhoto());

                $control.text(options.label_stopSlideshowButton);
                $control.attr("class", options.cssClass_stopSlideshowButton);
                slideshowOn = true;

                slideshowTimer = setInterval(function() {
                    ActivatePhoto(GetNextPhoto());
                }, options.slideshowTimeout);

            };

            // stops the slideshow's timer 
            function StopSlideshow($control) {
                clearInterval(slideshowTimer);
                $control.text(options.label_startSlideshowButton);
                $control.attr("class", options.cssClass_startSlideshowButton);
                slideshowOn = false;
            };

            // gets the next photo for the slideshow
            function GetNextPhoto() {
                var $nextPhoto = $currentPhoto.next();
                if ($nextPhoto.length == 0) {
                    $nextPhoto = $('li:first', $gallery);
                    currentScrollPosition = 0;
                }
                //console.log(currentScrollPosition);
                return $nextPhoto;
            };

            // gets the previous photo for the slideshow
            function GetPreviousPhoto() {
                var $previousPhoto = $currentPhoto.prev();
                if ($previousPhoto.length == 0) {
                    $previousPhoto = $('li:last', $gallery);
                    currentScrollPosition = 0;
                    rewindSlideshowOrder = true;
                }
                //console.log(currentScrollPosition);
                return $previousPhoto;
            };

            // retrieves an array with the dimensins [w,h] of all photos
            function CollectPhotosDimensions($obj) {
                var _photosDimensions = new Array($obj.length);
                for (var i = 0; i < _photosDimensions.length; i++)
                    _photosDimensions[i] = new Array(2);
                $obj.each(function(itIndex) {
                    _photosDimensions[itIndex][0] = $(this).width();
                    _photosDimensions[itIndex][1] = $(this).height();
                });
                return _photosDimensions;
            };



            /******************************************************************************************************
            @ Initializing
            *******************************************************************************************************/

            $(this).css('visibility', 'visible');   // by default, control is invisible
            //$(this).show();
            ActivatePhoto($currentPhoto);

        });

    };
})(jQuery);








/******************************************************************************************************************************
*******************************************************************************************************************************
*******************************************************************************************************************************
*******************************************************************************************************************************
*******************************************************************************************************************************/


/* FANCYBOX PLUGIN */

/*
* FancyBox - jQuery Plugin
* Simple and fancy lightbox alternative
*
* Examples and documentation at: http://fancybox.net
* 
* Copyright (c) 2008 - 2010 Janis Skarnelis
*
* Version: 1.3.1 (05/03/2010)
* Requires: jQuery v1.3+
*
* Dual licensed under the MIT and GPL licenses:
*   http://www.opensource.org/licenses/mit-license.php
*   http://www.gnu.org/licenses/gpl.html
*/

(function(b) {
    var m, u, x, g, D, i, z, A, B, p = 0, e = {}, q = [], n = 0, c = {}, j = [], E = null, s = new Image, G = /\.(jpg|gif|png|bmp|jpeg)(.*)?$/i, S = /[^\.]\.(swf)\s*$/i, H, I = 1, k, l, h = false, y = b.extend(b("<div/>")[0], { prop: 0 }), v = 0, O = !b.support.opacity && !window.XMLHttpRequest, J = function() { u.hide(); s.onerror = s.onload = null; E && E.abort(); m.empty() }, P = function() { b.fancybox('<p id="fancybox_error">The requested content cannot be loaded.<br />Please try again later.</p>', { scrolling: "no", padding: 20, transitionIn: "none", transitionOut: "none" }) },
K = function() { return [b(window).width(), b(window).height(), b(document).scrollLeft(), b(document).scrollTop()] }, T = function() {
    var a = K(), d = {}, f = c.margin, o = c.autoScale, t = (20 + f) * 2, w = (20 + f) * 2, r = c.padding * 2; if (c.width.toString().indexOf("%") > -1) { d.width = a[0] * parseFloat(c.width) / 100 - 40; o = false } else d.width = c.width + r; if (c.height.toString().indexOf("%") > -1) { d.height = a[1] * parseFloat(c.height) / 100 - 40; o = false } else d.height = c.height + r; if (o && (d.width > a[0] - t || d.height > a[1] - w)) if (e.type == "image" || e.type == "swf") {
        t += r;
        w += r; o = Math.min(Math.min(a[0] - t, c.width) / c.width, Math.min(a[1] - w, c.height) / c.height); d.width = Math.round(o * (d.width - r)) + r; d.height = Math.round(o * (d.height - r)) + r
    } else { d.width = Math.min(d.width, a[0] - t); d.height = Math.min(d.height, a[1] - w) } d.top = a[3] + (a[1] - (d.height + 40)) * 0.5; d.left = a[2] + (a[0] - (d.width + 40)) * 0.5; if (c.autoScale === false) { d.top = Math.max(a[3] + f, d.top); d.left = Math.max(a[2] + f, d.left) } return d
}, U = function(a) {
    if (a && a.length) switch (c.titlePosition) {
        case "inside": return a; case "over": return '<span id="fancybox-title-over">' +
a + "</span>"; default: return '<span id="fancybox-title-wrap"><span id="fancybox-title-left"></span><span id="fancybox-title-main">' + a + '</span><span id="fancybox-title-right"></span></span>'
    } return false
}, V = function() {
    var a = c.title, d = l.width - c.padding * 2, f = "fancybox-title-" + c.titlePosition; b("#fancybox-title").remove(); v = 0; if (c.titleShow !== false) {
        a = b.isFunction(c.titleFormat) ? c.titleFormat(a, j, n, c) : U(a); if (!(!a || a === "")) {
            b('<div id="fancybox-title" class="' + f + '" />').css({ width: d, paddingLeft: c.padding,
                paddingRight: c.padding
            }).html(a).appendTo("body"); switch (c.titlePosition) { case "inside": v = b("#fancybox-title").outerHeight(true) - c.padding; l.height += v; break; case "over": b("#fancybox-title").css("bottom", c.padding); break; default: b("#fancybox-title").css("bottom", b("#fancybox-title").outerHeight(true) * -1); break } b("#fancybox-title").appendTo(D).hide()
        }
    }
}, W = function() {
    b(document).unbind("keydown.fb").bind("keydown.fb", function(a) {
        if (a.keyCode == 27 && c.enableEscapeButton) { a.preventDefault(); b.fancybox.close() } else if (a.keyCode ==
37) { a.preventDefault(); b.fancybox.prev() } else if (a.keyCode == 39) { a.preventDefault(); b.fancybox.next() }
    }); if (b.fn.mousewheel) { g.unbind("mousewheel.fb"); j.length > 1 && g.bind("mousewheel.fb", function(a, d) { a.preventDefault(); h || d === 0 || (d > 0 ? b.fancybox.prev() : b.fancybox.next()) }) } if (c.showNavArrows) { if (c.cyclic && j.length > 1 || n !== 0) A.show(); if (c.cyclic && j.length > 1 || n != j.length - 1) B.show() }
}, X = function() {
    var a, d; if (j.length - 1 > n) { a = j[n + 1].href; if (typeof a !== "undefined" && a.match(G)) { d = new Image; d.src = a } } if (n > 0) {
        a =
j[n - 1].href; if (typeof a !== "undefined" && a.match(G)) { d = new Image; d.src = a }
    }
}, L = function() {
    i.css("overflow", c.scrolling == "auto" ? c.type == "image" || c.type == "iframe" || c.type == "swf" ? "hidden" : "auto" : c.scrolling == "yes" ? "auto" : "visible"); if (!b.support.opacity) { i.get(0).style.removeAttribute("filter"); g.get(0).style.removeAttribute("filter") } b("#fancybox-title").show(); c.hideOnContentClick && i.one("click", b.fancybox.close); c.hideOnOverlayClick && x.one("click", b.fancybox.close); c.showCloseButton && z.show(); W(); b(window).bind("resize.fb",
b.fancybox.center); c.centerOnScroll ? b(window).bind("scroll.fb", b.fancybox.center) : b(window).unbind("scroll.fb"); b.isFunction(c.onComplete) && c.onComplete(j, n, c); h = false; X()
}, M = function(a) {
    var d = Math.round(k.width + (l.width - k.width) * a), f = Math.round(k.height + (l.height - k.height) * a), o = Math.round(k.top + (l.top - k.top) * a), t = Math.round(k.left + (l.left - k.left) * a); g.css({ width: d + "px", height: f + "px", top: o + "px", left: t + "px" }); d = Math.max(d - c.padding * 2, 0); f = Math.max(f - (c.padding * 2 + v * a), 0); i.css({ width: d + "px", height: f +
"px"
    }); if (typeof l.opacity !== "undefined") g.css("opacity", a < 0.5 ? 0.5 : a)
}, Y = function(a) { var d = a.offset(); d.top += parseFloat(a.css("paddingTop")) || 0; d.left += parseFloat(a.css("paddingLeft")) || 0; d.top += parseFloat(a.css("border-top-width")) || 0; d.left += parseFloat(a.css("border-left-width")) || 0; d.width = a.width(); d.height = a.height(); return d }, Q = function() {
    var a = e.orig ? b(e.orig) : false, d = {}; if (a && a.length) {
        a = Y(a); d = { width: a.width + c.padding * 2, height: a.height + c.padding * 2, top: a.top - c.padding - 20, left: a.left - c.padding -
20
        }
    } else { a = K(); d = { width: 1, height: 1, top: a[3] + a[1] * 0.5, left: a[2] + a[0] * 0.5} } return d
}, N = function() {
    u.hide(); if (g.is(":visible") && b.isFunction(c.onCleanup)) if (c.onCleanup(j, n, c) === false) { b.event.trigger("fancybox-cancel"); h = false; return } j = q; n = p; c = e; i.get(0).scrollTop = 0; i.get(0).scrollLeft = 0; if (c.overlayShow) {
        O && b("select:not(#fancybox-tmp select)").filter(function() { return this.style.visibility !== "hidden" }).css({ visibility: "hidden" }).one("fancybox-cleanup", function() { this.style.visibility = "inherit" });
        x.css({ "background-color": c.overlayColor, opacity: c.overlayOpacity }).unbind().show()
    } l = T(); V(); if (g.is(":visible")) {
        b(z.add(A).add(B)).hide(); var a = g.position(), d; k = { top: a.top, left: a.left, width: g.width(), height: g.height() }; d = k.width == l.width && k.height == l.height; i.fadeOut(c.changeFade, function() {
            var f = function() { i.html(m.contents()).fadeIn(c.changeFade, L) }; b.event.trigger("fancybox-change"); i.empty().css("overflow", "hidden"); if (d) {
                i.css({ top: c.padding, left: c.padding, width: Math.max(l.width - c.padding *
2, 1), height: Math.max(l.height - c.padding * 2 - v, 1)
                }); f()
            } else { i.css({ top: c.padding, left: c.padding, width: Math.max(k.width - c.padding * 2, 1), height: Math.max(k.height - c.padding * 2, 1) }); y.prop = 0; b(y).animate({ prop: 1 }, { duration: c.changeSpeed, easing: c.easingChange, step: M, complete: f }) }
        })
    } else {
        g.css("opacity", 1); if (c.transitionIn == "elastic") {
            k = Q(); i.css({ top: c.padding, left: c.padding, width: Math.max(k.width - c.padding * 2, 1), height: Math.max(k.height - c.padding * 2, 1) }).html(m.contents()); g.css(k).show(); if (c.opacity) l.opacity =
0; y.prop = 0; b(y).animate({ prop: 1 }, { duration: c.speedIn, easing: c.easingIn, step: M, complete: L })
        } else { i.css({ top: c.padding, left: c.padding, width: Math.max(l.width - c.padding * 2, 1), height: Math.max(l.height - c.padding * 2 - v, 1) }).html(m.contents()); g.css(l).fadeIn(c.transitionIn == "none" ? 0 : c.speedIn, L) }
    }
}, F = function() { m.width(e.width); m.height(e.height); if (e.width == "auto") e.width = m.width(); if (e.height == "auto") e.height = m.height(); N() }, Z = function() {
    h = true; e.width = s.width; e.height = s.height; b("<img />").attr({ id: "fancybox-img",
        src: s.src, alt: e.title
    }).appendTo(m); N()
}, C = function() {
    J(); var a = q[p], d, f, o, t, w; e = b.extend({}, b.fn.fancybox.defaults, typeof b(a).data("fancybox") == "undefined" ? e : b(a).data("fancybox")); o = a.title || b(a).title || e.title || ""; if (a.nodeName && !e.orig) e.orig = b(a).children("img:first").length ? b(a).children("img:first") : b(a); if (o === "" && e.orig) o = e.orig.attr("alt"); d = a.nodeName && /^(?:javascript|#)/i.test(a.href) ? e.href || null : e.href || a.href || null; if (e.type) { f = e.type; if (!d) d = e.content } else if (e.content) f = "html"; else if (d) if (d.match(G)) f =
"image"; else if (d.match(S)) f = "swf"; else if (b(a).hasClass("iframe")) f = "iframe"; else if (d.match(/#/)) { a = d.substr(d.indexOf("#")); f = b(a).length > 0 ? "inline" : "ajax" } else f = "ajax"; else f = "inline"; e.type = f; e.href = d; e.title = o; if (e.autoDimensions && e.type !== "iframe" && e.type !== "swf") { e.width = "auto"; e.height = "auto" } if (e.modal) { e.overlayShow = true; e.hideOnOverlayClick = false; e.hideOnContentClick = false; e.enableEscapeButton = false; e.showCloseButton = false } if (b.isFunction(e.onStart)) if (e.onStart(q, p, e) === false) {
        h = false;
        return
    } m.css("padding", 20 + e.padding + e.margin); b(".fancybox-inline-tmp").unbind("fancybox-cancel").bind("fancybox-change", function() { b(this).replaceWith(i.children()) }); switch (f) {
        case "html": m.html(e.content); F(); break; case "inline": b('<div class="fancybox-inline-tmp" />').hide().insertBefore(b(a)).bind("fancybox-cleanup", function() { b(this).replaceWith(i.children()) }).bind("fancybox-cancel", function() { b(this).replaceWith(m.children()) }); b(a).appendTo(m); F(); break; case "image": h = false; b.fancybox.showActivity();
            s = new Image; s.onerror = function() { P() }; s.onload = function() { s.onerror = null; s.onload = null; Z() }; s.src = d; break; case "swf": t = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="' + e.width + '" height="' + e.height + '"><param name="movie" value="' + d + '"></param>'; w = ""; b.each(e.swf, function(r, R) { t += '<param name="' + r + '" value="' + R + '"></param>'; w += " " + r + '="' + R + '"' }); t += '<embed src="' + d + '" type="application/x-shockwave-flash" width="' + e.width + '" height="' + e.height + '"' + w + "></embed></object>"; m.html(t);
            F(); break; case "ajax": a = d.split("#", 2); f = e.ajax.data || {}; if (a.length > 1) { d = a[0]; if (typeof f == "string") f += "&selector=" + a[1]; else f.selector = a[1] } h = false; b.fancybox.showActivity(); E = b.ajax(b.extend(e.ajax, { url: d, data: f, error: P, success: function(r) { if (E.status == 200) { m.html(r); F() } } })); break; case "iframe": b('<iframe id="fancybox-frame" name="fancybox-frame' + (new Date).getTime() + '" frameborder="0" hspace="0" scrolling="' + e.scrolling + '" src="' + e.href + '"></iframe>').appendTo(m); N(); break
    }
}, $ = function() {
    if (u.is(":visible")) {
        b("div",
u).css("top", I * -40 + "px"); I = (I + 1) % 12
    } else clearInterval(H)
}, aa = function() {
    if (!b("#fancybox-wrap").length) {
        b("body").append(m = b('<div id="fancybox-tmp"></div>'), u = b('<div id="fancybox-loading"><div></div></div>'), x = b('<div id="fancybox-overlay"></div>'), g = b('<div id="fancybox-wrap"></div>')); if (!b.support.opacity) { g.addClass("fancybox-ie"); u.addClass("fancybox-ie") } D = b('<div id="fancybox-outer"></div>').append('<div class="fancy-bg" id="fancy-bg-n"></div><div class="fancy-bg" id="fancy-bg-ne"></div><div class="fancy-bg" id="fancy-bg-e"></div><div class="fancy-bg" id="fancy-bg-se"></div><div class="fancy-bg" id="fancy-bg-s"></div><div class="fancy-bg" id="fancy-bg-sw"></div><div class="fancy-bg" id="fancy-bg-w"></div><div class="fancy-bg" id="fancy-bg-nw"></div>').appendTo(g);
        D.append(i = b('<div id="fancybox-inner"></div>'), z = b('<a id="fancybox-close"></a>'), A = b('<a href="javascript:;" id="fancybox-left"><span class="fancy-ico" id="fancybox-left-ico"></span></a>'), B = b('<a href="javascript:;" id="fancybox-right"><span class="fancy-ico" id="fancybox-right-ico"></span></a>')); z.click(b.fancybox.close); u.click(b.fancybox.cancel); A.click(function(a) { a.preventDefault(); b.fancybox.prev() }); B.click(function(a) { a.preventDefault(); b.fancybox.next() }); if (O) {
            x.get(0).style.setExpression("height",
"document.body.scrollHeight > document.body.offsetHeight ? document.body.scrollHeight : document.body.offsetHeight + 'px'"); u.get(0).style.setExpression("top", "(-20 + (document.documentElement.clientHeight ? document.documentElement.clientHeight/2 : document.body.clientHeight/2 ) + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop )) + 'px'"); D.prepend('<iframe id="fancybox-hide-sel-frame" src="javascript:\'\';" scrolling="no" frameborder="0" ></iframe>')
        }
    }
};
    b.fn.fancybox = function(a) { b(this).data("fancybox", b.extend({}, a, b.metadata ? b(this).metadata() : {})).unbind("click.fb").bind("click.fb", function(d) { d.preventDefault(); if (!h) { h = true; b(this).blur(); q = []; p = 0; d = b(this).attr("rel") || ""; if (!d || d == "" || d === "nofollow") q.push(this); else { q = b("a[rel=" + d + "], area[rel=" + d + "]"); p = q.index(this) } C(); return false } }); return this }; b.fancybox = function(a, d) {
        if (!h) {
            h = true; d = typeof d !== "undefined" ? d : {}; q = []; p = d.index || 0; if (b.isArray(a)) {
                for (var f = 0, o = a.length; f < o; f++) if (typeof a[f] ==
"object") b(a[f]).data("fancybox", b.extend({}, d, a[f])); else a[f] = b({}).data("fancybox", b.extend({ content: a[f] }, d)); q = jQuery.merge(q, a)
            } else { if (typeof a == "object") b(a).data("fancybox", b.extend({}, d, a)); else a = b({}).data("fancybox", b.extend({ content: a }, d)); q.push(a) } if (p > q.length || p < 0) p = 0; C()
        }
    }; b.fancybox.showActivity = function() { clearInterval(H); u.show(); H = setInterval($, 66) }; b.fancybox.hideActivity = function() { u.hide() }; b.fancybox.next = function() { return b.fancybox.pos(n + 1) }; b.fancybox.prev = function() {
        return b.fancybox.pos(n -
1)
    }; b.fancybox.pos = function(a) { if (!h) { a = parseInt(a, 10); if (a > -1 && j.length > a) { p = a; C() } if (c.cyclic && j.length > 1 && a < 0) { p = j.length - 1; C() } if (c.cyclic && j.length > 1 && a >= j.length) { p = 0; C() } } }; b.fancybox.cancel = function() { if (!h) { h = true; b.event.trigger("fancybox-cancel"); J(); e && b.isFunction(e.onCancel) && e.onCancel(q, p, e); h = false } }; b.fancybox.close = function() {
        function a() { x.fadeOut("fast"); g.hide(); b.event.trigger("fancybox-cleanup"); i.empty(); b.isFunction(c.onClosed) && c.onClosed(j, n, c); j = e = []; n = p = 0; c = e = {}; h = false }
        if (!(h || g.is(":hidden"))) {
            h = true; if (c && b.isFunction(c.onCleanup)) if (c.onCleanup(j, n, c) === false) { h = false; return } J(); b(z.add(A).add(B)).hide(); b("#fancybox-title").remove(); g.add(i).add(x).unbind(); b(window).unbind("resize.fb scroll.fb"); b(document).unbind("keydown.fb"); i.css("overflow", "hidden"); if (c.transitionOut == "elastic") {
                k = Q(); var d = g.position(); l = { top: d.top, left: d.left, width: g.width(), height: g.height() }; if (c.opacity) l.opacity = 1; y.prop = 1; b(y).animate({ prop: 0 }, { duration: c.speedOut, easing: c.easingOut,
                    step: M, complete: a
                })
            } else g.fadeOut(c.transitionOut == "none" ? 0 : c.speedOut, a)
        }
    }; b.fancybox.resize = function() { var a, d; if (!(h || g.is(":hidden"))) { h = true; a = i.wrapInner("<div style='overflow:auto'></div>").children(); d = a.height(); g.css({ height: d + c.padding * 2 + v }); i.css({ height: d }); a.replaceWith(a.children()); b.fancybox.center() } }; b.fancybox.center = function() {
        h = true; var a = K(), d = c.margin, f = {}; f.top = a[3] + (a[1] - (g.height() - v + 40)) * 0.5; f.left = a[2] + (a[0] - (g.width() + 40)) * 0.5; f.top = Math.max(a[3] + d, f.top); f.left = Math.max(a[2] +
d, f.left); g.css(f); h = false
    }; b.fn.fancybox.defaults = { padding: 10, margin: 20, opacity: false, modal: false, cyclic: false, scrolling: "auto", width: 560, height: 340, autoScale: true, autoDimensions: true, centerOnScroll: false, ajax: {}, swf: { wmode: "transparent" }, hideOnOverlayClick: true, hideOnContentClick: false, overlayShow: true, overlayOpacity: 0.3, overlayColor: "#666", titleShow: true, titlePosition: "outside", titleFormat: null, transitionIn: "fade", transitionOut: "fade", speedIn: 300, speedOut: 300, changeSpeed: 300, changeFade: "fast",
        easingIn: "swing", easingOut: "swing", showCloseButton: true, showNavArrows: true, enableEscapeButton: true, onStart: null, onCancel: null, onComplete: null, onCleanup: null, onClosed: null
    }; b(document).ready(function() { aa() })
})(jQuery);




/* EASING LIBRARY */

/*
* jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/
*
* Uses the built in easing capabilities added In jQuery 1.1
* to offer multiple easing options
*
* TERMS OF USE - jQuery Easing
* 
* Open source under the BSD License. 
* 
* Copyright Â© 2008 George McGinley Smith
* All rights reserved.
* 
* Redistribution and use in source and binary forms, with or without modification, 
* are permitted provided that the following conditions are met:
* 
* Redistributions of source code must retain the above copyright notice, this list of 
* conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice, this list 
* of conditions and the following disclaimer in the documentation and/or other materials 
* provided with the distribution.
* 
* Neither the name of the author nor the names of contributors may be used to endorse 
* or promote products derived from this software without specific prior written permission.
* 
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
*  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
*  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
*  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
*  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 
* OF THE POSSIBILITY OF SUCH DAMAGE. 
*
*/

jQuery.easing['jswing'] = jQuery.easing['swing'];

jQuery.extend(jQuery.easing,
{
    def: 'easeOutQuad',
    swing: function(x, t, b, c, d) {
        //alert(jQuery.easing.default);
        return jQuery.easing[jQuery.easing.def](x, t, b, c, d);
    },
    easeInQuad: function(x, t, b, c, d) {
        return c * (t /= d) * t + b;
    },
    easeOutQuad: function(x, t, b, c, d) {
        return -c * (t /= d) * (t - 2) + b;
    },
    easeInOutQuad: function(x, t, b, c, d) {
        if ((t /= d / 2) < 1) return c / 2 * t * t + b;
        return -c / 2 * ((--t) * (t - 2) - 1) + b;
    },
    easeInCubic: function(x, t, b, c, d) {
        return c * (t /= d) * t * t + b;
    },
    easeOutCubic: function(x, t, b, c, d) {
        return c * ((t = t / d - 1) * t * t + 1) + b;
    },
    easeInOutCubic: function(x, t, b, c, d) {
        if ((t /= d / 2) < 1) return c / 2 * t * t * t + b;
        return c / 2 * ((t -= 2) * t * t + 2) + b;
    },
    easeInQuart: function(x, t, b, c, d) {
        return c * (t /= d) * t * t * t + b;
    },
    easeOutQuart: function(x, t, b, c, d) {
        return -c * ((t = t / d - 1) * t * t * t - 1) + b;
    },
    easeInOutQuart: function(x, t, b, c, d) {
        if ((t /= d / 2) < 1) return c / 2 * t * t * t * t + b;
        return -c / 2 * ((t -= 2) * t * t * t - 2) + b;
    },
    easeInQuint: function(x, t, b, c, d) {
        return c * (t /= d) * t * t * t * t + b;
    },
    easeOutQuint: function(x, t, b, c, d) {
        return c * ((t = t / d - 1) * t * t * t * t + 1) + b;
    },
    easeInOutQuint: function(x, t, b, c, d) {
        if ((t /= d / 2) < 1) return c / 2 * t * t * t * t * t + b;
        return c / 2 * ((t -= 2) * t * t * t * t + 2) + b;
    },
    easeInSine: function(x, t, b, c, d) {
        return -c * Math.cos(t / d * (Math.PI / 2)) + c + b;
    },
    easeOutSine: function(x, t, b, c, d) {
        return c * Math.sin(t / d * (Math.PI / 2)) + b;
    },
    easeInOutSine: function(x, t, b, c, d) {
        return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;
    },
    easeInExpo: function(x, t, b, c, d) {
        return (t == 0) ? b : c * Math.pow(2, 10 * (t / d - 1)) + b;
    },
    easeOutExpo: function(x, t, b, c, d) {
        return (t == d) ? b + c : c * (-Math.pow(2, -10 * t / d) + 1) + b;
    },
    easeInOutExpo: function(x, t, b, c, d) {
        if (t == 0) return b;
        if (t == d) return b + c;
        if ((t /= d / 2) < 1) return c / 2 * Math.pow(2, 10 * (t - 1)) + b;
        return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b;
    },
    easeInCirc: function(x, t, b, c, d) {
        return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b;
    },
    easeOutCirc: function(x, t, b, c, d) {
        return c * Math.sqrt(1 - (t = t / d - 1) * t) + b;
    },
    easeInOutCirc: function(x, t, b, c, d) {
        if ((t /= d / 2) < 1) return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b;
        return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;
    },
    easeInElastic: function(x, t, b, c, d) {
        var s = 1.70158; var p = 0; var a = c;
        if (t == 0) return b; if ((t /= d) == 1) return b + c; if (!p) p = d * .3;
        if (a < Math.abs(c)) { a = c; var s = p / 4; }
        else var s = p / (2 * Math.PI) * Math.asin(c / a);
        return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;
    },
    easeOutElastic: function(x, t, b, c, d) {
        var s = 1.70158; var p = 0; var a = c;
        if (t == 0) return b; if ((t /= d) == 1) return b + c; if (!p) p = d * .3;
        if (a < Math.abs(c)) { a = c; var s = p / 4; }
        else var s = p / (2 * Math.PI) * Math.asin(c / a);
        return a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p) + c + b;
    },
    easeInOutElastic: function(x, t, b, c, d) {
        var s = 1.70158; var p = 0; var a = c;
        if (t == 0) return b; if ((t /= d / 2) == 2) return b + c; if (!p) p = d * (.3 * 1.5);
        if (a < Math.abs(c)) { a = c; var s = p / 4; }
        else var s = p / (2 * Math.PI) * Math.asin(c / a);
        if (t < 1) return -.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;
        return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p) * .5 + c + b;
    },
    easeInBack: function(x, t, b, c, d, s) {
        if (s == undefined) s = 1.70158;
        return c * (t /= d) * t * ((s + 1) * t - s) + b;
    },
    easeOutBack: function(x, t, b, c, d, s) {
        if (s == undefined) s = 1.70158;
        return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;
    },
    easeInOutBack: function(x, t, b, c, d, s) {
        if (s == undefined) s = 1.70158;
        if ((t /= d / 2) < 1) return c / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)) + b;
        return c / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2) + b;
    },
    easeInBounce: function(x, t, b, c, d) {
        return c - jQuery.easing.easeOutBounce(x, d - t, 0, c, d) + b;
    },
    easeOutBounce: function(x, t, b, c, d) {
        if ((t /= d) < (1 / 2.75)) {
            return c * (7.5625 * t * t) + b;
        } else if (t < (2 / 2.75)) {
            return c * (7.5625 * (t -= (1.5 / 2.75)) * t + .75) + b;
        } else if (t < (2.5 / 2.75)) {
            return c * (7.5625 * (t -= (2.25 / 2.75)) * t + .9375) + b;
        } else {
            return c * (7.5625 * (t -= (2.625 / 2.75)) * t + .984375) + b;
        }
    },
    easeInOutBounce: function(x, t, b, c, d) {
        if (t < d / 2) return jQuery.easing.easeInBounce(x, t * 2, 0, c, d) * .5 + b;
        return jQuery.easing.easeOutBounce(x, t * 2 - d, 0, c, d) * .5 + c * .5 + b;
    }
});


