﻿function showToolTip(tooltipControl, ratingValue, ratingText) {
    var tControl = jQuery('#' + tooltipControl);

    if (jQuery.trim(ratingText) == '') {
        ratingText = 'Rating:';
    }

    var toolTipDescription = ratingText + ratingValue;
    
    tControl.css("display", "");
    tControl.html(toolTipDescription);
    tControl.css("top", "25px");
    tControl.css("left", "30px");
}

function hideToolTip(tooltipControl) {
    var tControl = jQuery('#' + tooltipControl);
    tControl.css("display", "none");
}

function initializeRatingControl(ratingLayerControl, ratingOverlayControl, tooltipControl, stateControl, lowerboundBound, upperBound,
                        groupCount, stepValue, iconCount, controlWidth, controlHeight, onImageURL, offImageURL, hoverImageURL, 
                        ratingText, animateMode, isAutoPostbackEnabled, postbackControl) {

    var layerElement = jQuery('#' + ratingLayerControl);
    var overlayElement = jQuery('#' + ratingOverlayControl);
    var stateControlElement = jQuery('#' + stateControl);
    var tooltipElement = jQuery('#' + tooltipControl);
    var postbackElement = jQuery('#' + postbackControl);
    
    lowerboundBound = parseFloat(lowerboundBound);
    upperBound = parseFloat(upperBound);
    groupCount = parseInt(groupCount);
    stepValue = parseFloat(stepValue);
    iconCount = parseFloat(iconCount);
    controlWidth = parseFloat(controlWidth);
    controlHeight = parseFloat(controlHeight);

    layerElement.mousemove(function(e) {
        rateControl(e, layerElement, overlayElement, tooltipElement, stateControlElement, lowerboundBound, upperBound, groupCount,
            stepValue, iconCount, controlWidth, controlHeight, onImageURL, offImageURL, hoverImageURL,
            ratingText, animateMode, isAutoPostbackEnabled, postbackElement);
    });

    layerElement.hover(function(e) {
    }, function(e) {

        var value = getCurrentSavedRatingValue(stateControlElement);
        var fillPercent = getPercentByValue(value, lowerboundBound, upperBound, groupCount, stepValue, iconCount);
        fillOverlay(overlayElement, stateControlElement, fillPercent, value, 'hoverout', lowerboundBound, upperBound, groupCount, stepValue,
                        iconCount, controlHeight, onImageURL, offImageURL, hoverImageURL,
                        animateMode, isAutoPostbackEnabled, postbackElement);
        hideToolTip(tooltipElement.attr("id"));
    });

    /*layerElement.click(function(e) {
        var fillPercent = overlayElement.css("width").replace('%', '').replace('px', '');
        
        var value = getValueByPercent(fillPercent, lowerboundBound, upperBound, groupCount, stepValue, iconCount);

        fillOverlay(overlayElement, stateControlElement, fillPercent, value, 'click', lowerboundBound, upperBound, groupCount, stepValue,
                            iconCount, controlHeight, onImageURL, offImageURL, hoverImageURL,
                            animateMode, isAutoPostbackEnabled, postbackElement);
    });*/
}

function rateControl(eventObject, layerElement, overlayElement, tooltipElement, stateControlElement, lowerboundBound, upperBound,
                groupCount, stepValue, iconCount, controlWidth, controlHeight, onImageURL, offImageURL, hoverImageURL,
                ratingText, animateMode, isAutoPostbackEnabled, postbackElement) {

    layerElement.css("cursor", "pointer");
    layerElement.css("width", controlWidth + "px");

    var ratingValue = 0;
    var fillPercent = getMovePercent(eventObject, layerElement, groupCount, iconCount, controlWidth);
    var value = 0;
    
    value = getValueByPercent(fillPercent, lowerboundBound, upperBound,  groupCount, stepValue, iconCount);
    fillOverlay(overlayElement, stateControlElement, fillPercent, value, 'hover', lowerboundBound, upperBound, groupCount, stepValue,
                            iconCount, controlHeight, onImageURL, offImageURL, hoverImageURL,
                            animateMode, isAutoPostbackEnabled, postbackElement);
    showToolTip(tooltipElement.attr("id"), value, ratingText);

    layerElement.unbind('click').bind('click', function(e) {
        handleControlClick(stateControlElement, isAutoPostbackEnabled, postbackElement, value);
    });
}

function getMovePercent(e, layerElement, group, icons, controlWidth) {

    var groupCount = group;
    var iconCount = icons;
    var splitValue = 1 / groupCount;

    var cursorPosition = e.pageX - layerElement.offset().left;

    var fullWidth = controlWidth;
    var blockIndex = 0;
    var percentToMove = 0;
    var percentMoved = 0;
    var blockValue = 0;

    percentMoved = Math.round((cursorPosition / fullWidth) * 100);

    blockValue = percentMoved % (100 / iconCount);
    blockIndex = Math.ceil(blockValue / ((100 / iconCount) / (1 / splitValue)));

    if (splitValue < 1) {
        percentToMove = (percentMoved - blockValue) + ((100 / iconCount) * (splitValue * blockIndex));
    }
    else {
        if (blockValue > 0) {
            percentToMove = (percentMoved - blockValue) + (100 / iconCount);
        }
        else {
            percentToMove = 0;
        }
    }
    return percentToMove;
}

function getValueByPercent(fillPercent, lowerBound, upperBound, groupCount, stepValue, iconCount) {

    var perBlockPercent = roundNumber(100 / (iconCount * groupCount), 2);
    var perBlockValue = stepValue;
    var value = 0;
    var valueIndex = 0;
    
    fillPercent = roundNumber(fillPercent, 2);

    valueIndex = parseInt(roundNumber((fillPercent / perBlockPercent), 1));

    if (valueIndex == 1)
        value = lowerBound;
    else if (valueIndex > 1) {
        value = lowerBound + ((valueIndex - 1) * perBlockValue);
    }

    value = parseFloat(roundNumber(value, 2));

    return value;
}

function getPercentByValue(value, lowerBound, upperBound, groupCount, stepValue, iconCount) {

    var perBlockPercent = roundNumber(100 / (iconCount * groupCount), 2);
    var perBlockValue = stepValue;

    var fillPercent = 0;

    if (value == lowerBound) {
        fillPercent = perBlockPercent;
    }
    else {
        fillPercent = (((value - lowerBound) / perBlockValue) + 1) * perBlockPercent;
        fillPercent = roundNumber(fillPercent, 2);
    }

    return fillPercent;
}

function fillOverlay(overlayElement, stateControlElement, percent, value, eventMode, lowerBound, upperBound, groupCount,
            stepValue, iconCount, controlHeight, onImageURL, offImageURL, hoverImageURL, animate, isAutoPostbackEnabled, postbackElement) {

    overlayElement.css("padding", "0px");
    overlayElement.css("height", controlHeight + 'px');

    percent = new String(percent).replace('%', '');
    
    if (eventMode != 'hover') {
        overlayElement.css("background", onImageURL);
    }
    else if (value != getCurrentSavedRatingValue(stateControlElement) && eventMode == 'hover') {
        overlayElement.css("background", hoverImageURL);
    }
    else {
        overlayElement.css("background", onImageURL);
    }

    overlayElement.css("display", "");
    overlayElement.css("width", percent + '%');
    
    /*if (animate == '1') {
        if (eventMode != 'clear') {
            overlayElement.css("width", "0%");
        }

        overlayElement.animate({ width: percent + '%' }, 500);
    }
    else {
        overlayElement.css("display","");
        overlayElement.css("width", percent + '%');
        //overlayElement.fadeIn("slow");
    }*/

    if (eventMode == 'click' || eventMode == 'clear') {
       handleControlClick(stateControlElement, isAutoPostbackEnabled, postbackElement, value);
    }
}

function clearRating(ratingOverlayControl, stateControl, isAutoPostbackEnabled, postbackControl){

    var overlayElement = jQuery('#' + ratingOverlayControl);
    var stateControlElement = jQuery('#' + stateControl);
    var postbackElement = jQuery('#' + postbackControl);
    
    overlayElement.css("width","0%");
    handleControlClick(stateControlElement, isAutoPostbackEnabled, postbackElement, '');
}

function handleControlClick(stateControlElement, isAutoPostbackEnabled, postbackElement, value){

    var prevRating = getCurrentSavedRatingValue(stateControlElement);
    
    saveRating(stateControlElement, value);
    stateControlElement.parent().parent().trigger("onClientRatingChanged", [prevRating, value]);
    
    if (isAutoPostbackEnabled) {
        doPostback(postbackElement);
    }
}

function getCurrentSavedRatingValue(stateControlElement)
{
    var ratingValue = '';

    if(jQuery.trim(stateControlElement.val()) != '')
        ratingValue = roundNumber(parseFloat(stateControlElement.val()), 2);

    return ratingValue;
}

function saveRating(stateControlElement, value) {
    stateControlElement.val(value);
}


function doPostback(postbackElement) {

    if (jQuery.trim(postbackElement.val()) != '') {
        eval(postbackElement.val());
    }
}

function roundNumber(rnum, rlength) {
    var newnumber = Math.round(rnum * Math.pow(10, rlength)) / Math.pow(10, rlength);
    return newnumber;
}


