﻿function WheelMake(input, wheel, min, max) {
    WheelSet(input, wheel, input.val(), min, max);
    wheel.find("div").bind("mousedown", function(event) {
        wheel.data("mouseState", true);
        return false;
    });
    wheel.find("input").bind("keyup blur", function(event) {
        var i = parseInt(input.val(), 10);
        if (!i) {
            i = min;
            input.val(i);
        }
        if (i < min) i = min;
        if (i > max) i = max;
        if (event.type == "blur") input.val(i);
        WheelSet(input, wheel, i, min, max);
    });
    $(document).bind("mouseup", function(event) {
        wheel.data("mouseState", false);
    }).bind("mousemove", function(event) {
        if (wheel.data("mouseState")) {
            var r = wheel.outerWidth() / 2;
            var angle = Math.atan2(event.pageX - wheel.offset().left - wheel.outerWidth() / 2, event.pageY - wheel.offset().top - wheel.outerHeight() / 2);
            wheel.find("div").css({
                top: wheel.outerHeight() / 2 + Math.cos(angle) * r - wheel.find("div").outerWidth() / 2,
                left: wheel.outerWidth() / 2 + Math.sin(angle) * r - wheel.find("div").outerHeight() / 2
            });
            var p = 1 - (angle + Math.PI) / (Math.PI * 2);
            input.val(Math.round(min + p * (max - min)));
            return false;
        }
    });
}

function WheelSet(input, wheel, val, min, max) {
    var p = ((val - min) / (max - min)) * 2;
    var m = -p * Math.PI - Math.PI;
    var r = wheel.outerWidth() / 2;
    wheel.find("div").css({
        top: wheel.outerHeight() / 2 + Math.cos(m) * r - wheel.find("div").outerWidth() / 2,
        left: wheel.outerWidth() / 2 + Math.sin(m) * r - wheel.find("div").outerHeight() / 2
    });
}