﻿/** Setup Plugins */
jQuery.fn.overlay = function(overlayID, options) {
    return this.each(function() {
       new Overlay(this, overlayID, options);
    });
};

jQuery.fn.categoryItem = function() {
    return this.each(function(){
      new CategoryItem(this);
    });
};

/** Common Behaviors **/
jQuery(function(){
    $(".action-buttons a").live("mousedown mouseup", function(event){
        if (event.type == 'mousedown')
        {
            $(this).addClass('pressed');
        }
        else
        {
            $(this).removeClass('pressed');
        }
    });

    $('body').get(0).onselectstart = function(){ return false; }
});

var OverlayDelegate = $.klass({
    initialize : function(settings){
        this._settings = settings;
        
        _this = this;
        YUI().use('json-parse', function(Y)
        {
            _this.Y = Y;
        });
    },
    getOverlay : function($element)
    {
        return $('#' + $element.attr('overlayID'));
    },
    getSettings : function($element)
    {
        var opt = $element.attr('overlayOptions');
        if (opt && opt.length > 0)
        {
            return $.extend({}, this._settings, this.Y.JSON.parse(opt));
        }
        
        return this._settings;
    },
    onclick : $.delegate({
        '.has-overlay' : function(e, $target)
        {
            return OverlayUtil.showOverlayNow($target, this.getOverlay($target), this.getSettings($target));            
        }
    }),
    onmouseover : $.delegate({
        '.has-overlay' : function(e, $target)
        {
            OverlayUtil.showOverlay($target, this.getOverlay($target), this.getSettings($target));
        }
    }),
    onmouseout : $.delegate({
        '.has-overlay' : function(e, $target)
        {
            OverlayUtil.hideOverlay(this.getOverlay($target), this.getSettings($target));
        }
    })
});

/*_______________________ Overlay _______________________*/

var OverlayUtil = {

    // PROPERTIES:
    
    defaults : {
        fadeSpeed : 100,
        hideWait : 100,
        showWait : 300,
        offsetTop : -2,
        paddingTop: 10,
        maxHeight : 250,
        handleOverlayHover : true,
        showOnTop : false,        
        enableWithClassName: '',
        isFixedPosition : false       
    },
    transitionClass : 'overlay-transition',
    hideIntervalId : null,
    showIntervalId : null,
    lastElement : null,
    lastOverlay : null,
        
    // METHODS:
    
    getSettings : function(settings)
    {
        return $.extend({}, OverlayUtil.defaults, settings);
    },
    
    /** showOverlay **/
    showOverlay : function($element, $overlay, settings)
    {
        settings = OverlayUtil.getSettings(settings);
        
        window.clearTimeout(OverlayUtil.hideIntervalId);
        
        window.clearTimeout(OverlayUtil.showIntervalId);
        
        if ($overlay.css('display')=='none')
        {
            if (OverlayUtil.lastOverlay && OverlayUtil.lastOverlay.is(':visible') && OverlayUtil.lastOverlay.get(0) != $overlay.get(0))
            {
                OverlayUtil.lastOverlay.hide();
            }
            
            OverlayUtil.showIntervalId = window.setTimeout(
                function(){
                    OverlayUtil.showOverlayNow($element, $overlay, settings);
                },
                settings.showWait);
        }
        
    },
    /** showOverlayNow **/
    showOverlayNow : function($element, $overlay, settings)
    {
        settings = OverlayUtil.getSettings(settings);
        
        OverlayUtil.initOverlay($element, $overlay, settings);
        
        if (settings.enableWithClassName.length > 0 && !$element.hasClass(settings.enableWithClassName)) return true; // return true so click is handled
        
        OverlayUtil.lastElement = $element;
        
        OverlayUtil.lastOverlay = $overlay;

        var elementOffset = $element.offset();
        
        var overlayD = {
            width: $overlay.width(),
            left: $overlay.offset().left
        }
        
        var overlayShadowWidth = 7;
        
        var leftX = elementOffset.left;// + contD.left;        
        
        var doCenter = $overlay.hasClass('overlay-center');
        
        if (doCenter)
        {
            // center the overlay..
            leftX = leftX - (overlayD.width / 2) + ($element.width() /2 ) + overlayShadowWidth;
        }

        var bodyWidth = $('body').width();

        if ((leftX + overlayD.width) > bodyWidth)
        {
            leftX = bodyWidth - overlayD.width;
        }
        
        //debug(leftX, overlayD.width);

        // check if in footer..

        var elementTop = elementOffset.top;
        
        if (settings.isFixedPosition)
        {
            elementTop = elementTop - $(window).scrollTop();
        }
        
        var topY = elementTop + $element.height() + settings.offsetTop;
        
        if (settings.showOnTop)
        {
            topY = elementTop - $overlay.height() - settings.offsetTop;
            
            $overlay.addClass('overlay-above-element');
        } else
        {
            $overlay.removeClass('overlay-above-element');
        }
        
        var arrowWidth = 21;
        
        var arrowLeftBounds = 20;
        
        var arrowX = elementOffset.left - leftX - (arrowWidth/2) + ($element.width() / 2);
        
        if (arrowX < arrowLeftBounds || $overlay.hasClass('overlay-left')) arrowX = arrowLeftBounds;
        
        var $arrow = $overlay.find(".overlay-arrow");
        
        $arrow.css({ left: arrowX + 'px' });
        
        var position = (settings.isFixedPosition) ? 'fixed' : 'absolute';

        $overlay.css({
             position: position, 
             left: leftX + 'px', 
             top: topY + 'px'
        }).addClass(OverlayUtil.transitionClass);
        
        
        $overlay.stop(true, true).fadeIn(settings.fadeSpeed, function(){
            $overlay.removeClass(OverlayUtil.transitionClass);
        });
        
        return false;
    },    
    /** hideOverlay **/
    hideOverlay : function ($overlay, settings)
    {
        window.clearTimeout(OverlayUtil.showIntervalId);
        
        OverlayUtil.hideIntervalId = window.setTimeout(function(){OverlayUtil.hideOverlayNow($overlay, settings);}, settings.hideWait);        
    },
    /** hideOverlayNow **/
    hideOverlayNow : function ($overlay, settings)
    {
        settings = OverlayUtil.getSettings(settings);
        
        if ($overlay.is(":visible"))
        {
            $overlay.addClass(OverlayUtil.transitionClass).fadeOut(settings.fadeSpeed);
        }
    },
    
    initOverlay : function ($element, $overlay, settings)
    {
        var overlayInitKey = '__' + $overlay.attr('id') + '_inited';
        
        if (OverlayUtil[overlayInitKey]) return;
        
        settings = OverlayUtil.getSettings(settings);

        var padding = '<div class="overlay-pad" style="height:' + settings.paddingTop + 'px"></div>';
        var paddingTop = padding;
        var paddingBtm = padding;
        
        $overlay.hide();         
        $overlay.addClass('callout overlay');
        $overlay.wrapInner('<div class="overlay-mid"><div class="overlay-mid-c"></div></div>');
        $overlay.prepend(paddingTop + '<div class="overlay-top"><div class="overlay-arrow"></div></div>');
        $overlay.append('<div class="overlay-btm"><div class="overlay-arrow"></div></div>' + paddingBtm);
        
        // set max height
        var $midC = $overlay.find(".overlay-mid-c");
        if (typeof($midC.get(0).style.maxHeight)!=undefined)
        {
            $midC.css({maxHeight: settings.maxHeight, overflow: 'auto'});
        }
        else
        {
            $midC.css({height: settings.maxHeight, overflow: 'auto'});
        }
        
        if (settings.handleOverlayHover)
        {        
            $overlay.hover(
                function(){
                    OverlayUtil.showOverlay($element, $overlay, settings);
                }, 
                function(){
                    OverlayUtil.hideOverlay($overlay, settings);
                });
        }
        
        OverlayUtil[overlayInitKey] = true;
    },
    
    setHtml : function($overlay, html)
    {
        var midC = $overlay.find(".overlay-mid-c");
        
        if (midC.length == 0)
        {
            $overlay.html(html);
        }
        else
        {
            midC.html(html);
        }
    }  
    
};

/*_______________________ Overlay _______________________*/

var Overlay = function(element, overlayID, options) {

    // PROPERTIES:
    
    var settings = OverlayUtil.getSettings(options);

    var $el = jQuery(element);
    
    var $overlay = jQuery("#" + overlayID);
    
    // METHODS:
    
    /** handleATag **/
    var handleATag = function()
    {
        $el.hover(
            function(){
                OverlayUtil.showOverlay($el, $overlay, settings);
            }, 
            function(){
                OverlayUtil.hideOverlay($overlay, settings);
            });
        $el.click(function() {
            return OverlayUtil.showOverlayNow($el, $overlay, settings);
        });
    };    
    
    
    var showOverlayNow = function(element)
    {
        var el = $el;
        
        if (typeof(element)!='number' && element!=null)
        {
            el = element;
        }
        
        return OverlayUtil.showOverlayNow(el, $overlay, settings);        
    };
    
    var hideOverlayNow = function ()
    {
        OverlayUtil.hideOverlayNow($overlay, settings);        
    };
    
    var setHtml = function(html)
    {
        OverlayUtil.setHtml($overlay, html);
    }  
    
    /** initialize **/
    var initialize = function (){
        
        switch(element.nodeName)
        {
            case "A" :
            case "BUTTON" :
                handleATag();
                break;
            default : 
                break;
        }
    };
    
    initialize();
    
    return {
    
        showOverlayNow : showOverlayNow,
        hideOverlayNow : hideOverlayNow,
        setHtml : setHtml
    
    };    
};




/*_______________________ CategoryItem _______________________*/

var CategoryItem = function(element)
{
    var $el = jQuery(element);
    
    var initialize = function(){
        
        $el.click(function(){onRowClick(this);});
        
        $el.hover(onItemOver, onItemOut);
    };
    
    var onItemOver = function() {
        $el.animate({background: "#e2e2e2"}, 300);
    };    
    
    var onItemOut = function() {
        $el.animate({background: "#fff"}, 300);
    };
    
    initialize();
    return {};
};


var CropImageBoxUtil = {
    // className constants
    classCropMask: 'crop-mask',
    classCropMaskTracker: 'crop-mask-tracker',
    classCropBox: 'crop-box',
    classCropBoxEditable: 'crop-box-editable',
    classCropBG: 'crop-bg',
    classCropTop: 'crop-t',
    classCropBtm: 'crop-b',
    classCropLeft: 'crop-l',
    classCropRight: 'crop-r',
    classCropTopLeft: 'crop-tl',
    classCropTopRight: 'crop-tr',
    classCropBtmLeft: 'crop-bl',
    classCropBtmRight: 'crop-br',
    classCropMaskImage: 'crop-mask-image',
    classCropEdge: 'crop-mask-edge',
    classCropCorner: 'crop-mask-corner',
    classCropVertEdge: 'crop-mask-edgev',
    classCropHorizEdge: 'crop-mask-edgeh',
    classCropSave: 'crop-save',
    classCropCancel: 'crop-cancel',
    classCropReset: 'crop-reset',
    classCropSaving: 'crop-saving',
    classCropRotate: 'crop-rotate',
    classCropReset: 'crop-reset',
    // border offsets        
    offsetTopBorder: 7,
    offsetBtmBorder: 8,
    offsetLeftBorder: 7,
    offsetRightBorder: 8,
    offsetCropBox: 10,
    offsetCornerImage: 40, // 20px * 2
    // attributes
    attrRatioDim: 'ratioDim',
    attrImageDim: 'orgImageDim',
    attrRefId: 'refId',
    // constants
    minCropSize: new Dimension(0.5, 0.5),
    maxRatioDelta: 0.005,
    // events
    eventSave: 'cropimagebox:save',
    // update functions
    getCropBox: function ($el) {
        if (!$el.hasClass(CropImageBoxUtil.classCropBox)) {
            $el = $el.find('.' + CropImageBoxUtil.classCropBox);
        }
        return $el;
    },
    getImage: function ($cropBox) {
        return $cropBox.find('img').eq(0);
    },
    getImageDimension: function ($cropBox) {
        var $img = CropImageBoxUtil.getImage($cropBox);
        
        return new Dimension( M.parseFloat( $img.css('width') ), M.parseFloat( $img.css('height') ) );
    },
    updateRatio: function ($cropBox, wr, hr) {
        $cropBox = CropImageBoxUtil.getCropBox($cropBox);
        $cropBox.attr(CropImageBoxUtil.attrRatioDim, new Dimension(wr, hr).toString());
    },
    updateImageSrc: function ($cropBox, imgSrc) {
        $cropBox = CropImageBoxUtil.getCropBox($cropBox);
        $cropBox.find('img').attr('src', imgSrc);
        $cropBox.find('.' + CropImageBoxUtil.classCropMaskImage).css({ 'background-image': 'url(' + imgSrc + ')' });
    },
    clearCrop: function ($cropBox) {
        $cropBox = CropImageBoxUtil.getCropBox($cropBox);
        $cropBox.find('img').css({ opacity: 1 });
        $cropBox.find('.' + CropImageBoxUtil.classCropMask).css({ 'display': 'none' });
    },
    needsCrop: function (imageWidth, imageHeight, widthRatio, heightRatio) {
        var orgRatio = M.ImageUtil.getOrientationRatio(imageWidth, imageHeight);

        var ratioDelta = Math.abs(orgRatio - M.ImageUtil.getOrientationRatio(widthRatio, heightRatio));

        return ratioDelta > CropImageBoxUtil.maxRatioDelta;
    },
    updateCrop: function ($cropBox, cropCoords, wr, hr) {

        $cropBox = CropImageBoxUtil.getCropBox($cropBox);
        if ($cropBox.length == 0) return;

        if (cropCoords == null) {
            CropImageBoxUtil.clearCrop($cropBox);
            return;
        }

        var $img = $cropBox.find("img").eq(0);

        var ratioDim = new Dimension(wr, hr);

        if (!wr && !hr) {
            ratioDim = M.ImageUtil.getDimensionFromString($cropBox.attr(CropImageBoxUtil.attrRatioDim));
        }

        var imageDimStr = $cropBox.attr(CropImageBoxUtil.attrImageDim);
        var orgImageDim = M.ImageUtil.getDimensionFromString($cropBox.attr(CropImageBoxUtil.attrImageDim));

        var imageWidth = $img.width() || M.parseFloat($img.css('width'));
        var imageHeight = $img.height() || M.parseFloat($img.css('height'));

        var cssCoord = CropImageBoxUtil.getCropCss(cropCoords,
            imageWidth,
            imageHeight,
            ratioDim,
            orgImageDim);


        var masterOffset = CropImageBoxUtil.offsetCropBox;

        var maskLeft = cssCoord.left + masterOffset - CropImageBoxUtil.offsetLeftBorder;
        var maskTop = cssCoord.top + masterOffset - CropImageBoxUtil.offsetTopBorder;
        var maskWidth = cssCoord.width + CropImageBoxUtil.offsetLeftBorder + CropImageBoxUtil.offsetRightBorder;
        var maskHeight = cssCoord.height + CropImageBoxUtil.offsetTopBorder + CropImageBoxUtil.offsetBtmBorder;

        var $img = $cropBox.find('img')
            .css({ opacity: 0.4 });

        var animTime = 200;

        // cropped image
        var $cropMask = $cropBox.find('.' + CropImageBoxUtil.classCropMask)
            .css({
                width: maskWidth + 'px',
                height: maskHeight + 'px',
                left: maskLeft + 'px',
                top: maskTop + 'px',
                display: 'block'
            });

        var imageLeft = -(cssCoord.left);
        var imageTop = -(cssCoord.top);
        var imageBG = String.format('{0}px {1}px', imageLeft, imageTop);


        var $cropMaskImage = $cropBox.find('.' + CropImageBoxUtil.classCropMaskImage)
            .css({
                width: cssCoord.width + 'px',
                height: cssCoord.height + 'px',
                backgroundPosition: imageBG
            });

        var offsetCornerImage = CropImageBoxUtil.offsetCornerImage;

        var horizBorderCss = { width: maskWidth - offsetCornerImage + 'px' };
        var vertBorderCss = { height: maskHeight - offsetCornerImage + 'px' };

        $cropBox.find('.' + CropImageBoxUtil.classCropVertEdge).css(vertBorderCss);
        $cropBox.find('.' + CropImageBoxUtil.classCropHorizEdge).css(horizBorderCss);

    },
    /****** getCropCss ******/
    getCropCss: function (cropCoords, imageWidth, imageHeight, ratioDim, orgImageDim) {
        if (!cropCoords) cropCoords = new CropCoords();

        var width = cropCoords.Width * imageWidth;
        var height = cropCoords.Height * imageHeight;

        ratioDim = ratioDim.matchOrientation(width, height);

        // . Get Ratios
        var ratio = M.ImageUtil.getRatio(ratioDim.Width, ratioDim.Height);
        var orgWidth = cropCoords.Width * orgImageDim.Width;
        var orgHeight = cropCoords.Height * orgImageDim.Height;
        var ratioDelta = Math.abs(M.ImageUtil.getRatio(orgWidth, orgHeight) - ratio);

        // . Make sure if crop coords are for entire image that the ratio is correct for the size.
        if (ratioDelta > CropImageBoxUtil.maxRatioDelta && cropCoords.Width == 1 && cropCoords.Height == 1) {
            var shortWidth = M.ImageUtil.getShortSizeFromRatio(imageHeight, ratio);
            var longWidth = M.ImageUtil.getLongSizeFromRatio(imageHeight, ratio);

            var shortHeight = M.ImageUtil.getShortSizeFromRatio(imageWidth, ratio);
            var longHeight = M.ImageUtil.getLongSizeFromRatio(imageWidth, ratio);

            if (imageWidth >= imageHeight) // HORIZONTAL / SQUARE
            {
                if (shortHeight > imageHeight) { width = longWidth; }
                else { height = shortHeight; }
            }
            else // VERTICAL
            {
                if (shortWidth > imageWidth) { height = longHeight; }
                else { width = shortWidth; }
            }
        }

        // . Ensure correct bounds
        if (width > imageWidth) width = imageWidth;
        if (height > imageHeight) height = imageHeight;

        // . Set X,Y
        var left = Math.round((cropCoords.XCenter * imageWidth) - (width / 2));
        var top = Math.round((cropCoords.YCenter * imageHeight) - (height / 2));

        return {
            'width': width,
            'height': height,
            'left': left,
            'top': top
        };
    }
}

/*_______________________ CropImageBox: Requires Lowpro  _______________________*/
var CropImageBox = $.klass({
    
    // constructor
    initialize : function(options)
    {
        var defaults = {
            isEditable : false,
            cropCoords : new CropCoords(),
            orgImageDim : new Dimension(0,0),
            widthRatio : 0,
            heightRatio : 0,
            refId : ''       
        };
        
        this._options = $.extend(defaults, options);
        
        this.$parent = this.element.parent();
        
        // if has css width/height set, create divs now.
        // css width/height required for CropImageBoxUtilEvents
        if ( M.parseInt( this.element.css('width') ) )
        {
            this.createCropDivs();
        }
        else
        {
            var t= this;
            this.element.load(function(){
                t.createCropDivs();
            });
        }
    },
    
    createCropDivs : function()
    {
        var $img = this.element;
        
        var $parent = this.$parent;
        
        if ($parent.find('.' + CropImageBoxUtil.classCropBox).length > 0) return;
        
        var imageWidth = M.parseInt($img.css('width'));
        if (!imageWidth)
        {
            imageWidth = $img.width();
        }
        //debug('Crop Box: img width: ' + imageWidth);
        var imageHeight = M.parseInt($img.css('height'));
        if (!imageHeight) imageHeight = $img.height();         
        
        // create master div        
        var masterOffset = CropImageBoxUtil.offsetCropBox;                
        
        var $masterDiv  = $('<div />')
            .addClass(CropImageBoxUtil.classCropBox)
            .css({
                width: (imageWidth + (masterOffset*2)) + 'px',
                height: (imageHeight + (masterOffset*2)) + 'px',
                position: 'relative'
             })
             .attr(CropImageBoxUtil.attrRatioDim, new Dimension(this._options.widthRatio, this._options.heightRatio))
             .attr(CropImageBoxUtil.attrImageDim, this._options.orgImageDim.toString())
             .attr(CropImageBoxUtil.attrRefId, this._options.refId);
            
        
        if (this._options.isEditable) $masterDiv.addClass(CropImageBoxUtil.classCropBoxEditable);
        
        // crop background (striped bars)     
        var $cropBg = $('<div />')
            .addClass(CropImageBoxUtil.classCropBG)
            .css({
                position: 'absolute',
                zIndex:1,
                top: masterOffset + 'px',
                left: masterOffset + 'px',
                width: imageWidth + 'px',
                height: imageHeight + 'px'
                });
        
        // backg image to master div
        var $bgimage = $img.clone()
            .css({
                position: 'absolute',
                zIndex: 5,
                top: masterOffset + 'px',
                left: masterOffset + 'px'                
                });
        $img.hide();       
               
        // cropped image
        var $cropMask = $('<div />')
            .addClass(CropImageBoxUtil.classCropMask)
            .css({
                position: 'absolute',
                zIndex : 10
            });
        
        var $cropMaskInner = $('<div />')
            .css({
                position: 'relative',
                width: '100%',
                height: '100%'
            });
        
        $cropMask.append($cropMaskInner);
        
        var $cropMaskImage = $('<div />')
            .addClass(CropImageBoxUtil.classCropMaskImage)
            .css ({
                position: 'absolute',                
                left : CropImageBoxUtil.offsetLeftBorder + 'px',
                top: CropImageBoxUtil.offsetTopBorder + 'px',
                backgroundImage : 'url(' + $img.attr('src') + ')',
                backgroundRepeat : 'no-repeat'
            });
        
        this.appendDiv($cropMaskInner, CropImageBoxUtil.classCropTopLeft + ' ' + CropImageBoxUtil.classCropCorner);        
        this.appendDiv($cropMaskInner, CropImageBoxUtil.classCropTopRight + ' ' + CropImageBoxUtil.classCropCorner);        
        this.appendDiv($cropMaskInner, CropImageBoxUtil.classCropBtmRight + ' ' + CropImageBoxUtil.classCropCorner);        
        this.appendDiv($cropMaskInner, CropImageBoxUtil.classCropBtmLeft + ' ' + CropImageBoxUtil.classCropCorner);                
        this.appendDiv($cropMaskInner, CropImageBoxUtil.classCropRight + ' ' + CropImageBoxUtil.classCropEdge + ' ' + CropImageBoxUtil.classCropVertEdge);
        this.appendDiv($cropMaskInner, CropImageBoxUtil.classCropLeft + ' ' + CropImageBoxUtil.classCropEdge + ' ' + CropImageBoxUtil.classCropVertEdge);
        this.appendDiv($cropMaskInner, CropImageBoxUtil.classCropTop + ' ' + CropImageBoxUtil.classCropEdge + ' ' + CropImageBoxUtil.classCropHorizEdge);
        this.appendDiv($cropMaskInner, CropImageBoxUtil.classCropBtm + ' ' + CropImageBoxUtil.classCropEdge + ' ' + CropImageBoxUtil.classCropHorizEdge);        
        
        $cropMaskInner.append($cropMaskImage);        
            
        $masterDiv.append($bgimage, $cropBg, $cropMask);
        
        CropImageBoxUtil.updateCrop($masterDiv, this._options.cropCoords);
        
        $img.after($masterDiv);
        
        if (this._options.isEditable)
        {
            var $actionButtons = $('<div />')
                .addClass('action-buttons');
            
            var commonButtons = ModalUtil.getCommonButtons();
            
            commonButtons.ok.addClass(CropImageBoxUtil.classCropSave);                
            commonButtons.cancel.addClass(CropImageBoxUtil.classCropCancel);
            commonButtons.saving.addClass(CropImageBoxUtil.classCropSaving);
            
            var $rotate = null;
            
            if (this._options.widthRatio != this._options.heightRatio) 
            {            
                $rotate = $(M.HtmlUtil.getActionButtonTag(CropImageBoxUtil.classCropRotate + ' new-group', 'Rotate Crop'));
            }
               
            var $reset = $(M.HtmlUtil.getActionButtonTag(CropImageBoxUtil.classCropReset, 'Best Fit'));
                             
            $actionButtons.append(commonButtons.ok, commonButtons.cancel, $rotate, $reset);
            
            $masterDiv.after($actionButtons, commonButtons.saving);
        }
    },
    
    appendDiv : function($to, className, css)
    {
        var $div = $('<div />').addClass(className);
        if (css)
        {
            $div.css(css);
        }
        
        $to.append($div);
        
        return $div;        
    }
    
});

var CropImageBoxEvents = $.klass({
    actions: {
        'move': 'move',
        'resize_w': 'w',
        'resize_e': 'e',
        'resize_n': 'n',
        'resize_s': 's',
        'resize_nw': 'nw',
        'resize_ne': 'ne',
        'resize_sw': 'sw',
        'resize_se': 'se',
        isWest: function (a) { return /w/.test(a); },
        isEast: function (a) { return /e/.test(a); },
        isSouth: function (a) { return /s/.test(a); },
        isNorth: function (a) { return /n/.test(a); },
        isCorner: function (a) { return a.length >= 2; }
    },
    initialize: function (options) {
        // properties
        this._isDisabled = false;

        var t = this;

        $('body').mouseup(function () {
            t.toggleMouse(false);
        });

        $('.' + CropImageBoxUtil.classCropSave).live('click', function () {
            t.saveCrop();
        });

        $('.' + CropImageBoxUtil.classCropCancel).live('click', function () {
            $.fancyZoomClose();
        });

        $('.' + CropImageBoxUtil.classCropReset).live('click', function () {
            t.resetCrop();
        });

        $('.' + CropImageBoxUtil.classCropRotate).live('click', function () {
            t.rotateCrop();
        });
    },
    initCropBoxVars: function () {
        this.$cropBox = CropImageBoxUtil.getCropBox(this.element);
        this.$cropMask = this.$cropBox.find('.' + CropImageBoxUtil.classCropMask);
        this.$img = CropImageBoxUtil.getImage(this.$cropBox);
        var imageDim = CropImageBoxUtil.getImageDimension(this.$cropBox);
        this.$imgWidth = imageDim.Width;
        this.$imgHeight = imageDim.Height;
    },
    saveCrop: function () {
        // . ensure correct elements
        this.initCropBoxVars();
        var $cropBox = this.$cropBox;

        var $cropMask = this.$cropMask;
        var cropLeft = M.parseFloat($cropMask.css('left')) - (CropImageBoxUtil.offsetCropBox - CropImageBoxUtil.offsetLeftBorder);
        var cropTop = M.parseFloat($cropMask.css('top')) - (CropImageBoxUtil.offsetCropBox - CropImageBoxUtil.offsetTopBorder);

        var $cropMaskImage = $cropMask.find('.' + CropImageBoxUtil.classCropMaskImage);
        var cropWidth = M.parseFloat($cropMaskImage.css('width'));
        var cropHeight = M.parseFloat($cropMaskImage.css('height'));

        var $img = this.$img;

        var $actionButtons = $cropBox.parent().find('.action-buttons');
        var $saving = $cropBox.parent().find('.' + CropImageBoxUtil.classCropSaving);

        $actionButtons.slideUp('fast', function () {
            $saving.slideDown('fast');
        });

        this._isDisabled = true;

        var cropCoords = M.ImageUtil.determineCropCoords(
            this.$imgWidth,
            this.$imgHeight,
            cropLeft,
            cropTop,
            cropWidth,
            cropHeight);

        var refId = $cropBox.attr(CropImageBoxUtil.attrRefId);

        var t = this;
        this.element.trigger(CropImageBoxUtil.eventSave,
            [cropCoords,
            refId,
            function () {
                $actionButtons.show();
                $saving.hide();
                t._isDisabled = false;
                $.fancyZoomClose();
            }
            ]);
    },
    resetCrop: function () {
        this.initCropBoxVars();

        CropImageBoxUtil.updateCrop(this.$cropBox, new CropCoords());

    },
    rotateCrop: function () {
        this.initCropBoxVars();

        var coords = this.getCropMaskCoords();
        var oldWidth = coords.width;
        coords.width = coords.height;
        coords.height = oldWidth;

        var percIncrease = 1;

        var imgWidth = this.$imgWidth + (CropImageBoxUtil.offsetLeftBorder + CropImageBoxUtil.offsetRightBorder);
        var imgHeight = this.$imgHeight + (CropImageBoxUtil.offsetBtmBorder + CropImageBoxUtil.offsetTopBorder);

        if (coords.width > imgWidth) {
            percIncrease = imgWidth / coords.width;
        }
        else if (coords.height > imgHeight) {
            percIncrease = imgHeight / coords.height;
        }

        if (percIncrease < 1) {
            coords.width = coords.width * percIncrease;
            coords.height = coords.height * percIncrease;
            coords.left = (imgWidth / 2) - (coords.width / 2);
            coords.top = (imgHeight / 2) - (coords.height / 2);
        }

        this.setCropMask(coords, this.actions.resize_nw);

        // . call again for bug with 10x20
        this.setCropMask(this.getCropMaskCoords());

    },
    setFirstCoords: function (x, y) {
        this._firstX = x;
        this._firstY = y;
    },
    getCoordsDiff: function (x, y) {
        return {
            x: (x - this._firstX),
            y: (y - this._firstY)
        };
    },
    moveCropMask: function (x, y) {
        //debug('move', x, y);

        var coords = this.getCropMaskCoords();

        coords.left += x;

        coords.top += y;

        this.setCropMask(coords);
    },
    resizeCropMask: function (x, y) {
        var coords = this.getCropMaskCoords();

        var cropAction = this._cropAction;

        // west
        var isWest = this.actions.isWest(cropAction);
        if (isWest) {
            coords.left += x;
            coords.width -= x;
            coords.canAdjustEast = false;
        }
        // north
        var isNorth = this.actions.isNorth(cropAction)
        if (isNorth) {
            coords.top += y;
            coords.height -= y;
            coords.canAdjustSouth = false;
        }
        // east
        var isEast = this.actions.isEast(cropAction);
        if (isEast) {
            coords.width += x;
            coords.canAdjustWest = false;
        }
        // south
        var isSouth = this.actions.isSouth(cropAction);
        if (isSouth) {
            coords.height += y;
            coords.canAdjustNorth = false;
        }

        this.setCropMask(coords, cropAction);

    },
    getCropMaskCoords: function (left, top, width, height) {
        return {
            'left': left || M.parseInt(this.$cropMask.css('left')),
            'top': top || M.parseInt(this.$cropMask.css('top')),
            'width': width || M.parseInt(this.$cropMask.css('width')),
            'height': height || M.parseInt(this.$cropMask.css('height')),
            'canAdjustWest': true,
            'canAdjustNorth': true,
            'canAdjustSouth': true,
            'canAdjustEast': true
        };
    },
    setCropMask: function (cropMaskCoords, cropAction) {
        var left = cropMaskCoords.left;
        var top = cropMaskCoords.top;
        var width = cropMaskCoords.width;
        var height = cropMaskCoords.height;

        var $cropBox = this.$cropBox;

        var maskImageWidth = width - CropImageBoxUtil.offsetRightBorder - CropImageBoxUtil.offsetLeftBorder;
        var maskImageHeight = height - CropImageBoxUtil.offsetTopBorder - CropImageBoxUtil.offsetBtmBorder;

        // . constrain ratio
        var ratioDim = M.ImageUtil.getDimensionFromString($cropBox.attr(CropImageBoxUtil.attrRatioDim)).matchOrientation(maskImageWidth, maskImageHeight);
        if (ratioDim.Width > 0) {
            /*if ( (ratioDim.Width > ratioDim.Height && maskImageHeight > maskImageWidth) 
            || ( ratioDim.Width < ratioDim.Height && maskImageWidth > maskImageHeight ) )
            {
            ratioDim = ratioDim.flip();
            }*/

            if (this.actions.isEast(cropAction) || this.actions.isWest(cropAction)) {
                var oldHeight = maskImageHeight;

                maskImageHeight = M.ImageUtil.getHeightFromRatio(maskImageWidth, ratioDim.getRatio());

                if (this.actions.isNorth(cropAction)) {
                    var diff = oldHeight - maskImageHeight;
                    top += diff;
                }
            }
            else if (this.actions.isSouth(cropAction) || this.actions.isNorth(cropAction)) {
                maskImageWidth = M.ImageUtil.getWidthFromRatio(maskImageHeight, ratioDim.getRatio());
            }

            width = CropImageBoxUtil.offsetRightBorder + CropImageBoxUtil.offsetLeftBorder + maskImageWidth;
            height = CropImageBoxUtil.offsetTopBorder + CropImageBoxUtil.offsetBtmBorder + maskImageHeight;
        }


        // determine if outside bounds
        var cropBoxWidth = M.parseInt($cropBox.css('width'));
        var eastBounds = cropBoxWidth - CropImageBoxUtil.offsetCropBox;
        if ((width - CropImageBoxUtil.offsetRightBorder + left) > eastBounds) {
            if (cropMaskCoords.canAdjustWest)
                left = eastBounds - width + CropImageBoxUtil.offsetRightBorder;
            else
                width = eastBounds - left + CropImageBoxUtil.offsetRightBorder;
        }

        var maxWidth = cropBoxWidth - ((CropImageBoxUtil.offsetCropBox * 2) - (CropImageBoxUtil.offsetRightBorder + CropImageBoxUtil.offsetLeftBorder));
        if (width > maxWidth) width = maxWidth;

        var westBounds = CropImageBoxUtil.offsetCropBox - CropImageBoxUtil.offsetLeftBorder;
        if (left < westBounds) {
            left = westBounds;
            if (!cropMaskCoords.canAdjustEast) {
                width = M.parseInt(this.$cropMask.css('width'));
            }
        }

        var cropBoxHeight = M.parseInt($cropBox.css('height'));
        var southBounds = cropBoxHeight - CropImageBoxUtil.offsetCropBox;
        if ((height - CropImageBoxUtil.offsetBtmBorder + top) > southBounds) {
            if (cropMaskCoords.canAdjustNorth)
                top = southBounds - height + CropImageBoxUtil.offsetBtmBorder;
            else
                height = southBounds - top + CropImageBoxUtil.offsetBtmBorder;
        }

        var maxHeight = cropBoxHeight - ((CropImageBoxUtil.offsetCropBox * 2) - (CropImageBoxUtil.offsetBtmBorder + CropImageBoxUtil.offsetTopBorder));
        if (height > maxHeight) height = maxHeight;

        var northBounds = CropImageBoxUtil.offsetCropBox - CropImageBoxUtil.offsetTopBorder;
        if (top < northBounds) {
            top = northBounds;
            if (!cropMaskCoords.canAdjustSouth) {
                height = M.parseInt(this.$cropMask.css('height'));
            }
        }

        maskImageWidth = width - CropImageBoxUtil.offsetRightBorder - CropImageBoxUtil.offsetLeftBorder;
        maskImageHeight = height - CropImageBoxUtil.offsetTopBorder - CropImageBoxUtil.offsetBtmBorder;

        // . check ratio after bounds check
        if (ratioDim && ratioDim.Width > 0) {
            var ratioDelta = Math.abs(ratioDim.getRatio() - M.ImageUtil.getRatio(maskImageWidth, maskImageHeight));

            if (ratioDelta > CropImageBoxUtil.maxRatioDelta) {
                return;
            }
        }

        var imageDim = CropImageBoxUtil.getImageDimension($cropBox);

        if (maskImageWidth < (CropImageBoxUtil.minCropSize.Width * imageDim.Width) 
            && maskImageHeight < (CropImageBoxUtil.minCropSize.Height * imageDim.Height)) return;

        // . adjust inside image
        var $cropMaskImage = this.$cropMask.find('.' + CropImageBoxUtil.classCropMaskImage);
        $cropMaskImage.css({
            backgroundPosition: '-' + (left + CropImageBoxUtil.offsetLeftBorder - CropImageBoxUtil.offsetCropBox) + 'px -' +
                (top + CropImageBoxUtil.offsetTopBorder - CropImageBoxUtil.offsetCropBox) + 'px',
            'width': maskImageWidth,
            'height': maskImageHeight
        });

        // . adjust edges
        this.$cropMask.find('.' + CropImageBoxUtil.classCropTop + ', .' + CropImageBoxUtil.classCropBtm).css({
            width: width - CropImageBoxUtil.offsetCornerImage + 'px'
        });
        this.$cropMask.find('.' + CropImageBoxUtil.classCropLeft + ', .' + CropImageBoxUtil.classCropRight).css({
            height: height - CropImageBoxUtil.offsetCornerImage + 'px'
        });

        this.$cropMask.css({
            'left': left + 'px',
            'top': top + 'px',
            'width': width + 'px',
            'height': height + 'px'
        });
    },
    toggleMouse: function (isMouseOn, e, cropAction) {
        this.isMouseOn = isMouseOn;
        if (isMouseOn) {
            this.setFirstCoords(e.clientX, e.clientY);

            this._cropAction = cropAction;
        }
    },
    handleAction: function (e, $cropMask) {
        if (!this.isMouseOn || this._isDisabled) return;

        this.$cropMask = $cropMask;
        this.$cropBox = this.$cropMask.parent();

        var diff = this.getCoordsDiff(e.clientX, e.clientY);

        switch (this._cropAction) {
            case this.actions.move:
                this.moveCropMask(diff.x, diff.y);
                break;
            default:
                this.resizeCropMask(diff.x, diff.y);
                break;
        }

        this.setFirstCoords(e.clientX, e.clientY);
    },
    onmousemove: $.delegate({
        '.crop-mask': function (e, $target) {
            //debug('mouse move: crop-mask ' + this._cropAction);
            this.handleAction(e, $target);
        },
        '.crop-box': function (e, $target) {
            //debug('mouse move: crop-box');
            this.handleAction(e, $target.find('.' + CropImageBoxUtil.classCropMask));
        }
    }),
    /*onmouseout : $.delegate({
    '.crop-box' : function(e, $target)
    {
    if (e.target == $target.get(0))
    {
    this.toggleMouse(false);
    }
    }
    }), */
    onmousedown: $.delegate({
        '.crop-mask-corner': function (e, $target) {
            var action = this.actions.resize_nw;
            var cls = $target.get(0).className;
            if (cls.indexOf(CropImageBoxUtil.classCropTopRight) >= 0) action = this.actions.resize_ne;
            if (cls.indexOf(CropImageBoxUtil.classCropBtmLeft) >= 0) action = this.actions.resize_sw;
            if (cls.indexOf(CropImageBoxUtil.classCropBtmRight) >= 0) action = this.actions.resize_se;

            this.toggleMouse(true, e, action);
            return false;
        },
        '.crop-mask-edge': function (e, $target) {
            var action = this.actions.resize_w;
            var cls = $target.get(0).className;
            if (cls.indexOf(CropImageBoxUtil.classCropRight) >= 0) action = this.actions.resize_e;
            if (cls.indexOf(CropImageBoxUtil.classCropTop) >= 0) action = this.actions.resize_n;
            if (cls.indexOf(CropImageBoxUtil.classCropBtm) >= 0) action = this.actions.resize_s;

            this.toggleMouse(true, e, action);
            //this.toggleMouse(true, e, $target);
            return false;
        },
        '.crop-mask': function (e, $target) {
            this.toggleMouse(true, e, this.actions.move);
            return false;
        },
        'img': function (e, $target) {
            return false;
        }
    })
});



/*_______________________ Tabs: Requires Lowpro _______________________*/
var Tabs = $.klass({
    initialize : function(options)
    {
        $('.tab-content').hide();
        
        /*this.element.find("li").each(function(){
            var $a = $(this).find("a");
            $($a.attr('href')).hide();
        });*/
        
        this.initTabs();                
    },
    initTabs : function(){
        
        var $sel = this.element.find(".selected a");
        
        if ($sel.length==0) {
            
            var tabId = M.getQueryStringParameter("tab");
            //debug($sel.length, tabId);
            if (tabId)
            {
                $sel = this.element.find("a[href='#" + tabId + "']");
                //debug(tabId, $sel);                
            }
            else
                $sel = this.element.find("li:eq(0) a");
        }
        this.selectTab($sel);
    },
    onclick : $.delegate({
        'a' : function(e, $target)
        {
            this.selectTab($target);
            return false;
        }
    }),    
    selectTab : function($a)
    {
        if (this.prevTab)
        {
            $(this.prevTab.attr('href')).hide();
            this.prevTab.parent().removeClass('selected').prev().removeClass('nextToSelected');
        }
        
        $($a.attr('href')).show();
        
        $a.parent().addClass('selected').prev().addClass('nextToSelected');
        
        this.element.trigger('tab:selected', $a);
        
        this.prevTab = $a;
    }
});

/*_______________________ BuyableItemContainer: Requires Lowpro, YUI _______________________*/
var BuyableItemContainer = $.klass({
    initialize : function(options)
    {
        var defaults = {
            isBuyPhotoHandler : true,
            onQtyCommit : function(qty, $input, data) {},
            confirmRemove : false            
        };
        
        this._options = $.extend(defaults, options);
        
        var t = this;
        YUI().use('json-parse', function(Y)
        {
            t.Y = Y;
        });
    },
    /****** Blur Handlers ******/          
    onblur : $.delegate({
        '.pls-qty' : function(e, $target){
            this.setPriceListSizeQuantity($target);                    
        }
    }),
    /****** Focus Handlers ******/          
    onfocus : $.delegate({
        '.pls-qty' : function(e, $target){
            $target.select();
        }
    }),
    onkeyup : $.delegate({
        '.pls-qty' : function(e, $target){
            this.setPriceListSizeQuantity($target);
        }
    }), 
    /****** Click Handlers ******/           
    onclick : $.delegate({
        '.action-button-subtract' : function(e, $target)
        {
            this.addToQuantity(e.target, -1);                    
            return false;
        },
        '.action-button-add' : function(e, $target)
        {
            this.addToQuantity(e.target, 1);                    
            return false;
        },
        '.min-qty' : function (e, $target) {
            var minQty = $target.find("span").html();
            var $input = $target.parents("td:eq(0)").find("input");
            $input.val(minQty);
            this.setPriceListSizeQuantity($input);
            return false;
        },
        '.pls-row' : function(e, $target)
        {
            $target.find("input").focus();
        }
    }),
    /****** addtoQuantity ******/
    addToQuantity : function(eventTarget, amount)
    {
        var $row = $(eventTarget).parents("tr").eq(0);
        
        var $input = $row.find("input");
        
        var value = M.parseInt($input.val()) || 0;
        
        value += amount;
        
        if (value < 0) value = 0;
        
        var meta = this.Y.JSON.parse($input.attr('meta'));
        
        if (amount && meta.qty_req && meta.qty_req > 1)
        {
            if (amount < 0 && value < meta.qty_req)
            {
                value = 0;  
            }
            else if (value < meta.qty_req)
            {
                value = meta.qty_req;
            }                    
        } 
        
        if (value == 0 && this._options.confirmRemove)
        {
            if (!confirm('This item will be removed from your cart. Continue?'))
            {
                return;
            }                
        }               
        
        if (value == 0) value = '';
        
        $input.val(value);
        
        this.setPriceListSizeQuantity($input, 500);
        
    },
    /****** setPriceListSizeQuantity ******/                       
    setPriceListSizeQuantity : function($input, serverRequestDelay)
    {
        var stringVal = $input.val().replace(/[^0-9]/g, '');
        
        $input.val(stringVal);
        
        var value = M.parseInt(stringVal) || 0;
        
        if (value<0) value == 0;
        
        $input.attr('currVal','');
        
        var meta = this.Y.JSON.parse($input.attr('meta'));                
        
        var $row = $input.parents("tr").eq(0);               
        
        if (value == 0)
        {
            $row.removeClass('has-qty');                    
        }
        else
        {
            $row.addClass('has-qty');
        }                
        
        var prevValue = M.parseInt($input.attr('alt')) || 0;
        
        var $td = $input.parents("td").eq(0);
        
        var $minQty = $td.find(".min-qty");
        
        if (value != prevValue)
        {
            $row.addClass("updating");                    
            
            var timeoutName = $input.attr('name') + "timeout";                
            
            window.clearTimeout(this[timeoutName]);
            
            serverRequestDelay = (serverRequestDelay || 500);
            
            var _this = this;
            
            this[timeoutName] = window.setTimeout(function(){
                
                var value = M.parseInt($input.val()) || 0; // ensure value
                
                if (meta.qty_req && value < meta.qty_req && value > 0) // Check for minimum quantity
                {
                    if ($minQty.length == 0)
                    {
                        $td.append('<div class="min-qty error"><a href="#" title="Click to set">Minimum quantity is&nbsp;<span>' + meta.qty_req + '</span></a>.</div>');
                    } else {
                        $minQty.show();
                    }
                    
                    $row.removeClass("updating");
                }
                else
                {
                    $minQty.hide();
                    
                    var callback = function(data)
                    {
                        $input.attr('alt', value);
                        
                        $input.val( ( value > 0) ? value : '');
                        
                        var total = M.parseFloat($row.find(".price").html().replace(/[^0-9.]/g, '')) * value;
                        
                        $row.removeClass("updating");
                        
                        $row.find(".total span").html((total==0)?'&#8212;': M.formatCurrency(total));
                        
                        _this._options.onQtyCommit(value, $input, data);
                    };
                    
                    var key = $input.attr('name');
                    
                    if (_this._options.isBuyPhotoHandler)
                    {
                        M.AjaxUtil.handleBuyPhotoItemQty(key, value, callback);
                    } else 
                    {
                        M.AjaxUtil.handleCartItemQty(key, value, callback);
                    }
                }
            }, serverRequestDelay);
        }
        else
        {
            $minQty.hide();
        }
    }
});

var ModalUtil = {
    getCommonButtons : function()
    {
        var $ok = $(M.HtmlUtil.getActionButtonTag('button-ok button-save', 'Save', true));
        
        var $cancel = $(M.HtmlUtil.getActionButtonTag('button-cancel', 'Cancel'));
        
        var $saving = $('<div />')
                .addClass('loading-h')
                .css({
                    'display' : 'none'
                })
                .html('<span>Saving..</span>');     
        return {
            ok : $ok,
            cancel : $cancel,
            saving : $saving
        };
    }
}

var CartSaveCancelModalButtons = $.klass({
    initialize : function(options)
    {
        var defaults = {
            onSaveCallback : function(){}            
        };
        
        this.options = $.extend(defaults, options);
        
        this.createButtons();
    },    
    closeModal : function(isCanceled)
    {
        window.parent.closeConfigModal(isCanceled);                
    },
    createButtons : function()
    {
        var ui = ModalUtil.getCommonButtons();
        
        var _t = this;
        
        // setup handlers
        ui.ok.click(function(){
            
            var $saving = _t.element.parent().find(".loading-h");
            
            _t.element.slideUp('fast', function(){
                $saving.slideDown('fast');                
            });
            
            _t.options.onSaveCallback(_t.closeModal);
            
            return false;
        });
        
        ui.cancel.click(function(){
            _t.closeModal(true);
            return false;
        });
        
        
        this.element.append(ui.ok, ui.cancel);
        
        this.element.after(ui.saving);
        
        
        
        
        
    }    
});


/*_______________________ Input Label _______________________*/
function InputLabel ($input, $label) {
            
    function checkCodeVal()
    {
        if ($input.val().length > 0)
        {
            $label.hide();
        }
        else
        {
            $label.show();
        }
    }

    $(function(){
                
        checkCodeVal();
                           
        window.setInterval(checkCodeVal, 100);

        $label.click(function(){ $input.focus(); });
    });
            
}


/* Behaviors */
function onRowClick(sender)
{
    var $sender = jQuery(sender);
    
    var $firstLink = $sender.find("a").eq(0);
    
    window.location.href = $firstLink.attr('href');
    
    return false;
}


// Simple JavaScript Templating
// John Resig - http://ejohn.org/ - MIT Licensed
// Modified to handle <! !> tags.
(function(){
  var cache = {};
  
  this.tmpl = function tmpl(str, data){
    // Figure out if we're getting a template, or if we need to
    // load the template - and be sure to cache the result.
    var fn = !/\W/.test(str) ?
      cache[str] = cache[str] ||
        tmpl(document.getElementById(str).innerHTML) :
      
      // Generate a reusable function that will serve as a template
      // generator (and which will be cached).
      new Function("obj",
        "var p=[],print=function(){p.push.apply(p,arguments);};" +
        
        // Introduce the data as local variables using with(){}
        "with(obj){p.push('" +
        
        // Convert the template into pure JavaScript
        str
          .replace(/[\r\t\n]/g, " ")
          .split("<!").join("\t")
          .replace(/((^|!>)[^\t]*)'/g, "$1\r")
          .replace(/\t=(.*?)!>/g, "',$1,'")
          .split("\t").join("');")
          .split("!>").join("p.push('")
          .split("\r").join("\\'")
      + "');}return p.join('');");
    
    // Provide some basic currying to the user
    return data ? fn( data ) : fn;
  };
})();


/*
 * jQuery UI Effects 1.8rc3
 *
 * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Effects/
 */
jQuery.effects||(function(g){g.effects={};g.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor","borderTopColor","color","outlineColor"],function(l,k){g.fx.step[k]=function(m){if(!m.colorInit){m.start=j(m.elem,k);m.end=i(m.end);m.colorInit=true}m.elem.style[k]="rgb("+Math.max(Math.min(parseInt((m.pos*(m.end[0]-m.start[0]))+m.start[0],10),255),0)+","+Math.max(Math.min(parseInt((m.pos*(m.end[1]-m.start[1]))+m.start[1],10),255),0)+","+Math.max(Math.min(parseInt((m.pos*(m.end[2]-m.start[2]))+m.start[2],10),255),0)+")"}});function i(l){var k;if(l&&l.constructor==Array&&l.length==3){return l}if(k=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(l)){return[parseInt(k[1],10),parseInt(k[2],10),parseInt(k[3],10)]}if(k=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(l)){return[parseFloat(k[1])*2.55,parseFloat(k[2])*2.55,parseFloat(k[3])*2.55]}if(k=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(l)){return[parseInt(k[1],16),parseInt(k[2],16),parseInt(k[3],16)]}if(k=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(l)){return[parseInt(k[1]+k[1],16),parseInt(k[2]+k[2],16),parseInt(k[3]+k[3],16)]}if(k=/rgba\(0, 0, 0, 0\)/.exec(l)){return a.transparent}return a[g.trim(l).toLowerCase()]}function j(m,k){var l;do{l=g.curCSS(m,k);if(l!=""&&l!="transparent"||g.nodeName(m,"body")){break}k="backgroundColor"}while(m=m.parentNode);return i(l)}var a={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]};var e=["add","remove","toggle"],c={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};function f(){var n=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle,o={},l,m;if(n&&n.length&&n[0]&&n[n[0]]){var k=n.length;while(k--){l=n[k];if(typeof n[l]=="string"){m=l.replace(/\-(\w)/g,function(p,q){return q.toUpperCase()});o[m]=n[l]}}}else{for(l in n){if(typeof n[l]==="string"){o[l]=n[l]}}}return o}function b(l){var k,m;for(k in l){m=l[k];if(m==null||g.isFunction(m)||k in c||(/scrollbar/).test(k)||(!(/color/i).test(k)&&isNaN(parseFloat(m)))){delete l[k]}}return l}function h(k,m){var n={_:0},l;for(l in m){if(k[l]!=m[l]){n[l]=m[l]}}return n}g.effects.animateClass=function(k,l,n,m){if(g.isFunction(n)){m=n;n=null}return this.each(function(){var r=g(this),o=r.attr("style")||" ",s=b(f.call(this)),q,p=r.attr("className");g.each(e,function(t,u){if(k[u]){r[u+"Class"](k[u])}});q=b(f.call(this));r.attr("className",p);r.animate(h(s,q),l,n,function(){g.each(e,function(t,u){if(k[u]){r[u+"Class"](k[u])}});if(typeof r.attr("style")=="object"){r.attr("style").cssText="";r.attr("style").cssText=o}else{r.attr("style",o)}if(m){m.apply(this,arguments)}})})};g.fn.extend({_addClass:g.fn.addClass,addClass:function(l,k,n,m){return k?g.effects.animateClass.apply(this,[{add:l},k,n,m]):this._addClass(l)},_removeClass:g.fn.removeClass,removeClass:function(l,k,n,m){return k?g.effects.animateClass.apply(this,[{remove:l},k,n,m]):this._removeClass(l)},_toggleClass:g.fn.toggleClass,toggleClass:function(m,l,k,o,n){if(typeof l=="boolean"||l===undefined){if(!k){return this._toggleClass(m,l)}else{return g.effects.animateClass.apply(this,[(l?{add:m}:{remove:m}),k,o,n])}}else{return g.effects.animateClass.apply(this,[{toggle:m},l,k,o])}},switchClass:function(k,m,l,o,n){return g.effects.animateClass.apply(this,[{add:m,remove:k},l,o,n])}});g.extend(g.effects,{version:"1.8rc3",save:function(l,m){for(var k=0;k<m.length;k++){if(m[k]!==null){l.data("ec.storage."+m[k],l[0].style[m[k]])}}},restore:function(l,m){for(var k=0;k<m.length;k++){if(m[k]!==null){l.css(m[k],l.data("ec.storage."+m[k]))}}},setMode:function(k,l){if(l=="toggle"){l=k.is(":hidden")?"show":"hide"}return l},getBaseline:function(l,m){var n,k;switch(l[0]){case"top":n=0;break;case"middle":n=0.5;break;case"bottom":n=1;break;default:n=l[0]/m.height}switch(l[1]){case"left":k=0;break;case"center":k=0.5;break;case"right":k=1;break;default:k=l[1]/m.width}return{x:k,y:n}},createWrapper:function(k){if(k.parent().is(".ui-effects-wrapper")){return k.parent()}var l={width:k.outerWidth(true),height:k.outerHeight(true),"float":k.css("float")},m=g("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0});k.wrap(m);m=k.parent();if(k.css("position")=="static"){m.css({position:"relative"});k.css({position:"relative"})}else{g.extend(l,{position:k.css("position"),zIndex:k.css("z-index")});g.each(["top","left","bottom","right"],function(n,o){l[o]=k.css(o);if(isNaN(parseInt(l[o],10))){l[o]="auto"}});k.css({position:"relative",top:0,left:0})}return m.css(l).show()},removeWrapper:function(k){if(k.parent().is(".ui-effects-wrapper")){return k.parent().replaceWith(k)}return k},setTransition:function(l,n,k,m){m=m||{};g.each(n,function(p,o){unit=l.cssUnit(o);if(unit[0]>0){m[o]=unit[0]*k+unit[1]}});return m}});function d(l,k,m,n){if(typeof l=="object"){n=k;m=null;k=l;l=k.effect}if(g.isFunction(k)){n=k;m=null;k={}}if(typeof k=="number"||g.fx.speeds[k]){n=m;m=k;k={}}k=k||{};m=m||k.duration;m=g.fx.off?0:typeof m=="number"?m:g.fx.speeds[m]||g.fx.speeds._default;n=n||k.complete;return[l,k,m,n]}g.fn.extend({effect:function(n,m,p,q){var l=d.apply(this,arguments),o={options:l[1],duration:l[2],callback:l[3]},k=g.effects[n];return k&&!g.fx.off?k.call(this,o):this},_show:g.fn.show,show:function(l){if(!l||typeof l=="number"||g.fx.speeds[l]){return this._show.apply(this,arguments)}else{var k=d.apply(this,arguments);k[1].mode="show";return this.effect.apply(this,k)}},_hide:g.fn.hide,hide:function(l){if(!l||typeof l=="number"||g.fx.speeds[l]){return this._hide.apply(this,arguments)}else{var k=d.apply(this,arguments);k[1].mode="hide";return this.effect.apply(this,k)}},__toggle:g.fn.toggle,toggle:function(l){if(!l||typeof l=="number"||g.fx.speeds[l]||typeof l=="boolean"||g.isFunction(l)){return this.__toggle.apply(this,arguments)}else{var k=d.apply(this,arguments);k[1].mode="toggle";return this.effect.apply(this,k)}},cssUnit:function(k){var l=this.css(k),m=[];g.each(["em","px","%","pt"],function(n,o){if(l.indexOf(o)>0){m=[parseFloat(l),o]}});return m}});g.easing.jswing=g.easing.swing;g.extend(g.easing,{def:"easeOutQuad",swing:function(l,m,k,o,n){return g.easing[g.easing.def](l,m,k,o,n)},easeInQuad:function(l,m,k,o,n){return o*(m/=n)*m+k},easeOutQuad:function(l,m,k,o,n){return -o*(m/=n)*(m-2)+k},easeInOutQuad:function(l,m,k,o,n){if((m/=n/2)<1){return o/2*m*m+k}return -o/2*((--m)*(m-2)-1)+k},easeInCubic:function(l,m,k,o,n){return o*(m/=n)*m*m+k},easeOutCubic:function(l,m,k,o,n){return o*((m=m/n-1)*m*m+1)+k},easeInOutCubic:function(l,m,k,o,n){if((m/=n/2)<1){return o/2*m*m*m+k}return o/2*((m-=2)*m*m+2)+k},easeInQuart:function(l,m,k,o,n){return o*(m/=n)*m*m*m+k},easeOutQuart:function(l,m,k,o,n){return -o*((m=m/n-1)*m*m*m-1)+k},easeInOutQuart:function(l,m,k,o,n){if((m/=n/2)<1){return o/2*m*m*m*m+k}return -o/2*((m-=2)*m*m*m-2)+k},easeInQuint:function(l,m,k,o,n){return o*(m/=n)*m*m*m*m+k},easeOutQuint:function(l,m,k,o,n){return o*((m=m/n-1)*m*m*m*m+1)+k},easeInOutQuint:function(l,m,k,o,n){if((m/=n/2)<1){return o/2*m*m*m*m*m+k}return o/2*((m-=2)*m*m*m*m+2)+k},easeInSine:function(l,m,k,o,n){return -o*Math.cos(m/n*(Math.PI/2))+o+k},easeOutSine:function(l,m,k,o,n){return o*Math.sin(m/n*(Math.PI/2))+k},easeInOutSine:function(l,m,k,o,n){return -o/2*(Math.cos(Math.PI*m/n)-1)+k},easeInExpo:function(l,m,k,o,n){return(m==0)?k:o*Math.pow(2,10*(m/n-1))+k},easeOutExpo:function(l,m,k,o,n){return(m==n)?k+o:o*(-Math.pow(2,-10*m/n)+1)+k},easeInOutExpo:function(l,m,k,o,n){if(m==0){return k}if(m==n){return k+o}if((m/=n/2)<1){return o/2*Math.pow(2,10*(m-1))+k}return o/2*(-Math.pow(2,-10*--m)+2)+k},easeInCirc:function(l,m,k,o,n){return -o*(Math.sqrt(1-(m/=n)*m)-1)+k},easeOutCirc:function(l,m,k,o,n){return o*Math.sqrt(1-(m=m/n-1)*m)+k},easeInOutCirc:function(l,m,k,o,n){if((m/=n/2)<1){return -o/2*(Math.sqrt(1-m*m)-1)+k}return o/2*(Math.sqrt(1-(m-=2)*m)+1)+k},easeInElastic:function(l,n,k,u,r){var o=1.70158;var q=0;var m=u;if(n==0){return k}if((n/=r)==1){return k+u}if(!q){q=r*0.3}if(m<Math.abs(u)){m=u;var o=q/4}else{var o=q/(2*Math.PI)*Math.asin(u/m)}return -(m*Math.pow(2,10*(n-=1))*Math.sin((n*r-o)*(2*Math.PI)/q))+k},easeOutElastic:function(l,n,k,u,r){var o=1.70158;var q=0;var m=u;if(n==0){return k}if((n/=r)==1){return k+u}if(!q){q=r*0.3}if(m<Math.abs(u)){m=u;var o=q/4}else{var o=q/(2*Math.PI)*Math.asin(u/m)}return m*Math.pow(2,-10*n)*Math.sin((n*r-o)*(2*Math.PI)/q)+u+k},easeInOutElastic:function(l,n,k,u,r){var o=1.70158;var q=0;var m=u;if(n==0){return k}if((n/=r/2)==2){return k+u}if(!q){q=r*(0.3*1.5)}if(m<Math.abs(u)){m=u;var o=q/4}else{var o=q/(2*Math.PI)*Math.asin(u/m)}if(n<1){return -0.5*(m*Math.pow(2,10*(n-=1))*Math.sin((n*r-o)*(2*Math.PI)/q))+k}return m*Math.pow(2,-10*(n-=1))*Math.sin((n*r-o)*(2*Math.PI)/q)*0.5+u+k},easeInBack:function(l,m,k,p,o,n){if(n==undefined){n=1.70158}return p*(m/=o)*m*((n+1)*m-n)+k},easeOutBack:function(l,m,k,p,o,n){if(n==undefined){n=1.70158}return p*((m=m/o-1)*m*((n+1)*m+n)+1)+k},easeInOutBack:function(l,m,k,p,o,n){if(n==undefined){n=1.70158}if((m/=o/2)<1){return p/2*(m*m*(((n*=(1.525))+1)*m-n))+k}return p/2*((m-=2)*m*(((n*=(1.525))+1)*m+n)+2)+k},easeInBounce:function(l,m,k,o,n){return o-g.easing.easeOutBounce(l,n-m,0,o,n)+k},easeOutBounce:function(l,m,k,o,n){if((m/=n)<(1/2.75)){return o*(7.5625*m*m)+k}else{if(m<(2/2.75)){return o*(7.5625*(m-=(1.5/2.75))*m+0.75)+k}else{if(m<(2.5/2.75)){return o*(7.5625*(m-=(2.25/2.75))*m+0.9375)+k}else{return o*(7.5625*(m-=(2.625/2.75))*m+0.984375)+k}}}},easeInOutBounce:function(l,m,k,o,n){if(m<n/2){return g.easing.easeInBounce(l,m*2,0,o,n)*0.5+k}return g.easing.easeOutBounce(l,m*2-n,0,o,n)*0.5+o*0.5+k}})})(jQuery);;