/**
 * Plugin: jquery.zFlickrFeed
 * 
 * Version: 1.0.1
 * (c) Copyright 2010, Zazar Ltd
 * 
 * Description: jQuery plugin for display of Flickr photo feeds
 * 
 * History:
 * 1.0.1 - Corrected issue with multiple instances
 *
 **/

(function($){

	$.fn.flickrfeed = function(userid, setid, tags, options) {	
	
		// Set pluign defaults
		var defaults = {
			limit: 10,
			header: false,
			imagesize: 'small',
			titletag: 'h4',
			title: false,
			date: false
		};  
		var options = $.extend(defaults, options); 
		
		// Functions
		return this.each(function(i, e) {
			var $e = $(e);

			// Add feed class to user div
			if (!$e.hasClass('flickrFeed')) $e.addClass('flickrFeed');

			// Define Flickr feed API address
			
			//if setid was passed, then use photoset feed
			if (setid != '') {
				var api = 'http://api.flickr.com/services/feeds/photoset.gne?format=json&jsoncallback=?&set=' + setid + '&nsid=' + userid;
			}else{
			//else use photos_public feed
				var api = 'http://api.flickr.com/services/feeds/photos_public.gne?lang=en-us&format=json&jsoncallback=?';
				if (userid != '') api += '&id=' + userid;
				if (tags != '') api += '&tags=' + tags;
			}

			// Send request
			$.getJSON(api, function(data){

				// Process the feeds
				_callback(e, data, options);
			});				
		});
	};
	
	// Callback function to create HTML result
	var _callback = function(e, data, options) {
		if (!data) {
			return false;
		}
		var html = '';	
		var row = 'odd';
		
		// Add header if required
		if (options.header) {

			var desc = data.description;	
			if (desc == '') desc = data.title;

			html +=	'<div class="flickrHeader">' +
				'<a href="'+ data.link +'" title="'+ desc +'">'+ data.title +'</a>' + '</div>';
		}
			
		// Add body
		html += '<div class="flickrBody">'; //+ '<ul>';

		var feeds = data.items;
		var count = feeds.length;
		if (count > options.limit) count = options.limit;
		
		// Add feeds
		for (var i=0; i<count; i++) {
			
			// Get individual feed
			var photo= feeds[i];
			var link = '<a href="'+ photo.link + '" title="'+ photo.title +' (View on Flickr)">';

			// Add feed row
			//html += '<li class="flickrRow '+ row +'">';
			
			// Select image size
			var src = photo.media.m;
			if (options.imagesize == 'square') src = src.replace('_m', '_s');
			if (options.imagesize == 'thumbnail') src = src.replace('_m', '_t');
			if (options.imagesize == 'medium') src = src.replace('_m', '');

			html += link +'<img sr' + 'c="'+ src +'" alt="'+ photo.title +'" /></a>'

			// Add title if required
			if (options.title)	html += '<'+ options.titletag +'>'+ photo.title +'</'+ options.titletag +'>';

			// Add date if required
			if (options.date){
				var photoDate = new Date(photo.date_taken);
				photoDate = photoDate.toLocaleDateString() + ' ' + photoDate.toLocaleTimeString();

				html += '<div>'+ photoDate +'</div>';
			}
				
				
			//html += '</li>';
			
			// Alternate row classes
			if (row == 'odd') {
				row = 'even';
			} else {
				row = 'odd';
			}			
		}
		
		//html += '</ul>' + '</div>'
		html += '</div>'
		
		$(e).html(html);
	};
})(jQuery);







/**
 * Plugin: jquery.zRSSFeed
 * 
 * Version: 1.1.3
 * (c) Copyright 2010-2011, Zazar Ltd
 * 
 * Description: jQuery plugin for display of RSS feeds via Google Feed API
 *              (Based on original plugin jGFeed by jQuery HowTo. Filesize function by Cary Dunn.)
 * 
 * History:
 * 1.1.3 - Check for valid published date
 * 1.1.2 - Added user callback function due to issue with ajaxStop after jQuery 1.4.2
 * 1.1.1 - Correction to null xml entries and support for media with jQuery < 1.5
 * 1.1.0 - Added support for media in enclosure tags
 * 1.0.3 - Added feed link target
 * 1.0.2 - Fixed issue with GET parameters (Seb Dangerfield) and SSL option
 * 1.0.1 - Corrected issue with multiple instances
 *
 **/

(function($){

	$.fn.rssfeed = function(url, options, fn) {	
	
		// Set pluign defaults
		var defaults = {
			limit: 10,
			header: true,
			titletag: 'h4',
			date: true,
			content: true,
			snippet: true,
			showerror: true,
			errormsg: '',
			key: null,
			showthumb: false,
			defaultthumb: '',
			ssl: false,
			linktarget: '_self'
		};  
		var options = $.extend(defaults, options); 
		
		// Functions
		return this.each(function(i, e) {
			var $e = $(e);
			var s = '';

			// Check for SSL protocol
			if (options.ssl) s = 's';
			
			// Add feed class to user div
			if (!$e.hasClass('rssFeed')) $e.addClass('rssFeed');
			
			// Check for valid url
			if(url == null) return false;
			
			// Create Google Feed API address
			var api = "http"+ s +"://ajax.googleapis.com/ajax/services/feed/load?v=1.0&callback=?&q=" + encodeURIComponent(url);
			if (options.limit != null) api += "&num=" + options.limit;
			if (options.key != null) api += "&key=" + options.key;
			api += "&output=json_xml"

			// Send request
			$.getJSON(api, function(data){
				
				// Check for error
				if (data.responseStatus == 200) {
	
					// Process the feeds
					_process(e, data.responseData, options);

					// Optional user callback function
					if ($.isFunction(fn)) fn.call(this,$e);
					
				} else {

					// Handle error if required
					if (options.showerror)
						if (options.errormsg != '') {
							var msg = options.errormsg;
						} else {
							var msg = data.responseDetails;
						};
						$(e).html('<div class="rssError"><p>'+ msg +'</p></div>');
				};
			});				
		});
	};
	
	// Function to create HTML result
	var _process = function(e, data, options) {

		// Get JSON feed data
		var feeds = data.feed;
		if (!feeds) {
			return false;
		}
		var html = '';	
		var row = 'odd';
		
		// Get XML data for media (parseXML not used as requires 1.5+)
		var xml = getXMLDocument(data.xmlString);
		var xmlEntries = xml.getElementsByTagName('item');
		
		// Add header if required
		if (options.header)
			html +=	'<div class="rssHeader">' +
				'<a href="'+feeds.link+'" title="'+ feeds.description +'">'+ feeds.title +'</a>' +
				'</div>';
			
		// Add body
		html += '<div class="rssBody">' +
			'<ul>';
		
		// Add feeds
		for (var i=0; i<feeds.entries.length; i++) {
			
			// Get individual feed
			var entry = feeds.entries[i];
			var pubDate;

			// Format published date
			if (entry.publishedDate) {
				var entryDate = new Date(entry.publishedDate);
				var pubDate = entryDate.toLocaleDateString() + ' ' + entryDate.toLocaleTimeString();
			}
			
			
			

			//show feed with thumbnails
			if(options.showthumb){
				
				//get thumbnail URL from the feed
				try {
					if (entry.mediaGroups[0].contents[0].thumbnails[0]) {
							thumb = entry.mediaGroups[0].contents[0].thumbnails[0].url;
					}
				} catch(err) {
					thumb = options.defaultthumb;
				}

								
				// Add feed row
				html += '<li class="rssImageRow '+row+'">';
				html += '<a href="'+ entry.link +'" title="View this feed at '+ feeds.title +'" target="'+ options.linktarget +'"><img sr' + 'c="'+ thumb + '" alt="' + entry.title + '" width="100px" height="100px"/></a>';
				html += '<div class="rssText">';
				html += '<'+ options.titletag +'><a href="'+ entry.link +'" class="rssTitle rssImageTitle" title="View this feed at '+ feeds.title +'" target="'+ options.linktarget +'">';
				html += entry.title +'</a></'+ options.titletag +'>';

				if (options.date) html += '<div class="rssMeta">'+ pubDate +'</div>'
				if (options.content) {
			
					// Use feed snippet if available and optioned
					if (options.snippet && entry.contentSnippet != '') {
						var content = entry.contentSnippet;
					} else {
						var content = entry.content;
					}
					
					html += '<p class="rssContent">'+ content +'</p>'
				}
			
				html += '</div></li>';
			
			
			}else{
				// show feed without thumbs
			
			
			

				
				// Add feed row
				html += '<li class="rssRow '+row+'">' + 
					'<'+ options.titletag +'><a href="'+ entry.link +'" title="View this feed at '+ feeds.title +'" target="'+ options.linktarget +'">'+ entry.title +'</a></'+ options.titletag +'>'
				if (options.date && pubDate) html += '<div>'+ pubDate +'</div>'
				if (options.content) {
				
					// Use feed snippet if available and optioned
					if (options.snippet && entry.contentSnippet != '') {
						var content = entry.contentSnippet;
					} else {
						var content = entry.content;
					}
					
					html += '<p>'+ content +'</p>'
				}
			}
			
			// Add any media
			if(xmlEntries.length > 0) {
				var xmlMedia = xmlEntries[i].getElementsByTagName('enclosure');
				if (xmlMedia.length > 0) {
					html += '<div class="rssMedia"><div>Media files</div><ul>'
					for (var m=0; m<xmlMedia.length; m++) {
						var xmlUrl = xmlMedia[m].getAttribute("url");
						var xmlType = xmlMedia[m].getAttribute("type");
						var xmlSize = xmlMedia[m].getAttribute("length");
						html += '<li><a href="'+ xmlUrl +'" title="Download this media">'+ xmlUrl.split('/').pop() +'</a> ('+ xmlType +', '+ formatFilesize(xmlSize) +')</li>';
					}
					html += '</ul></div>'
				}
				html += '</li>';
			}
			
			// Alternate row classes
			if (row == 'odd') {
				row = 'even';
			} else {
				row = 'odd';
			}			
		}
		
		html += '</ul>' +
			'</div>'
		
		$(e).html(html);
	};
	
	function formatFilesize(bytes) {
		var s = ['bytes', 'kb', 'MB', 'GB', 'TB', 'PB'];
		var e = Math.floor(Math.log(bytes)/Math.log(1024));
		return (bytes/Math.pow(1024, Math.floor(e))).toFixed(2)+" "+s[e];
	}

	function getXMLDocument(string) {
		var browser = navigator.appName;
		var xml;
		if (browser == 'Microsoft Internet Explorer') {
			xml = new ActiveXObject('Microsoft.XMLDOM');
			xml.async = 'false'
			xml.loadXML(string);
		} else {
			xml = (new DOMParser()).parseFromString(string, 'text/xml');
		}
		return xml;
	}

})(jQuery);






/*
* Tadas Juozapaitis ( kasp3rito@gmail.com )
*/
(function($){
$.fn.vTicker = function(options) {
	var defaults = {
		speed: 700,
		pause: 4000,
		showItems: 3,
		animation: '',
		mousePause: true,
		isPaused: false
	};

	var options = $.extend(defaults, options);

	moveUp = function(obj2, height){
		if(options.isPaused)
			return;
		
		var obj = obj2.children('ul');
		
    	first = obj.children('li:first').clone(true);
		
    	obj.animate({top: '-=' + height + 'px'}, options.speed, function() {
        	$(this).children('li:first').remove();
        	$(this).css('top', '0px');
        });
		
		if(options.animation == 'fade')
		{
			obj.children('li:first').fadeOut(options.speed);
			obj.children('li:last').hide().fadeIn(options.speed);
		}

    	first.appendTo(obj);
	};
	
	return this.each(function() {
		var obj = $(this);
		var maxHeight = 0;

		obj.css({overflow: 'hidden', position: 'relative'})
			.children('ul').css({position: 'absolute', margin: 0, padding: 0})
			.children('li').css({margin: 0, padding: 0});

		obj.children('ul').children('li').each(function(){
			if($(this).height() > maxHeight)
			{
				maxHeight = $(this).height();
			}
		});

		obj.children('ul').children('li').each(function(){
			$(this).height(maxHeight);
		});

		obj.height(maxHeight * options.showItems);
		
    	var interval = setInterval(function(){ moveUp(obj, maxHeight); }, options.pause);
		
		if(options.mousePause)
		{
			obj.bind("mouseenter",function(){
				options.isPaused = true;
			}).bind("mouseleave",function(){
				options.isPaused = false;
			});
		}
	});
};
})(jQuery);
