//------------------------------------------------------------------------------------------
// Methods to do with clippings
//------------------------------------------------------------------------------------------

/*global DWRHelper, MarkedListConnector, YAHOO, document, getImageDir */

function ClippingsManager(searchId, callbackObject, clippedIconImage)
{
    this.searchId = !searchId ? "" : searchId;

    if (callbackObject)
    {
        ClippingsManager.callbackObject = callbackObject;
    }

    if (clippedIconImage)
    {
        ClippingsManager.clippedIcon = getImageDir() + "/" + clippedIconImage;
    }

    // Set the instance and initiaize it
    ClippingsManager.instance = this;
    ClippingsManager.initialize();
}

/**
 * The one and only instance of ClippingsManager
 */
ClippingsManager.instance = null;

// The display properties that are associated with a clipped article
ClippingsManager.clippedClassName = "clipped";
ClippingsManager.clippedIcon      = getImageDir() + "/clipped.gif";
ClippingsManager.clippedAltTitle  = "<<<uninitialized>>>";

// The display properties that are associated with an unclipped article
ClippingsManager.unClippedClassName = "add-clipping";
ClippingsManager.unClippedIcon      = getImageDir() + "/unclipped.gif";
ClippingsManager.unClippedAltTitle  = "<<<uninitialized>>>";

ClippingsManager.clippedIconWidth = 7;
ClippingsManager.clippedIconHeight = 7;

ClippingsManager.unClippedIconWidth = 7;
ClippingsManager.unClippedIconHeight = 7;

/**
 * Calculates the size of the icons used to add and delete clippings.
 */
ClippingsManager.initialize = function()
{
    var setIconDimensions = function(img)
    {
        if (img.width === 0)
        {
            var updateImg = function(imageObject)
            {
                return function()
                {
                    setIconDimensions(imageObject);
                };
            }(img);

            window.setTimeout(updateImg, 2);
        }
        else
        {
            if (img.src.indexOf(ClippingsManager.clippedIcon) != -1)
            {
                ClippingsManager.clippedIconWidth = img.width;
                ClippingsManager.clippedIconHeight = img.height;
            }
            else
            {
                ClippingsManager.unClippedIconWidth = img.width;
                ClippingsManager.unClippedIconHeight = img.height;
            }
        }
    };

    var loadIcon = function (icon)
    {
        var img = document.createElement("img");
        img.src = icon;

        setIconDimensions(img);
    };

    loadIcon(ClippingsManager.clippedIcon);
    loadIcon(ClippingsManager.unClippedIcon);
};


/**
 * Adds a result to the clippings list.
 * @param e the event object
 */
ClippingsManager.addClipping = function(e)
{
    if (typeof(e.target) == "undefined")
    {
        e.target = e.srcElement;
    }

    var searchId = e.target.getAttribute("searchId");

    if (!searchId)
    {
        searchId = ClippingsManager.instance.searchId;
    }

    var isAlert = (e.target.getAttribute("isalert") == "true");

    YAHOO.util.Event.stopEvent(e);

    var move_anim = ClippingsManager.createMoveAnim(e.target, YAHOO.util.Dom.getXY(e.target), YAHOO.util.Dom.getXY("todays-clippings"));

    var funcOnComplete = function()
    {
        ClippingsManager.clippingComplete(e.target,"add");
        MarkedListConnector.add(searchId, [e.target.value], isAlert, ClippingsManager.callbackObject);
    };

    move_anim.onComplete.subscribe(funcOnComplete);
    move_anim.animate();

    e.target.blur();
};

/**
 * Clears all entries in the clippings list
 */
ClippingsManager.clearAll = function()
{
    MarkedListConnector.clear(ClippingsManager.callbackObject);

    var clippedElements = YAHOO.util.Dom.getElementsByClassName(ClippingsManager.clippedClassName);

    for (var i = 0; i < clippedElements.length; ++i)
    {
        ClippingsManager.setClippingAttributes(clippedElements[i], false); 
    }
};

/**
 * Removes the selected result from the clippings list.
 */
ClippingsManager.removeClipping = function(e)
{
    if (typeof(e.target) == "undefined")
    {
        e.target = e.srcElement;
    }

    YAHOO.util.Event.stopEvent(e);

    var move_anim = ClippingsManager.createMoveAnim(e.target, YAHOO.util.Dom.getXY("todays-clippings"), YAHOO.util.Dom.getXY(e.target));

    var funcOnComplete = function()
    {
        ClippingsManager.clippingComplete(e.target,"remove");
        MarkedListConnector.remove([e.target.value], ClippingsManager.callbackObject);
    };

    move_anim.onComplete.subscribe(funcOnComplete);
    move_anim.animate();

    e.target.blur();
};


/**
 * This method is called when clipping is complete and the element that is being clipped needs to be updated
 * to indicate its state.
 * @param el the element that was clicked on that needs updating
 * @param action the clipping action that is beinf performed, either "add" or "remove"
 */
ClippingsManager.clippingComplete = function(el, action)
{
    var fadeImage  = "";
    var fadeWidth  = "";
    var fadeHeight = "";

    if (action == "add")
    {
        fadeWidth  = ClippingsManager.clippedIconWidth;
        fadeHeight = ClippingsManager.clippedIconHeight;
        fadeImage  = ClippingsManager.clippedIcon;
    }
    else if (action == "remove")
    {
        fadeWidth  = ClippingsManager.unClippedIconWidth;
        fadeHeight = ClippingsManager.unClippedIconHeight;
        fadeImage  = ClippingsManager.unClippedIcon;
    }

    // reset position
    el.style.position = "";
    el.style.top      = "";
    el.style.left     = "";

    // fade in to the new image
    el.src = fadeImage;
    var fade_anim = new YAHOO.util.Anim(el, {width : { to : fadeWidth }, height : { to : fadeHeight }}, 0.5);
    fade_anim.onComplete.subscribe(function(){ ClippingsManager.setClippingAttributes(el, action == "add");});
    fade_anim.animate();
};

/**
 * Sets the display attributes of the clipping icon
 * @param el the element containing the clipping icon
 * @param isClipped true if the result represented by the clipping icon is clipped
 */
ClippingsManager.setClippingAttributes = function(el, isClipped)
{
    var className, src, altTitle, eventHandler, width, height;

    if (isClipped)
    {
        className    = ClippingsManager.clippedClassName;
        src          = ClippingsManager.clippedIcon;
        altTitle     = ClippingsManager.clippedAltTitle;
        eventHandler = ClippingsManager.removeClipping;
        width        = ClippingsManager.clippedIconWidth;
        height       = ClippingsManager.clippedIconHeight;
    }
    else
    {
        className    = ClippingsManager.unClippedClassName;
        src          = ClippingsManager.unClippedIcon;
        altTitle     = ClippingsManager.unClippedAltTitle;
        eventHandler = ClippingsManager.addClipping;
        width        = ClippingsManager.unClippedIconWidth;
        height       = ClippingsManager.unClippedIconHeight;
    }

    el.className    = className;
    el.src          = src;
    el.alt          = altTitle;
    el.title        = altTitle;
    el.width        = width;
    el.height       = height;
    el.style.width  = width + "px";
    el.style.height = height + "px";

    YAHOO.util.Event.removeListener(el, "click");
    YAHOO.util.Event.on(el, "click", eventHandler);
};

/**
 * Creates an element that contains the clipping icon
 * @param i the number that this element will have in its id to make it unique
 * @param restultId the resultId of searchResult.  Used in the value attribute.
 * @param isClipped true if the result is in the marked item list
 * @param isAlert true if the result is from an alert
 * @param searchId the search id to add as a custom attribute to the element
 */
ClippingsManager.createClippingIcon = function(i, resultId, isClipped, isAlert, searchId)
{
    var clippingIcon = document.createElement("img");
    clippingIcon.id    = "clippingIcon" + i;
    clippingIcon.value = resultId;

    if (isAlert)
    {
        clippingIcon.setAttribute("isalert", isAlert.toString());
    }

    if (searchId)
    {
        clippingIcon.setAttribute("searchid", searchId.toString());
    }

    ClippingsManager.setClippingAttributes(clippingIcon, isClipped);

    return clippingIcon;
};

/**
 * Creates a animation that will move from the "from" element to the "to" element
 * @param context the element context in which to create the animation
 * @param from the element that the animation will start from
 * @param to the element that the animation will go to
 */
ClippingsManager.createMoveAnim = function(context, from, to)
{
    return new YAHOO.util.Motion(context,{
        points : { from: from, to : to },
        width : { to : 0 },
        height : { to : 0 }},
        0.5, YAHOO.util.Easing.easeOut);
};

/**
 * Sets the value of the clippings count element
 * @param clippingsCount
 */
ClippingsManager.prototype._setClippingsCount = function(clippingsCount)
{
    document.getElementById("clippings-count").innerHTML = clippingsCount;
};

/**
 * Callback method for AJAX calls to set the current clipping count value on the page.
 * @param clippingsCount the current count of clippings
 */
ClippingsManager.setClippingsCount_callback = function(clippingsCount)
{
    ClippingsManager.instance._setClippingsCount(clippingsCount);
};

/**
 * Error handler for errors coming from calls to set the current clippings count
 * @param message the error message
 * @param info the detailed information, including the stack trace
 */
ClippingsManager.setClippingsCount_errorHandler = function(message, info)
{
    DWRHelper.displayDWRError("ClippingsManager.setClippingsCount", message, info);
};

/**
 * The object used when making calls to addclipping and removeclipping
 */
ClippingsManager.clippingsCallbackDWRObject = {
  callback:     ClippingsManager.setClippingsCount_callback,
  timeout:      DWRHelper.ajaxTimeout,
  errorHandler: ClippingsManager.setClippingsCount_errorHandler
};

/**
 * The callback object that receives from the add and remove clippings.  This can
 * be overridden in the instance constructor
 */
ClippingsManager.callbackObject = ClippingsManager.clippingsCallbackDWRObject;

/**
 * Handles the onAvailable event from the "clippings-count" element
 * to set the number of clipped items.
 */
ClippingsManager.handleOnAvailable = function()
{
    MarkedListConnector.getMarkedResultCount(ClippingsManager.callbackObject);
};


