$(document).ready(function() {

    /** *********************************************************************
     *                          SQSimpleChoice
     */

    /** hide all open inputs */
    $("input.SQSCOpenInput").hide();

    /** show them on start */
    $("input.SQSCOpenS").each(function() {
        if ($(this).attr("checked")) {
            $(this).parents(".question").find("input.SQSCOpenInput").show();
        }
    });

    /** show them on change */
    $("input.SQSCOpenS").change(function() {
        if ($(this).attr("checked")) {
            $(this).parents(".question").find("input.SQSCOpenInput").show();
        }
    });
    
    /** hide them on change */
    $("input.SQSCOpen").change(function() {
        if ($(this).attr("checked")) {
            $(this).parents(".question").find("input.SQSCOpenInput").hide();
        }
    });
    
    /** the same for select type */
    $("select.SQSCSelect").each(function() {
        if ($(this).children(":selected").hasClass("SQSCOpenS")) {
            $(this).parents(".question").find("input.SQSCOpenInput").show();
        }
    });
    $("select.SQSCSelect").change(function() {
        if ($(this).children(":selected").hasClass("SQSCOpenS")) {
            $(this).parents(".question").find("input.SQSCOpenInput").show();
        } else {
            $(this).parents(".question").find("input.SQSCOpenInput").hide();
        }
    });

    /** the same for table td type */
    $("table.SQSCTable td.hover").click(function(event) {
        event.stopImmediatePropagation();
        var input = $(this).find("input[type='radio']");
        $(input).attr("checked", "checked");
        if ($(input).hasClass("SQSCOpenS")) {
            $(this).parents(".question").find("input.SQSCOpenInput").show();
        } else {
            $(this).parents(".question").find("input.SQSCOpenInput").hide();
        }
    });

    /** *********************************************************************
     *                          SQMultiChoice
     */

    /** start exlude */

    $("table.SQMCTable input[type='checkbox']").each(function(event) {
        /** apply exclude */
        if ($(this).attr("checked")) SQMCexclude(this, $(this).parents(".SQMCTable"));
    });

    /** click action */

    $("table.SQMCTable td.hover").click(function(event) {
        event.stopImmediatePropagation();
        var input = $(this).find("input[type='checkbox']");

        /** if disabled do not change */
        if ($(input).is(":disabled")) return;

        /** change state */
        if ($(input).attr("checked")) {$(input).attr("checked", "");} else {$(input).attr("checked", "checked");}

        /** apply min-max constraints */
        SQMCminmax(input, $(input).parents(".SQMCTable"));
        
        /** apply exclude */
        SQMCexclude(input, $(input).parents(".SQMCTable"));
    });

    $("table.SQMCTable input[type='checkbox']").click(function(event) {
        event.stopImmediatePropagation();

        /** apply min-max constraints */
        SQMCminmax(this, $(this).parents(".SQMCTable"));

        /** apply exclude */
        SQMCexclude(this, $(this).parents(".SQMCTable"));
    });

    $("table.SQMCTable label").click(function(event) {
        event.stopImmediatePropagation();
    });

    $("table.SQMCTable input[type='text']").click(function(event) {
        event.stopImmediatePropagation();
    });

    /** *********************************************************************
     *                          SQSemanticDifferential
     */

    $(".SQSDTable").find("select.slider").each(function() {
        
        /** variables */
        var slider_value_input = $(this).siblings(".slider_value")
        var slider_value_integer = parseInt($(slider_value_input).val())
        var slider_value = isNaN(slider_value_integer) ? 50 : slider_value_integer
        var slider_step = ($(this).siblings(".slider_step").val()) ? parseInt($(this).siblings(".slider_step").val()) : 1;
        var widthOfSlider = 200

        var sliderSelect = $(this)

        var sliderBox = $('<div class="sliderBox"></div>').attr("id", $(this).attr("id") + "_sliderBox")
        sliderBox.css("width", widthOfSlider + "px")

        var spanBox = $('<div class="sliderWidget"></div>').attr("id", $(this).attr("id") + "_slider")
        spanBox.appendTo(sliderBox)

        var toolTipBox = $('<div class="tooltipSlider"></div>').attr("id", $(this).attr("id") + "_tooltip")
        
        toolTipBox.hide()
        spanBox.before(toolTipBox)

        var slideChange = function(event, ui) {
            if(toolTipBox.css("display") == "none") {
                toolTipBox.show()
            }

            positionOfHandler = $(ui.handle).position()
            
            sliderBoxWidth = sliderBox.outerWidth(true)

            margin = (sliderBoxWidth - widthOfSlider) / 2
            positionOfHandler.left += margin - (toolTipBox.outerWidth(true) / 2)

            /** save margin left and right */
            if(positionOfHandler.left < margin) {
                positionOfHandler.left = margin
            }

            toolTipBox.text($(this).slider("option", "value"))
            toolTipBox.css("left", positionOfHandler.left)

            sliderSelect[0].selectedIndex = ui.value / slider_step;
        }

        spanBox.slider({
            value: slider_value,
            step: slider_step,
            width: widthOfSlider + "px",
            range: "min",
            animate: false,
            stop: slideChange,
            start: slideChange,
            slide: slideChange,
            change: slideChange
        })

        $(this).change(function(){
            var thisIndex = jQuery(this).find('option:selected').get(0).index;
            var thisLeft = Math.ceil((thisIndex) * slider_step);
            spanBox.slider("value", thisLeft, thisIndex);
        });

        $(this).before(sliderBox)

        $(this).hide()
        $(this).append($('<option selected="selected" class="optionNull" value="null"></option>'))

        if (!isNaN(slider_value_integer)) {
            $(this).children("[value='"+slider_value+"']").attr("selected", true);
            var thisIndex = jQuery(this).find('option:selected').get(0).index;
            var thisLeft = Math.ceil((thisIndex) * slider_step);
            spanBox.slider("value", thisLeft, thisIndex);
        }
    });

    /** reset */
    $(".SQSDTable").each(function(){
        var sqSemanticDiff =  $(this)

        /** reset */
        $(this).parent().next(".SQReset").find("label").addClass("SQResetActivate") // prevent two times binding
        $(this).parent().next(".SQReset").find("label").click(function() {
            if (confirm($(this).attr('XActionConfirm'))) {
                $(sqSemanticDiff).find("select.slider").each(function() {
                    $(this).find(":selected").attr("selected", "");
                    $(this).trigger("change")
                    $(this).find(".optionNull").attr("selected","selected")
                })
                $(sqSemanticDiff).find(":checked").attr("checked", false)
                $(sqSemanticDiff).find(".tooltipSlider").hide()
            }
        })
    })

    /** *********************************************************************
     *                          SQRanking
     */

    /** make both lists sortable */
    $(".SQRanking ul, .SQRanking ol").sortable({
        placeholder: "placeholder",
        forcePlaceholderSize: true
    });

    /** connect both sortable lists */
    $(".SQRanking ul, .SQRanking ol").each(function() {
        var connclass = $(this).attr("XConnectWith");
        $(this).sortable( "option", "connectWith", connclass );
    });

    /** sortable specific */
    $(".SQRanking").each(function() {

        var available = $(this).find("ul.available")
        var ranking = $(this).find("ol.ranking")

        var maxalert = $(this).attr("SQMCmaxalert")
        var minalert = $(this).attr("SQMCminalert")
        var maxValue = $(this).attr("XValidateMax")
        var minValue = $(this).attr("XValidateMin")
        maxValue = (maxValue) ? parseFloat(maxValue) : null;
        minValue = (minValue) ? parseFloat(minValue) : null;

        /** update ranking indexes */
        $(ranking).bind("sortupdate", function(event, ui) {
            var idx = 1
            $(ranking).find("li").each(function() {
                $(this).find("input").val(idx++)
            })
        });

        /** prevent maximum elements */
        $(ranking).bind("sortreceive", function(event, ui) {

            /** alert for maximum value */
            if (maxValue && $(ranking).children().length > maxValue) {
                $(ui.sender).sortable('cancel');
                alert(maxalert);
            }
        })

        /** alert for minimum value */
        $(ranking).bind("sortremove", function(event, ui) {
            $(ui.item).find("input").val("")
            if (minValue && $(ranking).children().length < minValue) {
                alert(minalert);
            }
        })

        /** cut and move icons */
        $(this).find("ul, ol").each(function() {

            $(this).find("img.moveImg").click(function() {

                if (maxValue && $(ranking).children().length >= maxValue) {
                    alert(maxalert);
                    return;
                }

                var element = $(this).parent().parent()
                $(element).appendTo(ranking)

                $(ranking).trigger("sortupdate")
            })

            $(this).find("img.deleteImg").click(function() {

                var element = $(this).parent().parent()

                $(element).find("input").val("")
                $(element).appendTo(available)

                $(ranking).trigger("sortupdate")

                if (minValue && $(ranking).children().length < minValue) {
                    alert(minalert);
                }
            })
        })
    })

    /** reset */
    $(".SQRanking").each(function() {

        available = $(this).find("ul.available")
        ranking = $(this).find("ol.ranking")

        $(this).parent().next(".SQReset").find("label").click(function(event) {

            event.stopImmediatePropagation();

            /** move all items to available */
            if (confirm($(this).attr('XActionConfirm'))) {

                $(ranking).children().each(function() {
                    $(this).appendTo(available)
                })
            }
        })

//        var sqRanking =  $(this)
//
//        /** reset */
//        $(this).parent().next(".SQReset").find("label").addClass("SQResetActivate") // prevent two times binding
//        $(this).parent().next(".SQReset").find("label").click(function() {
//            /** move all items to available */
//            if (confirm($(this).attr('XActionConfirm'))) {
//                availableUl = sqRanking.find(".available ul")
//                sqRanking.find(".ranking ol li").each(function(){
//                    $(this).appendTo(availableUl)
//                })
//                $(this).find(".XValidateError").removeClass("XValidateError")
//            }
//        })
    })
    
    
    

    /** *********************************************************************
     *                          SQNumberInput
     */

    $(".SQNumber").each(function() {
      
        var pointsSum = $(this).find(".pointsSum")
        var pointsLeft = $(this).find(".pointsLeft")
        var pointsLeftValue = 0
        var inputTotal = $(this).find("input[name=total]")
/* mine */        pointsLeftValue = parseInt($(inputTotal).val())
        var maxValue = $(this).find("input:first").not(":hidden").attr("XValidateMax")
      
        var sqNumber = $(this)

/* mine */
//        if(pointsLeft) {
//            pointsLeftValue = pointsLeft.text()
//            if(pointsLeftValue != "")
//                pointsLeftValue = parseFloat(pointsLeftValue)
//        }

        var updatePointsSum = function() {
            sum = 0
            sqNumber.find("input").not(":hidden").not(".XValidateError").each(function() {
                val = $(this).val()
                if(val != "") {
                    sum += parseFloat($(this).val())
                }
            })
            pointsSum.text(sum)

            if(pointsLeft) {
                pointsLeft.text(pointsLeftValue - sum)
            }

        }

        $(this).find("input").not(":hidden").not(".XValidateError").each(function() {
        
            $(this).blur(function() {
                updatePointsSum()
          
                /** need to update fields */
          
                if(pointsLeft) {
                    valueLeft = parseFloat(pointsLeft.text())
            
                    sqNumber.find("input").not(":hidden").each(function() {

                        if($(this).filter(".XValidateError").length == 0) {
                            thisValue = parseFloat($(this).val())
                        } else {
                            thisValue = 0
                        }
                        currentMaxValue = parseFloat($(this).attr("XValidateMax"))

                        fieldValue = (valueLeft + (isNaN(thisValue) ? 0 : thisValue))
                        if(fieldValue > maxValue)
                            fieldValue = maxValue

                        $(this).attr("XValidateMax", fieldValue)
                    })
            
                }
            })
        
        })
      
        /** reset button */
        if(pointsSum) {
            $(this).parent().next(".SQReset").find("label").addClass("SQResetActivate") // prevent two times binding

            $(this).parent().next(".SQReset").find("label").click(function(event) {

                if (confirm($(this).attr('XActionConfirm'))) {
                    $(this).parents(".question").find(".rform").find("textarea, input[type='text']").val("");
                    pointsSum.text("0")
                    pointsLeft.text(pointsLeftValue)
                    sqNumber.find("input").not(":hidden").each(function() {
                        $(this).attr("XValidateMax", maxValue)
                    })

                    sqNumber.find(".XValidateError").removeClass("XValidateError")
                }
          
            })
        
        }
    })


    /** *********************************************************************
     *                          SQMatrixSingleChoice
     */

    /** highlight labels for a hover row and column */
    $(".SQMatrixTable td.hover").hover(function() {
        $(this).parents(".SQMatrixTable").find(".hoverrow"+$(this).attr("hoverrow")).addClass("hoverOver");
        $(this).parents(".SQMatrixTable").find(".hovercol"+$(this).attr("hovercol")).addClass("hoverOver");
    }, function() {
        $(this).parents(".SQMatrixTable").find(".hoverrow"+$(this).attr("hoverrow")).removeClass("hoverOver");
        $(this).parents(".SQMatrixTable").find(".hovercol"+$(this).attr("hovercol")).removeClass("hoverOver");
    });

    $(".SQMatrixTableSingle td.hover").click(function(event) {
        event.stopImmediatePropagation();
        var input = $(this).find("input");
        $(input).attr("checked", "checked");
        var table = $(input).parents(".SQMatrixTableSingle");
        if ($(table).hasClass("singleall")) SQMSCsingle(input, table);
    });

    $(".SQMatrixTableSingle input[type='radio']").click(function(event) {
        event.stopImmediatePropagation();
        var table = $(this).parents(".SQMatrixTableSingle")
        if ($(table).hasClass("singleall")) SQMSCsingle($(this), table);
    });

    /** *********************************************************************
     *                          SQMatrixMultiChoice
     */

    /** start exlude */

    $("table.SQMatrixTableMulti input[type='checkbox']").each(function(event) {
        /** apply exclude */
        if ($(this).attr("checked")) SQMCexclude(this, $(this).parents("tr"));
    });

    $(".SQMatrixTableMulti td.hover").click(function(event) {
        event.stopImmediatePropagation();
        var input = $(this).find("input[type='checkbox']");

        /** if disabled do not change */
        if ($(input).is(":disabled")) return;

        /** change state */
        if ($(input).attr("checked")) {$(input).attr("checked", "");} else {$(input).attr("checked", "checked");}

        /** apply min-max constraints */
        SQMCminmax(input, $(input).parents("tr"));

        /** apply exclude */
        SQMCexclude(input, $(input).parents("tr"));
    });

    $(".SQMatrixTable input[type='checkbox']").click(function(event) {
        event.stopImmediatePropagation();

        /** apply min-max constraints */
        SQMCminmax(this, $(this).parents("tr"));

        /** apply exclude */
        SQMCexclude(this, $(this).parents("tr"));
    });

    /** *********************************************************************
     *                          RESET
     */
    $(".SQReset > label").not(".SQResetActivate").click(function() {
        if (confirm($(this).attr('XActionConfirm'))) {
            $(this).parents(".question").find(".rform").find(":checked").attr("checked", "");
            $(this).parents(".question").find(".rform").find("textarea, input[type='text']").val("");
            $(this).parents(".question").find(".rform").find(":selected").attr("selected", "");
            $(this).parents(".question").find(".rform").find("input.SQSCOpenInput").hide();
            $(this).parents(".question").find(".rform").find(":disabled").removeAttr('disabled');
            $(this).parents(".question").find(".XValidateError").removeClass("XValidateError")
        }
    });

});

/** when checkbox state changes in SQMultiChoice sets exclude mode */
function SQMCexclude(input, group) {
    if ($(input).hasClass("SQMCExclude1")) {
        if ($(input).attr("checked")) {
            $(group).find("input").attr('disabled', true);
            $(input).parent().find("input").removeAttr('disabled');
        } else {
            $(group).find("input").removeAttr('disabled');
        }
    }
}

/** checks min and max constraints */
function SQMCminmax(input, group) {

    /** get min-max constraints and count */
    var min = parseInt($(group).attr("SQMCmin"));
    var max = parseInt($(group).attr("SQMCmax"));
    var count = $(group).find(":checked").length;

    /** if input is checked */
    if ($(input).is(":checked")) {

        /** check max */
        if (!$(input).hasClass("SQMCExclude1") && max && count > max) {
            $(input).attr("checked", "");
            var maxalert = $(group).attr("SQMCmaxalert")
            alert(maxalert);
            return false;
        }

    /** else */
    } else {

        /** check min */
        if (min && count < min) {
            //$(input).attr("checked", "checked");
            var minalert = $(group).attr("SQMCminalert")
            alert(minalert);
            return false;
        }
    }
    
    return true;
}

function SQMSCsingle(input, table) {
    
    /** get my column number */
    var col = parseInt($(input).parent().attr("hovercol"));

    /** uncheck column radio buttons */
    $(table).find("td[hovercol='"+col+"']").each(function() {
        $(this).find("input[type='radio']").removeAttr("checked");
    });

    /** check input */
    $(input).attr("checked", true);
}

