﻿// -- insert substrings into a string
String.prototype.format = String.prototype.format || function(){
	var	str = this, args = arguments, i = args.length;
	while(i--) { str = str.replace(new RegExp("\\{"+i+"\\}","g"), args[i]) };
	return str.toString()
};

String.prototype.trim = String.prototype.trim || function(){
    return (this || "").replace(/^(\s|\u00A0)+|(\s|\u00A0)+$/g, "");
};

// -- consume JSON or XML from flickr
// -- Copyright Fat Media

(function(){
    var Flickr = function(options){
        var pbl = this,
        prv = {
            rest_uri: "http://api.flickr.com/services/rest/",
            api_method: options.api_method || "flickr.photos.search",
            api_key: options.api_key || "",
            request_format: options.request_format || "json",            
            user_id: options.user_id || "",
            jsonp_elem: document.createElement("script"),
            head: document.getElementsByTagName("head")[0],
            trim: function(str) {  },
            XHR: (function(){
			    var xhr = (window.XMLHttpRequest ?
				    XMLHttpRequest :
				    ActiveXObject("Msxml2.XMLHTTP"));
    				
			    return function() {
				    return new xhr;
			    };
		    })(),
		    
		    xhrSuccess: function(status){
			    try {
				    return  (!status && window.location.protocol === "file:") ||
						    (status >= 200 && status < 300) || status === 304;
			    } catch(e) {};
			    return false;
		    }
        };
        
        prv.post_data = "format=" + prv.request_format + "&api_key=" + prv.api_key + "&method=" + prv.api_method + "&user_id=" + prv.user_id;
        
        prv.makeJsonpRequest = function(){
            prv.jsonp_elem.src = prv.rest_uri + "?" + prv.post_data + "&callback=?";
            prv.head.appendChild(prv.jsonp_elem);
        };
		
		prv.makeRequest = function(callback){
		    var xhr = new prv.XHR(),
			isComplete = false,
			timer,
			requestUrl = prv.rest_uri;
			xhr.onreadystatechange = function(){
				if(xhr.readyState === 4) { // finished request
					statusCode = xhr.status || "0";
					if(!isComplete) { // check if request has previously timed out
						isComplete = true;
						clearTimeout(timer);
						if(prv.xhrSuccess(xhr.status)) {
                            prv.request_format === "json" ?
                                eval(xhr.responseText) :
							    callback(xhr.responseXML);
						};
						xhr = null;
					};
				}
			};
			xhr.open("POST",requestUrl,true);
			timer = setTimeout(function(){
				if(!isComplete) {
					isComplete = true;
					callback("Request timed out.");
				};
			},1e4);
			xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
			xhr.send(prv.post_data);
		};
		
		pbl.cleanup = function(){
            prv.jsonp_elem.src = "";
            prv.head.removeChild(prv.jsonp_elem);
        };
		
		pbl.img_src = 'http://farm8.staticflickr.com/{0}/{1}_{2}_{3}.jpg';
		
		pbl.request = function(callback){
            prv.makeRequest(callback);
		};

		pbl.jsonpRequest = function(){
		    prv.makeJsonpRequest()
		};
        
    };
    
    window.Flickr = Flickr;
})();

(function(){
// constructor for sliders
    var Photo = function(d,width){
        var inst = this;
        this.img = new Image();
        this.img.src = flickrFeed.img_src.format(d.server,d.id,d.secret,'t');
        this.img.onload = function() {
			var height1 = this.clientHeight,
			height2 = inst.link.clientHeight;
			this.style.marginTop = ((height1-height2)/2)*-1 + "px";
		};
        
        this.link = document.createElement("a");
        this.link.href = flickrFeed.img_src.format(d.server,d.id,d.secret,'b');
        this.link.rel = 'flickr_' + time_stamp;
        this.link.appendChild(this.img);
        this.link.style.width = width + "px";
        
        this.appendTo = function(elm) {
            elm.appendChild(inst.link);
        };
    },
	Scroller = function(data, parent, shown){
		
		if(!data || data.length < 1) {
			this.noData = true;
			return;
		};
		
		var inst = this;
		
		this.curSlide = 0;
		this.domNode = document.createElement("div");
		this.domNode.id = "scroller";
		this.$node = $(this.domNode);
		this.slides = [];
		this.slideCount = 0;
		this.slideWidth = Math.round(parent.scrollWidth / shown);
		this.visibleSlides = shown;
		
		this.slideTo = function(i){
		    if(i < 0 || i > this.slides.length - this.visibleSlides) return;
		    this.$node.stop().animate({
		        left: (i * inst.slideWidth) * -1
		    });
		    this.curSlide = i;
		};
		
		var widthCounter = 0,
		i = data.length,
		dateStamp = new Date().getTime(),
		htmlLinks, a, img, slide;
		
		while(i--) {
			slide = new Photo(data[i],this.slideWidth);
			slide.appendTo(this.domNode);
			this.slides.push(slide);
			this.slideCount++;

			widthCounter += (this.slideWidth);
		};
		
		this.domNode.style.width = widthCounter + "px";
		parent.appendChild(this.domNode)
	};
	
	window.ImageScroller = Scroller;
		
})();
