
(function($){var a=$.ui.mouse.prototype._mouseMove;$.ui.mouse.prototype._mouseMove=function(b){if($.browser.msie&&document.documentMode>=9){b.button=1};a.apply(this,[b]);}}(jQuery));

(function($) {
    $.fn.swarovski = function(options) {
        var defaults = {
            center: 200,
            pxPerMm: 1,
            side: 'right',
            sclX: 1,
            sclY: 1,
            minX: 0,
            maxX: 400,
            borderMm: 3.1
        };
        options = $.extend(false, defaults, options);
        new Swarovski($(this), options);
    };

    function Swarovski(element, options) {
        this.init(element, options);
    }

    Swarovski.prototype = {
        init: function(element, options) {
            this.element = element;
            this.options = options;
            this.options.scalarStepDegree = 360 / this.options.scalars.length;
            this.values = {};
            for (var i = 1; i <= 4; i++) {
                this.values[i] = {
                    'x': '',
                    'y': ''
                }
                var pointEl = $('#dw' + i);
                pointEl.draggable({
                    appendTo: $('#swarovski'),
                    containment: 'parent'
                });
                pointEl.bind('dragstop', {self: this}, function(e, position) {
                    e.data.self.endDrag($(this), position);
                });
            }
            this.update();
            this.element.bind('click', {self: this}, function(e) {
                var offset = $(this).offset();
                e.data.self.addXtal(e.pageX - offset.left, e.pageY - offset.top);
            });
            // add events
            $('#swarovski_control div.delete input[dw]').bind('click', {self: this}, function(e) {
                var index = $(this).attr('dw');
                e.data.self.removeXtal(index);
                return false;
            });
            $('#swarovski_control ul.swarovski_fields input[type=text]').bind('change', {self: this}, function(e) {
                e.data.self.update();
            });
            $('#swarovski_control input[type=text]').bind('focus', {self: this}, function(e) {
                this.select();
            });
            $('#swarovski_control ul.swarovski_fields a').bind('click', {self: this}, function(e) {
                e.data.self.update();
            });
            $('#swarovski').bind('mousemove', {self: this}, function(e) {
                var offset = $(this).offset();
                var xCoord = (e.pageX - offset.left - e.data.self.options.center) / e.data.self.options.pxPerMm;
                if (e.data.self.options.side == 'left') {
                    xCoord = xCoord*-1;
                }
                var yCoord = ((e.pageY-offset.top-e.data.self.options.center)*-1)/e.data.self.options.pxPerMm;
                e.data.self.updatePosition(xCoord.toFixed(1), yCoord.toFixed(1));
            });
        },
        update: function() {
            var empty = [];
            for (var i = 1; i <= 4; i++) {
                var xInput = $('#s' + i + 'x_field');
                var yInput = $('#s' + i + 'y_field');
                $('input[name=xtal_' + i + '_delete_field]').val(0);
                var xVal = xInput.val();
                var yVal = yInput.val();
                if (xVal && yVal) {
                    var xValPx;
                    if (this.options.side == 'left') {
                        xValPx = this.options.center + (xVal * this.options.pxPerMm*-1);
                    } else {
                        xValPx = this.options.center + (xVal * this.options.pxPerMm);
                    }
                    var yValPx = this.options.center - (yVal * this.options.pxPerMm);
                    if (this.checkPoint(
                        (xVal * this.options.pxPerMm) / this.options.sclX,
                        (yVal * this.options.pxPerMm) / this.options.sclY
                    )) {
                        this.values[i] = {x: xValPx, y: yValPx};
                        if (empty.length) {
                            var m = empty.shift();
                            $('#s' + m + 'x_field').val(xVal);
                            $('#s' + m + 'y_field').val(yVal);
                            $('input[name=xtal_' + m + '_delete_field]').val(0);
                            $('input[name=xtal_' + i + '_delete_field]').val(1);
                            xInput.val('');
                            yInput.val('');
                            this.values[m] = {x: xValPx, y: yValPx};
                            this.values[i] = {x: '', y: ''};
                            empty.push(i);
                        }
                    } else if (!this.values[i].x || !this.values[i].y) {
                        empty.push(i);
                    } else {
                        // set point back to old position
                        var xVar = ((this.values[i].x - this.options.center) / this.options.pxPerMm).toFixed(1);
                        var yVar = ((this.options.center - this.values[i].y) / this.options.pxPerMm).toFixed(1);
                        if (this.options.side == 'left') {
                            xVar = '-' + xVar;
                        }
                        $('#s' + i + 'x_field').val(xVar);
                        $('#s' + i + 'y_field').val(yVar);
                    }
                } else {
                    this.values[i] = {};
                    $('input[name=xtal_' + i + '_delete_field]').val(1);
                    empty.push(i);
                }
            }
            this.drawPoints();
        },
        drawPoints: function() {
            for (var i = 1; i <= 4; i++) {
                var values = this.values[i];
                var pointEl = $('#dw' + i);
                if (values.x && values.y) {
                    pointEl.css('display', 'block');
                    pointEl.css('top', values.y + 'px');
                    pointEl.css('left', values.x + 'px');
                } else {
                    pointEl.css('display', 'none');
                }
            }
        },
        endDrag: function(pointEl, position) {
            var iconMargin = $('#dw1').css('margin-left');
            iconMargin = parseInt(iconMargin);
            if (this.options.side == 'left') {
                iconMargin *= -1;
            }
            if (
                position.position.left + iconMargin >= this.options.minX &&
                position.position.left + iconMargin <= this.options.maxX
            ) {
                var index = pointEl.attr('id').substr(pointEl.attr('id').length - 1);
                if (this.options.side == 'left') {
                    x = (position.position.left - this.options.center) * -1;
                    y = (this.options.center - position.position.top);
                } else {
                    x = (position.position.left - this.options.center);
                    y = (this.options.center - position.position.top);
                }

                var mmX = x / this.options.pxPerMm;
                var mmY = y / this.options.pxPerMm;
                if (this.checkPoint(x / this.options.sclX, y / this.options.sclY)) {
                    $('#s' + index + 'x_field').val(mmX.toFixed(1));
                    $('#s' + index + 'y_field').val(mmY.toFixed(1));
                }
            }
            this.update();
        },
        checkPoint: function(x, y) {
            var iconMargin = $('#dw1').css('margin-left');
            iconMargin = parseInt(iconMargin);
            if (this.options.side == 'left') {
                x = x*-1;
                iconMargin *= -1;
            }
            var posLeft = (Math.round(x * this.options.sclX) + this.options.center) + iconMargin;
            if (
                posLeft < this.options.minX ||
                posLeft > this.options.maxX
            ) {
                return false;
            }
            var distanceToCenter = this.getDistance(0, 0, x, y);
            // get angle for point
            var angle = this.getAngle(0, 0, x, y);
            if (y >= 0) {
                angle = (x < 0) ? 90 + (90 + angle) : angle;
            } else {
                angle = (x < 0) ? 180 + Math.abs(angle) : 360 - angle;
            }
            // get scalar for angle
            var index = Math.round(angle / this.options.scalarStepDegree);
            return (distanceToCenter <= ((this.options.scalars[index] / 100) - this.options.borderMm)  * this.options.pxPerMm);
        },
        getAngle: function(x1, y1, x2, y2) {
            var a = (y1 - y2);
            var b = (x1 - x2);
            //var c = Math.sqrt(Math.pow(a, 2) + Math.pow(b, 2));
            // ? = arccos [(-a2 + b2 + c2)/(2 b c)]
            //var alphaRad = Math.acos((Math.pow(b, 2) + Math.pow(c, 2) - Math.pow(a, 2)) / (2 * b * c));
            var alphaRad = Math.atan(a / b);
            // [winkel(DEG)=winkel(RAD)*(360°/2*pi)]
            var alpha = ((y1 > y2) ? alphaRad * ( -1) : alphaRad) * (180 / Math.PI);
            return alpha;
        },
        getDistance: function(x1, y1, x2, y2) {
            var a = (y1 - y2);
            var b = (x1 - x2);
            return Math.sqrt(Math.pow(a, 2) + Math.pow(b, 2));
        },
        addXtal: function(xPos, yPos) {
            var pointEl = false;
            for (var i = 1; i <= 4; i++) {
                if ($('#dw' + i).css('display') == 'none') {
                    pointEl = $('#dw' + i);
                    break;
                }
            }
            if (pointEl) {
                pointEl.css('display', 'block');
                var pos = {'position': {'left': xPos, 'top': yPos}};
                this.endDrag(pointEl, pos);
            }
        },
        removeXtal: function(index) {
            $('#s' + index + 'x_field').val('');
            $('#s' + index + 'y_field').val('');
            this.update();
        },
        updatePosition: function(x, y) {
            $('#swarovski_control .x-info').html(x);
            $('#swarovski_control .y-info').html(y);
        }
    }
})(jQuery);
