﻿"use strict";

(function ($) {

    var checkboxChange = function (event) {
        var $input = $(this), $wrapper = $input.parent('.PWP-inputWrapper');
        if ($input.prop('checked')) {
            $wrapper.addClass('checked');
        } else {
            $wrapper.removeClass('checked');
        }
    };

    var radiobuttonChange = function (event) {
        var $input = $(this), $wrapper = $input.parent('.PWP-inputWrapper');
        if ($input.prop('checked')) {
            $wrapper.addClass('checked');
        } else {
            $wrapper.removeClass('checked');
        }
    };

    var triggerClickAndChangeOnClick = function (event) {
        event.preventDefault();
        var $this = $(this), $wrapper = $this.parent('.PWP-inputWrapper'), $input = $wrapper.children('input');
        // workaround for IE validators
        if (typeof $input.get()[0].Validators !== 'undefined') {
            this.Validators = $input.get()[0].Validators;
        }
        $input.click();
        $('.PWP-inputWrapper > input[name="' + $input.attr('name') + '"]').each(function () { $(this).triggerHandler('change'); });
        // workaround for radiobutton validator
        if (typeof this.Validators !== 'undefined') {
            for (var i = 0; i < this.Validators.length; i++)
                ValidatorEnable(this.Validators[i], this.Validators[i].enabled);
        }
    };

    var triggerClickOnSpace = function (event) {
        if (event.which == '32') {
            event.preventDefault();
            $(this).click();
        }
    };

    var tabClick = function (event) {
        event.preventDefault();
        var $this = $(this), $wrapper = $this.closest('.PWP-tabsWrapper'), $tab = $('#' + $this.attr('rel'));
        $wrapper.find('> div, > ul > li').removeClass('active');
        $this.parent().addClass('active');
        $tab.addClass('active');
        var tabIndex = $wrapper.find('> ul > li').index($this.parent());
        $wrapper.trigger('activetabchanged', [tabIndex]);
    };

    /* calculate tip position relative to the trigger */
    var getPosition = function (trigger, tip, conf) {

        // get origin top/left position
        var top = conf.relative ? trigger.position().top : trigger.offset().top,
        left = conf.relative ? trigger.position().left : trigger.offset().left,
        pos = conf.position[0];

        top -= tip.outerHeight() - conf.offset[0];
        left += trigger.outerWidth() + conf.offset[1];

        // iPad position fix
        if (/iPad/i.test(navigator.userAgent)) {
            top -= $(window).scrollTop();
        }

        // adjust Y
        var height = tip.outerHeight() + trigger.outerHeight();
        if (pos == 'center') { top += height / 2; }
        if (pos == 'bottom') { top += height; }


        // adjust X
        pos = conf.position[1];
        var width = tip.outerWidth() + trigger.outerWidth();
        if (pos == 'center') { left -= width / 2; }
        if (pos == 'left') { left -= width; }

        return { top: top, left: left };
    };

    var tooltipInit = function ($icon) {
        var $tooltip = $icon.data('tooltip');
        if (!$tooltip) {
            $tooltip = $icon.next();
            $tooltip.detach().appendTo(document.body);
            $icon.data('tooltip', $tooltip);
        }
        return $tooltip;
    };

    var tooltipEnter = function (event){
        var $icon = $(this), $tooltip = tooltipInit($icon);

        $('.PWP-tooltipWrapper').hide();

        // set position
        var pos = getPosition($icon, $tooltip, { position: ['center', 'right'], offset: [0, 15], relative: false });
        $tooltip.css({ position: 'absolute', top: pos.top, left: pos.left });
        $tooltip.fadeIn();
    };

    var tooltipLeave = function () {
        $('.PWP-tooltipWrapper').fadeOut();
    };

    var dropdownToggle = function (event) {
        var $wrapper = $(this), $ul = $wrapper.children('ul'), $select = $wrapper.children('select');
        if ($select.prop('disabled')) {
            return;
        }
        $ul.toggle();
        event.stopPropagation();
    };

    var dropdownChange = function (event) {
        var $select = $(this), $wrapper = $select.closest('.PWP-inputWrapper'), $li = $wrapper.find('ul a[data-index="' + this.selectedIndex + '"]').closest('li');
        $wrapper.find('li.selected').removeClass('selected');
        $li.addClass('selected');
        $wrapper.find('> span > span').html(this.options[this.selectedIndex].text);
    };

    var dropdownClick = function (event) {
        var $link = $(this), $wrapper = $link.closest('.PWP-inputWrapper'), $select = $wrapper.children('select');
        if ($select.prop('disabled')) {
            return;
        }
        $select.get(0).selectedIndex = $link.data('index');
        // workaround for IE validators
        if (typeof $select.get()[0].Validators !== 'undefined') {
            this.Validators = $select.get()[0].Validators;
        }
        $select.change();
    };

    var buttonEnabledChanged = function (event, enabled) {
        var $button = $(this), $wrapper = $button.closest('.PWP-inputWrapper');
        if (enabled) {
            $button.removeClass('disabled');
            $wrapper.removeClass('disabled');
        }
        else {
            $button.addClass('disabled');
            $wrapper.addClass('disabled');
        }
    };

    var bodyClick = function (event) {
        $('.PWP-inputWrapper.PWP-dropdownlist > ul').hide();
    };



    $(function () {
        $('.PWP-inputWrapper.checkbox > input').change(checkboxChange).bind('sync', checkboxChange).each(function () { $(this).triggerHandler('sync'); });
        $('.PWP-inputWrapper.radiobutton > input').change(radiobuttonChange).bind('sync', radiobuttonChange).each(function () { $(this).triggerHandler('sync'); });
        $('.PWP-inputWrapper.checkbox > a, .PWP-inputWrapper.checkbox > label, .PWP-inputWrapper.radiobutton > a, .PWP-inputWrapper.radiobutton > label').click(triggerClickAndChangeOnClick);
        $('.PWP-inputWrapper.checkbox > a, .PWP-inputWrapper.radiobutton > a').keydown(triggerClickOnSpace);
        $('.PWP-tabsWrapper > ul > li > a').click(tabClick);
        $('.PWP-tooltip').mouseenter(tooltipEnter).mouseleave(tooltipLeave);
        $('.PWP-inputWrapper.PWP-dropdownlist').click(dropdownToggle);
        $('.PWP-inputWrapper.PWP-dropdownlist select').live('change', dropdownChange).live('sync', dropdownChange).each(function () { if (this.selectedIndex > 0) $(this).triggerHandler('sync'); });
        $('.PWP-inputWrapper.PWP-dropdownlist > ul a').click(dropdownClick);
        $(".PWP-inputWrapper.button > input").bind('enabledchanged', buttonEnabledChanged);
        $(document.body).click(bodyClick);
    });

})(jQuery);


