// leading ; to close anything someone else might have left open 
;(function() {

    // define namespace
    window.snaprwidget = snaprwidget = {
	// init contains things relying on jQ and runs when jQ is ready
        init: function(){

	    // don't init again
	    if(snaprwidget.initalised)
		return;
	    snaprwidget.initalised = true;

	    // store our jQuery and give the page it's jQuery and/or $ function back
            snaprwidget.jQuery = jQuery.noConflict(true);

	    // run the rest of the code in an anon function to allow the use of $
            (function($){

		// add the widgets css file
                $('<link rel="stylesheet" href="http://static.sna.pr/live/w/styles/widget.css" type="text/css" />').appendTo(document.getElementsByTagName('head')[0]);

		// get the HTML and inject it
                snaprwidget.Widget.prototype.render = function(){
		    // store for use in other functions where this != the Widget
                    var widget = this;
                    $.ajax({
                        url:'http://sna.pr/widgets/image/',
                        data: $.extend(this.options, {widget_id: widget.number}),
                        dataType: 'jsonp',
                        success: function(data){
                            $('#snaprwidget'+widget.number).html(data.html);
                            widget.activate();
                        }
                    });
                };
		// setup interactions
                snaprwidget.Widget.prototype.activate = function(){
                    var widget = this;
                    var wrapper = $('#snaprwidget'+widget.number);
		    var image_holder = wrapper.find('#snaprwidget-content #snaprwidget-imagedisplay');
                    
                    // older IE can't handle fading pngs well
                    snaprwidget.fade = ($.browser.msie && parseFloat($.browser.version) < 9)? 0 : 1;
                    
                    // overlay initially hidden
                    $(wrapper).find('#snaprwidget-imageoverlay').hide();
                    
                    // pretty dates
                    $(wrapper).find('.snaprwidget-prettyDate').each(function(){
                        var $this = $(this),
			    date = $this.text();
			$this
			    .data('date', date)
			    .text(snaprwidget.prettyDate(date));
                    });
                    
                    // set image holder height for first animation
                    widget.set_height();
		    
		    //fix overlay clicking in IE
		    if($.browser.msie){
			wrapper.find('#snaprwidget-image img').click(function(){
			    window.location = wrapper.find('#snaprwidget-content #snaprwidget-imageoverlay').attr('href').replace('/#/','/');      
			});  
		    }
                    
                    // Click thumbs
                    wrapper.find('.snaprwidget-ajax-photostream-thumb').live('click', function(e){
                        e.preventDefault();
                        // image
                        var image = wrapper.find('#snaprwidget-content .snaprwidget-snaprbubbleimage');
                        var aspect = parseInt($(this).find('.snaprwidget-ajax-photostream-width').text()) / parseInt($(this).find('.snaprwidget-ajax-photostream-height').text());
                        var height = wrapper.find('#snaprwidget-content').width() / aspect;
                        image_holder.animate({'height': height});
                        image.attr('src', '');
                        image.attr('src', $(this).find('.snaprwidget-ajax-photostream-image').attr('src').replace('thm', 'lrg'));
                        image.hide();
			image_holder.find('.width').text($(this).find('.snaprwidget-ajax-photostream-width').text());
			image_holder.find('.height').text($(this).find('.snaprwidget-ajax-photostream-height').text());
                        // link
                        wrapper.find('#snaprwidget-imageoverlay').attr('href', $(this).find('.snaprwidget-ajax-photostream-link').attr('href'));
                        // description
                        var description = $(this).find('.snaprwidget-ajax-photostream-desc').text();
                        wrapper.find('#snaprwidget-imagetag p').text(description);
                        // username
                        var username = $(this).find('.snaprwidget-ajax-photostream-user').text();
                        wrapper.find('.snaprwidget-username a').text(username);
                        wrapper.find('.snaprwidget-username a').attr('href', 'http://sna.pr/'+username+'/');
                        // avatar
                        wrapper.find('.snaprwidget-avatar').attr('href', 'http://sna.pr/'+username+'/');
                        wrapper.find('.snaprwidget-avatar img').attr('src', 'http://sna.pr/avatars/'+username+'/');
                        // date and location
                        var location = wrapper.find('#snaprwidget-imagelocation .snaprwidget-prettyDate').text($(this).find('.snaprwidget-ajax-photostream-date').text()+' ');
                        wrapper.find('#snaprwidget-imagelocation').text($(this).find('.snaprwidget-ajax-photostream-location').text()+' ').append(location);
                   
                        // if images is loaded, trigger load event, the browser can't be trusted to do this if it's cached
                        if(image[0].complete){
			    image.load();
			}
                    });
                    
                    // show image once loaded
                    $('#snaprwidget'+this.number).find('.snaprwidget-snaprbubbleimage').load(function(){
                        $(this).fadeIn(snaprwidget.fade*400);
                    });
                    
                    // polling
                    if(widget.options.polling != 0){
                        var rate = widget.options.polling || 30;
                        if(rate < 15)
                            rate = 15;
                        setInterval($.proxy(widget.poll, widget), rate*1000);
                    }
                    
                    // fade in logo and title on hover
                    wrapper.find('#snaprwidget-imagedisplay').hover(
                        function(){
                            $(this).find('#snaprwidget-imageoverlay').fadeIn(snaprwidget.fade*200);
                        },
                        function(){
                            $(this).find('#snaprwidget-imageoverlay').fadeOut(snaprwidget.fade*200);
                        }
                    );

                };

		
		// set height
		snaprwidget.Widget.prototype.set_height = function(){
                    var widget = this;
                    var wrapper = $('#snaprwidget'+widget.number);
		    var image_holder = wrapper.find('#snaprwidget-content #snaprwidget-imagedisplay');
		    var aspect = parseInt(image_holder.find('.width').text()) / parseInt(image_holder.find('.height').text());
		    image_holder.css({'height': image_holder.width() / aspect});
		}
		    
		snaprwidget.Widget.prototype.refresh_dates = function(){
                    $('#snaprwidget'+this.number+' .snaprwidget-prettyDate').each(function(){
                        var $this = $(this);
			$this.text(snaprwidget.prettyDate($this.data('date')));
                    });
		};
		// polling function
                snaprwidget.Widget.prototype.poll = function(){
		    // store for use in other functions where this != the Widget
                    var widget = this;
		    
		    this.refresh_dates();
                    
                    if(!widget.latest_date)
                        widget.latest_date = snaprwidget['widget_'+widget.number+'_details'].date;
                    
                    var polling = $('#snaprwidget'+widget.number).find('#snaprwidget-pollingoverlay').fadeIn(snaprwidget.fade*200);
		    var data = {
                            n:widget.options.n,
                            min_date: widget.latest_date
                        };
                    if( widget.options.max_date )
                        data.max_date = widget.options.max_date;
                    if( widget.options.username )
                        data.username = widget.options.username;
                    if( widget.options.area )
                        data.bbox = widget.options.area;
                    if( widget.options.keywords )
                        data.keywords = widget.options.keywords;
                    if( widget.options.favorited_by ){
                        data.favorited_by = widget.options.favorited_by;
			data.sort = 'date_favorited';
		    }
		    //console.log(widget.options.title, data);
                    $.ajax({
                        //url:'http://localhost:8000/v3/search/',
                        url:'http://api.sna.pr/v0/search/',
                        data: data,
                        dataType: 'jsonp',
                        success: function(data){  
                            if(data.success && data.response.photos.length){
                                $.each(data.response.photos.reverse(), function(i,e){
                                    widget.append(this);
                                });
                                widget.latest_date = data.date;
				$('#snaprwidget'+widget.number).find('.snaprwidget-none').removeClass('snaprwidget-none');
                                $('#snaprwidget'+widget.number).find('#snaprwidget-ajax-photostream-thumbs').children(':visible').eq(0).click();
                                
                            }
                            polling.fadeOut(snaprwidget.fade*200);
                        }
                    });
                };
                // insert image function
                snaprwidget.Widget.prototype.append = function(photo){
		    // store for use in other functions where this != the Widget
                    var widget = this;
                    var list = $('#snaprwidget'+this.number).find('#snaprwidget-ajax-photostream-thumbs');
                    var template = list.children().eq(0).clone().show();
                    var append = ( widget.options.favorited_by ) ? 'st=fav&q='+widget.options.favorited_by : '' ;
                    append = ( widget.options.keywords ) ? 'st=tag&q='+widget.options.keywords : append ;
                    var prepend = ( widget.options.username && append == '' ) ? widget.options.username+'/' : '' ;
                    template.find('.snaprwidget-ajax-photostream-link')
                        .attr('href', 'http://sna.pr/#/'+prepend+photo.id+'/?'+append)
                        .attr('title', photo.username+': '+photo.description)
                        .find('img')
                            .attr('src', 'http://media-server2.snapr.us/thm/'+photo.secret+'/'+photo.id+'.jpg');
                    template.find('.snaprwidget-ajax-photostream-location').text(photo.location_name);
                    template.find('.snaprwidget-ajax-photostream-width').text(photo.width);
                    template.find('.snaprwidget-ajax-photostream-height').text(photo.height);
                    template.find('.snaprwidget-ajax-photostream-desc').text(photo.description);
                    template.find('.snaprwidget-ajax-photostream-user')
                        .text(photo.username.toLowerCase())
                        .attr('href', 'http://sna.pr/'+photo.username.toLowerCase()+'/');
                    template.find('.snaprwidget-ajax-photostream-date').data('date', photo.date).text(snaprwidget.prettyDate(photo.date));
                    list.children(':last').remove();
                    template.prependTo(list);
                };
                // create queued widgets if any
		$.each(snaprwidget.queue, function(){
		    this.render();
		});
            })(snaprwidget.jQuery);
        },
	// to store widgets which could not be created due to init not havoing been run
	queue:[],
	// keep track of widget count to give them unique IDs
        count: 0
    };

    // creates a Widget and renders it, or adds to the render queue
    snaprwidget.Widget = function(options){
	this.options = options;
	snaprwidget.count ++;
	this.number = snaprwidget.count;
	document.write('<div id="snaprwidget'+this.number+'"></div>');
	if(snaprwidget.initalised){
	    this.render();
	}else{
	    snaprwidget.queue.push(this);
	}
    };

    // load jQuery
    var jq = document.createElement('script');
    jq.src = 'http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js';
    document.getElementsByTagName('head')[0].appendChild(jq);
    jq.onreadystatechange = function () {
        if (jq.readyState == 'loaded' || jq.readyState == 'complete') {
	    snaprwidget.init();
        }
    }
    jq.onload = function () {
	snaprwidget.init();
    }
    
    snaprwidget.prettyDate = function(time){
		time = (time || "").replace(/-/g,"/").replace(/ \//g," -").replace(/[TZ]/g," ")
	var	date = new Date(time),
		diff = (((new Date()).getTime() - date.getTime()) / 1000),
		day_diff = Math.floor(diff / 86400);
	if ( isNaN(day_diff) || day_diff < 0 )//|| day_diff >= 31 )
		return;
	if (day_diff == 0){
		return(
			diff < 60 && 'just now' ||
			diff < 3600 && Math.floor( diff / 60 ) + " minutes ago" ||
			diff < 7200 && "about 1 hour ago" ||
			diff < 86400 && "about " + Math.floor( diff / 3600 ) + " hours ago");
	}

	date = new Date(time.replace(/ [\+-]\d{4}$/,'')); //strip TZ
	if(date.getHours() <= 12){
		var hours = date.getHours(),
			ap = 'AM'
	}else{
		var hours = date.getHours() -12,
			ap = 'PM'

	}

	//if the image was taken yesterday it would show: 8:25 PM Yesterday
	if (day_diff == 1){
		return hours+':'+date.getMinutes().zeroFill(2)+' '+ap+ ' Yesterday';
	}
	//If the image was taken within the last 30 days it would say: 8:25 PM X Days Ago
	if (day_diff < 30){
		return hours+':'+date.getMinutes().zeroFill(2)+' '+ap+ ' '+ day_diff +' Days Ago';
	}

	var months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'],
	full_date = hours+':'+date.getMinutes().zeroFill(2)+' '+ap+' '+months[date.getMonth()]+' '+date.getDate().ordinal();
	if (date.getFullYear() == new Date().getFullYear())
		return full_date
	return full_date+', '+date.getFullYear()
    }
    
    Number.prototype.zeroFill = function( width ){
	width -= this.toString().length;
	if ( width > 0 )
	{
		return new Array( width + (/\./.test( this ) ? 2 : 1) ).join( '0' ) + this;
	}
	return this.toString();
    }
    Number.prototype.ordinal = function(){
        if( this!=11 && this!=12 && this!=13 ){
            that = String(this)
            switch( that.substr(that.length-1) ){
                    case '1':
                            return that+'st';
                    case '2':
                            return that+'nd';
                    case '3':
                            return that+'rd';
            }
        }
        return this+'th';
    }
})();

