(function (window, document, undefined) {

    function getAssetDomain() {
        var src = scripts[scripts.length - 1].src;
        return src.substr(0, src.indexOf('/scripts/'));
    }

    function protocol_absolute(src) {
        if (src[0] === ':') return (document.location.protocol === 'https' ? 'https' : 'http') + src;
        return src;
    }

    function require(objname, src, loaded, force) {
        var parent = this, exec = function (downloaded) {
            if (loaded.already) return;
            loaded.already = true;
            loaded(window[objname], downloaded !== false);
        };
        if (parent[objname] === undefined || force === undefined || force.call(window, parent[objname])) {
            var script_tag = document.createElement('script');
            script_tag.setAttribute("type", "text/javascript"); 
            script_tag.setAttribute("src", protocol_absolute(src));
            script_tag.onload = exec;
            script_tag.onreadystatechange = function () {
                if (this.readyState === 'complete' || this.readyState === 'loaded') {
                    setTimeout(exec, 100);
                }
            };
            scripts[0].parentNode.insertBefore(script_tag, scripts[0]);
        } else exec(false);
    }

    function dateDiff(d1, d2) {
        var t2 = d2.getTime(),
            t1 = d1.getTime(),
            totalSeconds = Math.floor((t2 - t1) / 1000),
            wholeDays = totalSeconds > 86400 ? Math.abs(Math.floor(totalSeconds / (86400))) : 0,
            leftAfterDays = totalSeconds - (wholeDays * 86400),
            wholeHours = Math.abs(Math.floor(leftAfterDays / 3600)),
            leftAfterHours = leftAfterDays - (wholeHours * 3600),
            wholeMinutes = Math.abs(Math.floor(leftAfterHours / 60)),
            leftAfterMinutes = leftAfterHours - (wholeMinutes * 60);

        return {
            days: wholeDays,
            hours: wholeHours,
            minutes: wholeMinutes,
            seconds: leftAfterMinutes
        };
    }

    function requireCss(url) {
        $('<link rel="stylesheet" type="text/css" />')
            .attr({ href: url })
            .insertBefore(scripts[0]);
    }

    function display(options) {
        options = $.extend({
            APIKEY: '', size: '', location: '', bgcolor: '', showpreloader: true, PID: '', AID: '', title: ''
        }, options);
        if (!options.size || !options.APIKEY) return;

        var adContainer = $('<div class="grouponAdContainer" />')
                .insertAfter(scripts[scripts.length - 1]),
            sizeSplit = options.size.split('.'),
            CSSURL = ASSETDOMAIN + '/stylesheets/widget/ad' + options.size + '.css',
            JSURL = ASSETDOMAIN + '/scripts/widget/ad' + options.size + '.js',
            apidata = {
                apikey: options.APIKEY
            };
        adContainer.addClass('grouponAd' + sizeSplit.join('-'));
        requireCss(ASSETDOMAIN + '/stylesheets/widget/adall.css');
        requireCss(CSSURL);

        if (options.location) {
            var latLon = options.location.split(',');
            apidata.lat = latLon[0];
            apidata.lng = latLon[1];
        }

        if (options.showpreloader) {
            adContainer
                .append($('<img />', { 'class': 'grouponPreloaderImage', src: protocol_absolute('://www.groupon.com/images/groupon/widget/loader.gif') }))
                .append('<div class="grouponPreloaderMessage">Loading Groupon</div>');
        }

        require.call(groupon.ads, options.size, JSURL, function () {
            $.getJSON(APIURL, apidata).success(function (data) {
                adContainer.empty();
                var d1 = new Date(),
                    adGroup = $('<div class="grouponAdGroup" />').appendTo(adContainer),
                    cjprepend = 'http://www.anrdoezrs.net/click-' + options.PID + '-' + options.AID + '?url=',
                    cjimg = $('<img/>', {
                        'class': 'hidden-element',
                        src: protocol_absolute('://www.anrdoezrs.net/image-' + options.PID + '-' + options.AID)
                    }).appendTo(adContainer);

                $.each(data.deals.slice(0, 2), function (i, deal) {
                    deal.discount_dollars = parseInt(deal.discount_amount, 10);

                    var priority_image = deal.placement_priority.split('-').join('');
                    if (priority_image === 'featured') priority_image = 'dailydeal';
                    deal.placement_priority_image = protocol_absolute('://www.groupon.com/images/groupon/widget/show' + priority_image + '_medium.png');

                    $('<div/>').html(format(groupon.ads[options.size], deal))
                           .children('.grouponAdContents')
                           .addClass('grouponAd_' + deal.placement_priority)
                           .appendTo(adGroup)
                           .css({ left: parseInt(sizeSplit[0], 10) * i })
                           .click(function (e) {
                               e.preventDefault();
                               window.open(cjprepend + escape(deal.deal_url));
                           });
                });

                if (options.bgcolor) {
                    if (options.bgcolor[0] !== '#') options.bgcolor = '#' + options.bgcolor;
                    adContainer.find('.grouponColor').css('color', options.bgcolor);
                    adContainer.find('.grouponAdContents').css('border-color', options.bgcolor);
                    adContainer.find('.grouponEllipse').autoEllipsis();
                }

                adContainer.find('.grouponShowOther').click(function (e) {
                    e.preventDefault();
                    e.stopPropagation();
                    var self = $(this), ad = self.closest('.grouponAdContents'), group = ad.parent();
                    group.animate({ left: -parseInt(ad.css('left'), 10) }, 500);
                });
            });
        });
    }

    function format(input, values) {
        for (var i in values) if (values.hasOwnProperty(i))
            input = input.split('{' + i + '}').join(values[i]);
        return input;
    } 

    function groupon_init() {
        autoEllipsis_init($);

        if (typeof (_gwparam) !== 'undefined') {
            display(_gwparam);
        }

        setInterval(decrementTime, 1000);
    }

    function decrementTime() {
        var now = new Date(),
            utcnow = new Date(-now.getTimezoneOffset() * 60 * 1000 + now.getTime());

        $('.grouponAdContainer [data-enddate]').each(function () {
            var self = $(this),
                endDate = new Date(Date.parse(self.data('enddate'))),
                diff = dateDiff(utcnow, endDate);

            self.find('.grouponHours').text(diff.hours + diff.days * 24);
            self.find('.grouponMinutes').text(diff.minutes);
            self.find('.grouponSeconds').text(diff.seconds);
        });
    }

    function autoEllipsis_init(jQuery) {
        /// <reference path="jquery-1.3.2-vsdoc.js"/>
        /*
        by Homam Hosseini
        http://abstractform.wordpress.com
        bluesnowball@gmail.com
        
        */

        jQuery.fn.autoEllipsis = function (options) {
            var get_AutoEllipsisScroller = function (id) {
                var aeScrollerId = "WingooliAutoEllipsisScroller_" + id
                if (!document.getElementById(aeScrollerId)) {
                    var div = document.createElement("div");
                    div.id = aeScrollerId + "_Container";
                    div.innerHTML = "<span id=\"" + aeScrollerId + "\" style=\"overflow: visible; position: absolute; top: -2000px; color: orange\"></span>";
                    document.body.appendChild(div);
                }
                return document.getElementById(aeScrollerId);
            };

            var StringEllipsesByMaxLetters = function (element, originalText, maxLettersAllowed) {
                element.title = "";
                var text = originalText;
                if (text == null || text == "") text = element.innerHTML;
                var maxAllowedLatterIndex = text.length - maxLettersAllowed;
                if (maxAllowedLatterIndex > 0) {
                    element.title = text;
                    if (originalText == null)
                        originalText = text;
                    element.innerHTML = text.substr(0, maxLettersAllowed - 2) + "&hellip;";
                } else {
                    element.innerHTML = text;
                }
            };

            var _this = this;

            var settings = jQuery.extend({}, options);
            this.each(function (i) {
                var aeScroller = get_AutoEllipsisScroller(i);
                saeScroller = $(aeScroller);
                sthis = $(this);
                saeScroller.text(sthis.text());

                var origText = sthis.html();

                var element = this;
                var elementBounds = { width: element.offsetWidth, height: element.offsetHeight };

                var jAeScroller = $(aeScroller);
                var jElement = $(element);

                var props = ["font-size", "font-weight", "font-family", "font-style", "padding"];

                for (var i = 0; i < props.length; i++) {
                    try {
                        jAeScroller.css(props[i], jElement.css(props[i]));
                    } catch (ex) { }
                }
                jElement.css("overflow", "visible");


                jAeScroller.width(jElement.width());

                var isIe = (document.all != undefined);
                var scrollerWidth = jAeScroller.width();
                var scrollerHeight = jAeScroller.height();
                var fitText = saeScroller.text();

                while (scrollerHeight > elementBounds.height && fitText != "") {
                    fitText = fitText.substr(0, fitText.length - 2);
                    var autoScrollerInnerHTML = fitText + "&hellip;";
                    saeScroller.html(autoScrollerInnerHTML);
                    scrollerHeight = jAeScroller.height();
                }
                if (fitText == "") {
                    fitText = origText;
                    saeScroller.html(fitText);
                    jElement.css("whiteSpace", "nowrap");
                    jAeScroller.width("");
                    var scrollerWidth = jAeScroller.width();
                }

                while (scrollerWidth > elementBounds.width && fitText != "") {
                    fitText = fitText.substr(0, fitText.length - 2);
                    var autoScrollerInnerHTML = fitText + "&hellip;";
                    saeScroller.html(autoScrollerInnerHTML);
                    scrollerWidth = jAeScroller.width();
                }
                var scrollerHeight = aeScroller.offsetHeight;
                var r = (Math.ceil(elementBounds.height / scrollerHeight) - 1);
                r += (r == 0) ? 1 : 0;
                var maxLettersAllowed = fitText.length * r;

                StringEllipsesByMaxLetters(element, origText, maxLettersAllowed + (r + 1));
            });
        }
    }

    var $, groupon = (window.groupon = window.groupon || { display: display, ads: {} }),
        scripts = document.getElementsByTagName('script'),
        ASSETDOMAIN = getAssetDomain(),
        IMGURL = ASSETDOMAIN + '/images/groupon/widget/',
        APIURL = protocol_absolute('://www.groupon.com/api/v1/deals.json?callback=?');

    require.call(window, 'jQuery',
        '://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js',
        function (jQuery, downloaded) {
            if (downloaded) jQuery.noConflict();
            $ = jQuery.sub();
            groupon_init();

        }, function (jQuery) {
            return jQuery().jquery.substr(0, 3) != "1.5";
        });
})(window, document);
