var Elevator = function(_options)
{
    Elevator.instanceCount = ++Elevator.instanceCount || 1;
    var options = _options || {};
    var _elevatorInstance = this;
    var cmTimerRunning = true;
    var cmMimimized = false;

    var cmElevatorTitleText = options.title || "";
    var cmElevatorBodyText = options.body || "";
    var cmCountdownSeconds = options.countdown || 60;        
    var calloutName = options.calloutName || 'cmCallout';    
    var calloutCssUrl = options.css || "http://motu.biz/elevator/elevator2.css";    
    var calloutPosition = options.position || "left";
    var calloutLink = options.link || "";
    var calloutDelay = options.delay || 0;

    var calloutSelector = '#' + calloutName + Elevator.instanceCount;            
    var calloutSelectorMinimized = calloutSelector + 'Minimized';
    var calloutLeft;
    
    var load = function()
    {
        if (typeof $ == "undefined")
        {
            load.getScript("http://motu.biz/jquery.js");
        }
        load.tryReady(0);
    }
    
    load.getScript = function(filename)
    {
        var fileref = document.createElement('script')
        fileref.setAttribute("type", "text/javascript")
        fileref.setAttribute("src", filename)
        if (typeof fileref != "undefined")
            document.getElementsByTagName("head")[0].appendChild(fileref)
    }
    
    load.tryReady = function(time_elapsed)
    {
        /* Continually polls for jQuery library. */
        if (typeof $ == "undefined")
        {
            if (time_elapsed <= 5000)
            {
                setTimeout(function() { load.tryReady(time_elapsed + 200) }, 200);
            } else
            {
                alert("Timed out while loading jQuery.")
            }
        } else
        {
            $('head').append('<link href="' + calloutCssUrl +'" rel="stylesheet">')

            var cmHTMLString = '<div id="' + calloutSelector.substring(1) +'" class="' + calloutName +'"><div class="cmElevatorTitle">' + cmElevatorTitleText + '</div><div class="cmCloseButton"></div><div class="cmElevatorBody">' + cmElevatorBodyText + '</div><div class="cmClock">0:00</div></div>';

            $('body').append(cmHTMLString);            

            $(calloutSelector).mouseover(function()
            {
                $(calloutSelector).stop(true);
                cmTimerRunning = false;
            });


            $(calloutSelector).mouseleave(function()
            {
                cmTimerRunning = true;
                if (!cmMimimized) $(calloutSelector).animate({ top: '100px' }, 10000);
            });

            $(calloutSelector).mouseover(function()
            {
                cmTimerRunning = false;
            });

            $(calloutSelector).mouseleave(function()
            {
                cmTimerRunning = true;
            });

            calloutLeft = (calloutPosition == 'left') ? 50 : ($(window).width() - 350);            
            $(calloutSelector).css("top", $(window).height());
            $(calloutSelector).css("display", "block");
            $(calloutSelector).css("left", calloutLeft);

            //start clock            
            setTimeout(function() { _elevatorInstance.cmCountdown(); }, 1000);

            //start animation
            $(calloutSelector).animate({ top: '100px' }, 10000);

            var cmHTMLString = '<div id="'+ calloutSelectorMinimized.substring(1) + '" class="' + calloutName + 'Minimized"><div class="cmElevatorTitle">' + cmElevatorTitleText + '</div><div class="cmClock">0:00</div><div class="cmCloseButton"></div></div>';
            $('body').append(cmHTMLString);

            $(calloutSelector).find('.cmCloseButton').click(cmMinimize);
            $(calloutSelectorMinimized).find('.cmCloseButton').click(cmRestore);

            if(calloutLink.length > 0)
            {
                $(calloutSelector).find('.cmElevatorBody').click(function() { location.href = calloutLink });
            }
        }
    }

    this.cmCountdown = function()
    {
    	if(cmTimerRunning) cmCountdownSeconds = cmCountdownSeconds - 1;
    	if(cmCountdownSeconds>=0)
    	{
    		var displaySeconds = "0:" + ((cmCountdownSeconds<10)?"0":"") + cmCountdownSeconds
    		$(calloutSelector + ',' + calloutSelectorMinimized).find(".cmClock").html(displaySeconds);
    		setTimeout(function() { _elevatorInstance.cmCountdown(); }, 1000);
    	}
    	else
    	{
    		cmCleanup();
    	}
    }

    function cmMinimize()
    {
    	cmMimimized = true;
    	$(calloutSelector).unbind('mouseover'); // fixes bug when mousing over callout stops the minimize/close animation    	
    	$(calloutSelectorMinimized).css("top", $(calloutSelector).css("top"));
    	$(calloutSelectorMinimized).show();
    	$(calloutSelectorMinimized).css("z-index", 1000);
    	$(calloutSelector).css("z-index", 100);
    	$(calloutSelector).slideUp(function(){
        	$(calloutSelectorMinimized).animate({top:$(window).height() - $(calloutSelectorMinimized).height() - 10},500);              	
    	    	    
    	    // after minimized animation is done, reenable the event we unbinded above!
            $(calloutSelector).mouseover(function()
            {
                $(calloutSelector).stop(true);
                cmTimerRunning = false;
            });    	
    	});
    }

    function cmRestore()
    {
        cmTimerRunning = true;
        $(calloutSelector).css("top", $(calloutSelectorMinimized).css("top") );
        $(calloutSelector).css("top", $(window).height() - $(calloutSelector).height() - 10);
        $(calloutSelectorMinimized).css("z-index", 100);
        $(calloutSelector).css("z-index", 1000);

        $(calloutSelectorMinimized).hide();
    	$(calloutSelector).show();

    }

    function cmCleanup()
    {
    	$(calloutSelectorMinimized).fadeOut("slow");
    	$(calloutSelector).fadeOut("slow");
    }

    ///// initialize /////
    setTimeout(function() { load() }, calloutDelay);
}