/* Vote widget control */
var g_voteReasonNone = 0;
var g_voteReasonUp = 1;
var g_voteReasonSpam = 2;
var g_voteReasonBadUrl = 3;
var g_voteReasonOffensive = 4;
var g_voteReasonPorn = 5;
var g_voteReasonLame = 6;

function VoteWidget(dotId, nonAuthenticatedOnClick)
{
    var self;

    self = this;
    self.dotId = dotId;
    self.reason = 0;  // one of the voted down reasons

    self.element = $("voteWidget:" + dotId);
    self.upElement = self.element.childNodes[0];
    self.downElement = self.element.childNodes[1];
    self.scoreElement = self.element.childNodes[2].childNodes[1];

    if (nonAuthenticatedOnClick == null) {
        Event.observe(self.upElement, "click", toggleUp);
        Event.observe(self.downElement, "click", toggleDown);
    } else {
        Event.observe(self.upElement, "click", nonAuthenticatedOnClick);
        Event.observe(self.downElement, "click", nonAuthenticatedOnClick);
    }

    var originalScore = parseInt(self.scoreElement.innerText);
    var originalState = getState(); // 1 is up, 0 is unvoted, -1 down
    
    self.score = originalScore;
    self.state = originalState;

    if (originalState > 0) {
        self.neutralScore = originalScore - 1;
    } else if (originalState == 0) {
        self.neutralScore = originalScore;
    } else {
        self.neutralScore = originalScore + 1;
    }

    function getState() {

        if (self.upElement.className == "voteWidgetTopSelected") {
            return 1;
        }

        if (self.downElement.className == "voteWidgetBottomSelected") {
            return -1;
        }

        return 0;
    }

    function toggleUp() {

        if (self.state == 1) {
            self.score = self.neutralScore;
            self.state = 0;
            DotHandler.VoteUrl(self.dotId, g_voteReasonNone, onVoteComplete);
        } else {
            self.score = self.neutralScore + 1;
            self.state = 1;
            DotHandler.VoteUrl(self.dotId, g_voteReasonUp, onVoteComplete);
        }            

        updateUI();
    }

    function toggleDown() {

        if (self.state == -1) {
            self.score = self.neutralScore;
            self.state = 0;

            updateUI();
            DotHandler.VoteUrl(self.dotId, g_voteReasonNone, onVoteComplete);
        } else {
            showVoteDownMenu();
        }
    }

    function voteDown(reason) {

        self.score = (self.neutralScore > 0) ? self.neutralScore - 1 : 0;
        self.state = -1;
        self.reason = reason;

        updateUI();
        DotHandler.VoteUrl(self.dotId, reason, onVoteComplete);
        hideVoteDownMenu();
    }

    function onVoteComplete(request) {

        if (isNaN(request.responseText)) {
            return;
        }

        self.score = parseInt(request.responseText);
        self.scoreElement.innerText = self.score;
    }

    function updateUI() {

        self.scoreElement.innerText = self.score;
        
        switch (self.state) {

            case 1:
                self.upElement.className = "voteWidgetTopSelected";
                self.downElement.className = "voteWidgetBottomUnselected";
                break;

            case -1:
                self.upElement.className = "voteWidgetTopUnselected";
                self.downElement.className = "voteWidgetBottomSelected";
                break;

            default:
                self.upElement.className = "voteWidgetTopUnselected";
                self.downElement.className = "voteWidgetBottomUnselected";
                break;
        }                
    }

    function showVoteDownMenu() {

        var menu;
        var offset;
        var dropdownImage;

        menu = $("voteDownMenu");

        if (menu) {
            Element.remove(menu);
        }

        menu = document.createElement("div");
        menu.id = "voteDownMenu";

        dropdownImage = document.createElement("img");
        dropdownImage.src = "images/Vote-Pulldown_png8.png";
        dropdownImage.onmousedown = hideVoteDownMenu;
        
        menu.appendChild(dropdownImage);

        menu.appendChild(createVoteDownMenuItem(g_spam, g_voteReasonSpam));
        menu.appendChild(createVoteDownMenuItem(g_badUrl, g_voteReasonBadUrl));
        menu.appendChild(createVoteDownMenuItem(g_offensive, g_voteReasonOffensive));
        menu.appendChild(createVoteDownMenuItem(g_porn, g_voteReasonPorn));
        menu.appendChild(createVoteDownMenuItem(g_lame, g_voteReasonLame));
        
        offset = Position.cumulativeOffset(self.downElement);

        menu.style.left = (offset[0] + 8) + "px";
        menu.style.top = (offset[1] + 13) + "px";

        document.body.onmousedown = hideVoteDownMenu;
        
        menu.onmousedown = cancelHideVoteDownMenu.bindAsEventListener();

        document.body.appendChild(menu);        
    }

    function cancelHideVoteDownMenu(e) {
        Event.stop(e);
    }

    function createVoteDownMenuItem(text, reason) {

        var o;

        o =  document.createElement("a");
        o.href = "javascript:void(0);";
        o.innerHTML = text;
        
        Event.observe(o, "click", function() { voteDown(reason); });

        return o;
    }

    function hideVoteDownMenu() {

        var menu = $("voteDownMenu");

        if (menu) {
            Element.remove(menu);
        }

        document.body.onmousedown = null;
    }

}
