function passwordStrength(password, username) {
    score = 0

    if (password.length < 4 ) { return 0 }

    if (password.toLowerCase()==username.toLowerCase()) return 0

    score += password.length * 4
    score += ( checkRepetition(1,password).length - password.length ) * 1
    score += ( checkRepetition(2,password).length - password.length ) * 1
    score += ( checkRepetition(3,password).length - password.length ) * 1
    score += ( checkRepetition(4,password).length - password.length ) * 1

    //password has 3 numbers
    if (password.match(/(.*[0-9].*[0-9].*[0-9])/))  score += 5

    //password has 2 symbols
    if (password.match(/(.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~])/)) score += 5

    //password has Upper and Lower chars
    if (password.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/))  score += 10

    //password has number and chars
    if (password.match(/([a-zA-Z])/) && password.match(/([0-9])/))  score += 15
    //
    //password has number and symbol
    if (password.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && password.match(/([0-9])/))  score += 15

    //password has char and symbol
    if (password.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && password.match(/([a-zA-Z])/))  score += 15

    //password is just a numbers or chars
    if (password.match(/^\w+$/) || password.match(/^\d+$/) )  score -= 10

    //verifing 0 < score < 100
    if ( score < 0 )    score = 0
    if ( score > 100 )  score = 100

    return (Math.ceil(score/20) - 1)
}

// checkRepetition(1,'aaaaaaabcbc')   = 'abcbc'
// checkRepetition(2,'aaaaaaabcbc')   = 'aabc'
// checkRepetition(2,'aaaaaaabcdbcd') = 'aabcd'
function checkRepetition(pLen,str) {
    res = ""
    for ( i=0; i<str.length ; i++ ) {
        repeated=true
        for (j=0;j < pLen && (j+i+pLen) < str.length;j++)
            repeated=repeated && (str.charAt(j+i)==str.charAt(j+i+pLen))
        if (j<pLen) repeated=false
        if (repeated) {
            i+=pLen-1
            repeated=false
        }
        else {
            res+=str.charAt(i)
        }
    }
    return res
}

function executePasswordPolicy(event) {
    if ($('.password').attr('value') == $('.repeat-password').attr('value')) {
        $('.passwords-not-the-same').addClass('hidden');
        return true;
    } else {
        event.preventDefault();
        $('.passwords-not-the-same').removeClass('hidden');
        return false;
    }
}

function isValidEMailAddress(e_mail_address)
{
    var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
    return filter.test(e_mail_address) && e_mail_address.length > 0;
}

function showCompany(show)
{
    if (show) {
        $('.company').removeClass('hidden');
        $('.company input[name="company-name"]').removeClass('hidden');
        $('.company input[name="company-url"]').removeClass('hidden');
    }
}

function hideCompany(hide)
{
    if (hide) {
        $('.company').addClass('hidden');
        $('.company input[name="company-name"]').addClass('hidden');
        $('.company input[name="company-url"]').addClass('hidden');
    }
}

function handleCompany()
{
    var show = $('.user-types[][value="realtor"]').is(':checked') || $('.user-types[][value="project-developer"]').is(':checked');
    showCompany(show);
    hideCompany(!show);
}

function testIsValid(element)
{
    var isValid       = true;
    var jqueryElement = $(element);

    switch (element.type) {
        case 'textarea' :
        case 'text' :
        {
            if (jqueryElement.hasClass('hidden')) {
            } else {
                isValid &= $.trim(element.value).length > 0 && $.trim(element.value).length <= 200;
            }
            if ($.trim(element.value).length > 200) {
                jqueryElement.attr('value', $.trim(element.value).substr(0, 140));
            }
        }
        break;
    }
    return isValid;
}

function handleIsValid(element, event, isValid)
{
    var jqueryElement = $(element);

    if (isValid) {
        jqueryElement.addClass('hidden');
    } else {
        jqueryElement.removeClass('hidden');
        event.preventDefault();
    }
    return isValid;
}

;(function($) {
    $.fn.imageSlider = function(partial_selector) {
        if($(this.selector).length) {
            var selector     = this.selector;
            var minIndex     = parseInt($(this.selector + " .object[rel*='" + partial_selector + "']").get(0).rel.split('_').pop());
            var maxIndex     = parseInt($(this.selector + " .object[rel*='" + partial_selector + "']").length);
            var currentIndex = minIndex;

            $(selector + " .prev").addClass('disabled');
            if ($(selector + " .object[rel*='" + partial_selector + "']").length <= 4) {
                $(selector + " .prev").click(function(){});
                $(selector + " .next").addClass('disabled');
                $(selector + " .next").click(function(){});
            } else {
                $(selector + " .prev").click(function() {
                    if ($(this).hasClass('disabled')) {

                    } else {
                        if (currentIndex - 1 >= minIndex) {
                            $(selector + " .next").removeClass('disabled');
                            $(selector + " .object[rel=" + partial_selector + (currentIndex - 1) + "]").removeClass('hidden');
                            $(selector + " .object[rel=" + partial_selector + (currentIndex - 1) + "]").addClass('first');
                            $(selector + " .object[rel=" + partial_selector + (currentIndex) + "]").removeClass('first');
                            $(selector + " .object[rel=" + partial_selector + (currentIndex + 3) + "]").addClass('hidden');
                            currentIndex -= 1;
                        }
                        if (currentIndex == minIndex) {
                            $(selector + ' .prev').addClass('disabled');
                        }
                    }
                    return false;
                });

                $(selector + " .next").click(function() {
                    if ($(this).hasClass('disabled')) {

                    } else {
                        if (currentIndex + 4 <= maxIndex) {
                            $(selector + " .prev").removeClass('disabled');
                            $(selector + " .object[rel=" + partial_selector + currentIndex + "]").removeClass('first');
                            $(selector + " .object[rel=" + partial_selector + currentIndex + "]").addClass('hidden');
                            $(selector + " .object[rel=" + partial_selector + (currentIndex + 1) + "]").addClass('first');
                            $(selector + " .object[rel=" + partial_selector + (currentIndex + 4) + "]").removeClass('hidden');
                            currentIndex += 1;
                        }
                        if (maxIndex <= currentIndex + 4) {
                            $(selector + ' .next').addClass('disabled');
                        }
                    }
                    return false;
                });
            }
        }
    }
})(jQuery);

$(function() {
    $('.objects_slider').imageSlider('os_');
    $('.photoslider').imageSlider('hps_');

    $(".photoslider .object").lightBox({
        fixedNavigation: true,
        overlayBgColor: '#FFF',
        overlayOpacity: 0.6,

        imageLoading: 'http://leandrovieira.com/projects/jquery/lightbox/images/lightbox-btn-loading.gif',
        imageBtnClose: 'http://leandrovieira.com/projects/jquery/lightbox/images/lightbox-btn-close.gif',
        imageBtnPrev: 'http://leandrovieira.com/projects/jquery/lightbox/images/lightbox-btn-prev.gif',
        imageBtnNext: 'http://leandrovieira.com/projects/jquery/lightbox/images/lightbox-btn-next.gif',
        containerResizeSpeed: 0,

        txtImage: 'Image',
        txtOf: 'de'
    });

    $(".county").change(function(event){
        $.ajax({
            dataType: "json",
            type: "GET",
            url: "/counties/ajax-municipalities/" + $('.county').attr('value'),
            success: function(data, textStatus) {
                $('.municipality').html('');
                for(var index in data) {
                    $('.municipality').append('<option value="' + data[index].id + '">' + data[index].municipality + '</option>');
                }
                $('.municipality').val('');
            }
        })
    });


    $('.print').click(function(){window.print();return false;});
    $("form :checkbox").each(function(){$(this).addClass('check')});

    // ajaxForm
    $(".newsletter form").submit(
        function(event)
        {
            var e_mail_address = $.trim($('.newsletter form [name="email"]').val());
            var isValid = isValidEMailAddress(e_mail_address);

            if (isValid) {
                $(".newsletter .error").addClass('hidden');
                $.ajax({
                    type: "POST",
                    global: false,
                    cache: false,
                    url:  $(".newsletter form").attr("action"),
                    data: ({email: e_mail_address}),
                    dataType: "json",
                    complete:
                        function(XMLHttpRequest, textStatus) {
                            if (textStatus === "success") {
                                $(".newsletter .error").addClass('hidden');
                                $(".newsletter .success").removeClass('hidden');
                                $('.newsletter form [name="email"]').val('');
                            } else {
                                $(".newsletter .error").removeClass('hidden');
                                $(".newsletter .success").addClass('hidden');
                                $('.newsletter form [name="email"]').val(e_mail_address);
                            }
                        }
                });
            } else {
                $(".newsletter .success").addClass('hidden');
                $(".newsletter .error").removeClass('hidden');
            }
            return false;
        }
    );

    $('.user-types input[type=checkbox]').click(
        function (event) {
            handleCompany();
        }
    );

    $('.user-types input[type=checkbox]').change(
        function (event) {
            handleCompany();
        }
    );

    $(".add-your-site form").submit(
        function(event) {
            var isValid = true;
            $(".add-your-site form :input").each(
                function() {
                    isValid &= testIsValid(this);
                }
            );

            return handleIsValid($('.add-your-site .error:first'), event, isValid);
         }
    );

    $('.contact-us form').submit(
        function(event) {
            var isValid = true;
            $('.contact-us form :input').each(
                function() {
                    isValid &= testIsValid(this);
                }
            );

            return handleIsValid($('.contact-us .error:first'), event, isValid);
        }
    );

    $('.writecomment form').submit(
        function(event) {
            var isValid = true;

            if ($('.writecomment form input[name=email]').length) {
                isValid &= isValidEMailAddress($.trim($('.writecomment form input[name=email]').val()));
            }

            $('.writecomment form :input').each(
                function() {
                    isValid &= testIsValid(this);
                }
            );

            return handleIsValid($('.writecomment .error:first'), event, isValid);
        }
    );

    $(".registration form").submit(
        function(event)
        {
            var isValid = true;
            $(".registration form :text").each(
                function() {
                    isValid &= testIsValid(this);
                }
            );

            return handleIsValid($(".registration .error:first"), event, isValid);
        }
    );

    $('.contact-me form').submit(
        function(event) {
            var currentYear = new Date().getFullYear();
            var year    = parseInt($.trim($('.contact-me form [name="year"]').val()));

            var isValid = true;
            isValid    &= $('.contact-me form [name="prenuptial-agreement"]').is(':checked');
            isValid    &= new String(year).length == 4;
            isValid    &= !isNaN(year);
            isValid    &= !(year >= currentYear);
            isValid    &= !(year <= (currentYear - 120));
            isValid    &= !isNaN(parseInt($.trim($('.contact-me form [name="amount"]').val())));
            isValid    &= !isNaN(parseInt($.trim($('.contact-me form [name="net-monthly-salary"]').val())));
            isValid    &= !isNaN(parseInt($.trim($('.contact-me form [name="cnp"]').val())));
            isValid    &= new String($.trim($('.contact-me form [name="cnp"]').val())).length == 13;

            if (handleIsValid($(".contact-me .error:first"), event, isValid)) {
//                doGoal();
                return true;
            } else {
                return false;
            }
        }
    );

    $(".password").change(function() {
        $('#password-strength').attr('class', 's' + passwordStrength(this.value, $('.e-mail').attr('value')));
    });

    $(".password").focus(
        function(event) { $(".passwords-not-the-same").addClass('hidden'); }
    );

    $(".repeat-password").focus(
        function(event) { $(".passwords-not-the-same").addClass('hidden'); }
    );

    $(".repeat-password").blur(
        function(event) { executePasswordPolicy(event); }
    );

    $('a.search-again').click(
        function(event) {
            event.preventDefault();
            $("#searchAgain").toggle();
            $(".savesearch").toggle();
            $("#searchResult").toggle();
            return false;
        }
    );

    $(':reset').click(
        function(event)
        {
            event.preventDefault();
            $('#searchAgain select').each(function(){$(this).val('')});
            $('#searchAgain :text').each(function(){$(this).attr('value', null)});
            $('#searchAgain :checkbox').each(function(){$(this).attr('checked', false)});
            return false;
        }
    );

  // add a "rel" attrib if Opera 7+
     if(window.opera) {
         if ($("a.jqbookmark").attr("rel") != ""){ // don't overwrite the rel attrib if already set
             $("a.jqbookmark").attr("rel","sidebar");
         }
     }

     $("a.jqbookmark").click(function(event){
         event.preventDefault(); // prevent the anchor tag from sending the user off to the link
         var url = this.href;
         var title = this.title;

         if (window.sidebar) { // Mozilla Firefox Bookmark
             window.sidebar.addPanel(title, url,"");
         } else if( window.external ) { // IE Favorite
             window.external.AddFavorite( url, title);
         } else if(window.opera) { // Opera 7+
             return false; // do nothing - the rel="sidebar" should do the trick
         } else { // for Safari, Konq etc - browsers who do not support bookmarking scripts (that i could find anyway)
              alert('Unfortunately, this browser does not support the requested action,'
              + ' please bookmark this page manually.');
         }
     });

    if($(".birthdate").val() == "0000-00-00 00:00:00") {
        $(".birthdate").val(new Date("01/06/" + ((new Date()).getFullYear() - 30)).asString());
    }

    $(".birthdate").blur(function(event)
    {
        var isValid  = (boolean)($(this).val().trim().length == 0);
            isValid &= (boolean)($(this).val().trim().length != 10);
        if (isValid) {
            $(this).removeClass('error');
        } else {
            $(this).addClass('error');
        }
    });

    $(".birthdate").datePicker({showYearNavigation: true, selectWeek: true, clickInput: true, startDate: '01/01/' + ((new Date()).getFullYear() - 120), endDate: '31/12/' + ((new Date()).getFullYear() - 10)}).trigger('change');

    if($(".date-completion").val() == "0000-00-00 00:00:00") {
        $(".date-completion").val(new Date("01/06/" + ((new Date()).getFullYear())).asString());
    }
    $(".date-completion").blur(function(event)
    {
        var isValid  = (boolean)($(this).val().trim().length == 0);
            isValid &= (boolean)($(this).val().trim().length != 10);
        if (isValid) {
            $(this).removeClass('error');
        } else {
            $(this).addClass('error');
        }
    });
    $(".date-completion").datePicker({showYearNavigation: true, selectWeek: true, clickInput: true, startDate: '01/01/' + ((new Date()).getFullYear()), endDate: '31/12/' + ((new Date()).getFullYear() + 120)}).trigger('change');

    /* pages/projects/detail */
    $("#yahoo").click(function(event){
        var projectID = $(this).attr('rel');
        $("body").append('<div id="yahoo-container" style="position:fixed;top:0;bottom:0;left:0;right:0;background-color:#000000;opacity:0.6;filter:alpha(opacity:60);-moz-opacity: 0.6;-khtml-opacity: 0.6;"></div>'
                       + '<div id="yahoo-container-content" style="position:absolute;top:50%;left:50%;'
                       + 'margin:-200px 0 0 -200px;width:400px;height:420px;border:0;">'
                       + '<div id="close_yahoo_map" onclick="$(\'#yahoo-container-content\').remove(); $(\'#yahoo-container\').remove();" style="background-color:#FFFFFF;width:100%;padding: 3px 0;text-align:right;color:#FF0000;font-weight:bold;cursor:pointer;">CLOSE ( X )&nbsp</div>'
                       + '<iframe id="yahoo-map" style="text-align:center;position:relative;'
                       + 'width:400px;height:400px;border:0"'
                       + 'scrolling="no"'
                       + 'src="/yahoo/project/'
                       + projectID + '"></iframe>');
        return false;
    });

    $("input[name=land]").click(
        function(event) {
            if ($("input[name=land]").is(":checked")) {
                $("select[name=rooms]").addClass('disabled');
                $("select[name=rooms]").val(0);
                $("select[name=rooms]").attr('readonly', true);
                $("select[name=rooms]").attr('disabled', true);
            } else {
                $("select[name=rooms]").removeClass('disabled');
                $("select[name=rooms]").removeAttr('readonly');
                $("select[name=rooms]").removeAttr('disabled');
            }
        }
    );
    
    if ($(".j-check-int").length!=0) {
        $(".j-check-int").keyup(function() {
            var val = this.value;
            val = val.replace(/[^0-9-]/gi, '');
            this.value = val;
        });
    }
});