﻿YAHOO.namespace("CW.ItemRating");

CW.ItemRating = function() {

    //create shortcut for YAHOO.util.Event:
    var $E = YAHOO.util.Event;
    var $D = YAHOO.util.Dom;
    var $C = YAHOO.util.Connect;
    var $A = YAHOO.util.Anim;
    var $ = $D.get;


    return {

        init: function() {


        },

        rateHandler: function(itemType, itemId, rating) {

            var itemClientId = itemType + "__" + itemId;

            CW.ItemRating.startLoading(itemClientId);

            CW.ItemRating.serverRate(itemType, itemId, rating, 0);
        },

        reportHandler: function(itemType, itemId, rating, flag) {

            var itemClientId = itemType + "__" + itemId;

            CW.ItemRating.startLoading(itemClientId);

            CW.ItemRating.serverRate(itemType, itemId, rating, flag);
        },

        startLoading: function(itemClientId) {

            var overlayId = "itemRatingOverlay_" + itemClientId;
            var contextId = "itemRatingContainer_" + itemClientId;


            CW.ItemRating.overlay = new YAHOO.widget.Overlay(overlayId, { fixedcenter: false,
                visible: true,
                context: [contextId, "tl", "tl", ["beforeShow", "windowResize"]]
            });
            CW.ItemRating.overlay.render(document.body);
            CW.ItemRating.overlay.show();

        },

        // Change views
        //------------------------------------

        disableRatingSystem: function(itemType, itemId, userRating) {

            var itemClientId = itemType + "__" + itemId;

            // Update rating
            var itemRating = parseInt($('itemRatingHidden_' + itemClientId).value);
            var newRating = itemRating + userRating;

            var ratingText = " vote";
            if (newRating != 1) {
                ratingText += "s";
            }

            // Add diabled class
            //$D.addClass('ratingContainer', 'rt-disabled');

            // Update vote count
            $('itemRating_' + itemClientId).innerHTML = newRating;
            $('itemRatingText_' + itemClientId).innerHTML = ratingText;


            CW.ItemRating.overlay.hide();
            //setTimeout("CW.ItemRating.overlay.hide()", 2000);


            // Animate
            //---
            var rateUpWrapper = 'rateUpWrapper_' + itemClientId;
            var rateDownWrapper = 'rateDownWrapper_' + itemClientId;

            var rateUpWrapperNode = document.getElementById('rateUpWrapper_' + itemClientId);
            var rateDownWrapperNode = document.getElementById('rateDownWrapper_' + itemClientId);

            // Fade out
            var attributes = { opacity: { to: 0} };
            var fade1 = new YAHOO.util.Anim(rateUpWrapperNode, attributes, 1, YAHOO.util.Easing.easeIn);
            var fade2 = new YAHOO.util.Anim(rateDownWrapperNode, attributes, 1, YAHOO.util.Easing.easeIn);


            // Remove 
            var removeElement1 = function() {
                var el1 = rateUpWrapperNode;
                el1.parentNode.removeChild(el1);
            }

            var removeElement2 = function() {
                var el2 = rateDownWrapperNode;
                el2.parentNode.removeChild(el2);
            }

            // Chain events
            fade1.onComplete.subscribe(removeElement1);
            fade2.onComplete.subscribe(removeElement2);

            fade1.animate();
            fade2.animate();

        },


        // Server methods
        //------------------------------------

        serverRate: function(serverItemType, serverItemId, serverRating, serverFlags) {

            var serverArgs = { itemId: serverItemId
                , rating: serverRating
                , flags: 0
            };


            var url = "/API/" + serverItemType + ".asmx?op=Rate";
            var methodName = "Rate";

            var callback = {
                success: CW.ItemRating.serverRateSuccess,
                failure: CW.ItemRating.serverRateFailure,
                argument: [methodName, serverArgs, serverItemType, serverItemId],
                cache: false,
                scope: CW.Item
            };

            CW.Ajax.fnGenerateAjaxWSRequest(url, callback, methodName, serverArgs);
        },

        serverRateSuccess: function(o) {

            var returnCode = CW.Ajax.fnHandleSoapResponse(o, o.argument[0]);

            var userRatingValue = o.argument[1].rating;

            var serverItemType = o.argument[2];
            var serverItemId = o.argument[3];


            if (returnCode == 0) {
                CW.ItemRating.disableRatingSystem(serverItemType, serverItemId, userRatingValue);
            }
            else {
                // TODO:    
                //  something went wrong...
            }

        },

        serverRateFailure: function(o) {

            alert(CW.Ajax.fnHandleSoapResponse(o, o.argument[0]));

        }

    }
} (); 
	   
YAHOO.util.Event.on(window, 'load', CW.ItemRating.init);