/*
 * jQuery hashchange event - v1.3 - 7/21/2010
 * http://benalman.com/projects/jquery-hashchange-plugin/
 *
 * Copyright (c) 2010 "Cowboy" Ben Alman
 * Dual licensed under the MIT and GPL licenses.
 * http://benalman.com/about/license/
 */
(function($,e,b){var c="hashchange",h=document,f,g=$.event.special,i=h.documentMode,d="on"+c in e&&(i===b||i>7);function a(j){j=j||location.href;return"#"+j.replace(/^[^#]*#?(.*)$/,"$1")}$.fn[c]=function(j){return j?this.bind(c,j):this.trigger(c)};$.fn[c].delay=50;g[c]=$.extend(g[c],{setup:function(){if(d){return false}$(f.start)},teardown:function(){if(d){return false}$(f.stop)}});f=(function(){var j={},p,m=a(),k=function(q){return q},l=k,o=k;j.start=function(){p||n()};j.stop=function(){p&&clearTimeout(p);p=b};function n(){var r=a(),q=o(m);if(r!==m){l(m=r,q);$(e).trigger(c)}else{if(q!==m){location.href=location.href.replace(/#.*/,"")+q}}p=setTimeout(n,$.fn[c].delay)}$.browser.msie&&!d&&(function(){var q,r;j.start=function(){if(!q){r=$.fn[c].src;r=r&&r+a();q=$('<iframe tabindex="-1" title="empty"/>').hide().one("load",function(){r||l(a());n()}).attr("src",r||"javascript:0").insertAfter("body")[0].contentWindow;h.onpropertychange=function(){try{if(event.propertyName==="title"){q.document.title=h.title}}catch(s){}}}};j.stop=k;o=function(){return a(q.location.href)};l=function(v,s){var u=q.document,t=$.fn[c].domain;if(v!==s){u.title=h.title;u.open();t&&u.write('<script>document.domain="'+t+'"<\/script>');u.close();q.location.hash=v}}})();return j})()})(jQuery,this);

/*
 * jQuery outside events - v1.1 - 3/16/2010
 * http://benalman.com/projects/jquery-outside-events-plugin/
 *
 * Copyright (c) 2010 "Cowboy" Ben Alman
 * Dual licensed under the MIT and GPL licenses.
 * http://benalman.com/about/license/
 */
(function($,c,b){$.map("click dblclick mousemove mousedown mouseup mouseover mouseout change select submit keydown keypress keyup".split(" "),function(d){a(d)});a("focusin","focus"+b);a("focusout","blur"+b);$.addOutsideEvent=a;function a(g,e){e=e||g+b;var d=$(),h=g+"."+e+"-special-event";$.event.special[e]={setup:function(){d=d.add(this);if(d.length===1){$(c).bind(h,f)}},teardown:function(){d=d.not(this);if(d.length===0){$(c).unbind(h)}},add:function(i){var j=i.handler;i.handler=function(l,k){l.target=k;j.apply(this,arguments)}}};function f(i){$(d).each(function(){var j=$(this);if(this!==i.target&&!j.has(i.target).length){j.triggerHandler(e,[i.target])}})}}})(jQuery,document,"outside");

/*
 * jQuery viewportOffset - v0.3 - 2/3/2010
 * http://benalman.com/projects/jquery-misc-plugins/
 *
 * Copyright (c) 2010 "Cowboy" Ben Alman
 * Dual licensed under the MIT and GPL licenses.
 * http://benalman.com/about/license/
 */
(function($){var a=$(window);$.fn.viewportOffset=function(){var b=$(this).offset();return{left:b.left-a.scrollLeft(),top:b.top-a.scrollTop()}}}(jQuery));

// https://raw.github.com/douglascrockford/JSON-js/master/json2.js
var JSON;if(!JSON){JSON={};}(function(){"use strict";function f(n){return n<10?'0'+n:n;}if(typeof Date.prototype.toJSON!=='function'){Date.prototype.toJSON=function(key){return isFinite(this.valueOf())?this.getUTCFullYear()+'-'+f(this.getUTCMonth()+1)+'-'+f(this.getUTCDate())+'T'+f(this.getUTCHours())+':'+f(this.getUTCMinutes())+':'+f(this.getUTCSeconds())+'Z':null;};String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(key){return this.valueOf();};}var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,gap,indent,meta={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'},rep;function quote(string){escapable.lastIndex=0;return escapable.test(string)?'"'+string.replace(escapable,function(a){var c=meta[a];return typeof c==='string'?c:'\\u'+('0000'+a.charCodeAt(0).toString(16)).slice(-4);})+'"':'"'+string+'"';}function str(key,holder){var i,k,v,length,mind=gap,partial,value=holder[key];if(value&&typeof value==='object'&&typeof value.toJSON==='function'){value=value.toJSON(key);}if(typeof rep==='function'){value=rep.call(holder,key,value);}switch(typeof value){case'string':return quote(value);case'number':return isFinite(value)?String(value):'null';case'boolean':case'null':return String(value);case'object':if(!value){return'null';}gap+=indent;partial=[];if(Object.prototype.toString.apply(value)==='[object Array]'){length=value.length;for(i=0;i<length;i+=1){partial[i]=str(i,value)||'null';}v=partial.length===0?'[]':gap?'[\n'+gap+partial.join(',\n'+gap)+'\n'+mind+']':'['+partial.join(',')+']';gap=mind;return v;}if(rep&&typeof rep==='object'){length=rep.length;for(i=0;i<length;i+=1){if(typeof rep[i]==='string'){k=rep[i];v=str(k,value);if(v){partial.push(quote(k)+(gap?': ':':')+v);}}}}else{for(k in value){if(Object.prototype.hasOwnProperty.call(value,k)){v=str(k,value);if(v){partial.push(quote(k)+(gap?': ':':')+v);}}}}v=partial.length===0?'{}':gap?'{\n'+gap+partial.join(',\n'+gap)+'\n'+mind+'}':'{'+partial.join(',')+'}';gap=mind;return v;}}if(typeof JSON.stringify!=='function'){JSON.stringify=function(value,replacer,space){var i;gap='';indent='';if(typeof space==='number'){for(i=0;i<space;i+=1){indent+=' ';}}else if(typeof space==='string'){indent=space;}rep=replacer;if(replacer&&typeof replacer!=='function'&&(typeof replacer!=='object'||typeof replacer.length!=='number')){throw new Error('JSON.stringify');}return str('',{'':value});};}if(typeof JSON.parse!=='function'){JSON.parse=function(text,reviver){var j;function walk(holder,key){var k,v,value=holder[key];if(value&&typeof value==='object'){for(k in value){if(Object.prototype.hasOwnProperty.call(value,k)){v=walk(value,k);if(v!==undefined){value[k]=v;}else{delete value[k];}}}}return reviver.call(holder,key,value);}text=String(text);cx.lastIndex=0;if(cx.test(text)){text=text.replace(cx,function(a){return'\\u'+('0000'+a.charCodeAt(0).toString(16)).slice(-4);});}if(/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,'@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']').replace(/(?:^|:|,)(?:\s*\[)+/g,''))){j=eval('('+text+')');return typeof reviver==='function'?walk({'':j},''):j;}throw new SyntaxError('JSON.parse');};}}());

/*!
 * jQuery Tools v1.2.5 - The missing UI library for the Web
 *
 * toolbox/toolbox.expose.js
 *
 * NO COPYRIGHTS OR LICENSES. DO WHAT YOU LIKE.
 *
 * http://flowplayer.org/tools/
 *
 */
(function(a){a.tools=a.tools||{version:"v1.2.5"};var b;b=a.tools.expose={conf:{maskId:"exposeMask",loadSpeed:"slow",closeSpeed:"fast",closeOnClick:!0,closeOnEsc:!0,zIndex:9998,opacity:.8,startOpacity:0,color:"#fff",onLoad:null,onClose:null}};function c(){if(a.browser.msie){var b=a(document).height(),c=a(window).height();return[window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,b-c<20?c:b]}return[a(document).width(),a(document).height()]}function d(b){if(b)return b.call(a.mask)}var e,f,g,h,i;a.mask={load:function(j,k){if(g)return this;typeof j=="string"&&(j={color:j}),j=j||h,h=j=a.extend(a.extend({},b.conf),j),e=a("#"+j.maskId),e.length||(e=a("<div/>").attr("id",j.maskId),a("body").append(e));var l=c();e.css({position:"absolute",top:0,left:0,width:l[0],height:l[1],display:"none",opacity:j.startOpacity,zIndex:j.zIndex}),j.color&&e.css("backgroundColor",j.color);if(d(j.onBeforeLoad)===!1)return this;j.closeOnEsc&&a(document).bind("keydown.mask",function(b){b.keyCode==27&&a.mask.close(b)}),j.closeOnClick&&e.bind("click.mask",function(b){a.mask.close(b)}),a(window).bind("resize.mask",function(){a.mask.fit()}),k&&k.length&&(i=k.eq(0).css("zIndex"),a.each(k,function(){var b=a(this);/relative|absolute|fixed/i.test(b.css("position"))||b.css("position","relative")}),f=k.css({zIndex:Math.max(j.zIndex+1,i=="auto"?0:i)})),e.css({display:"block"}).fadeTo(j.loadSpeed,j.opacity,function(){a.mask.fit(),d(j.onLoad),g="full"}),g=!0;return this},close:function(){if(g){if(d(h.onBeforeClose)===!1)return this;e.fadeOut(h.closeSpeed,function(){d(h.onClose),f&&f.css({zIndex:i}),g=!1}),a(document).unbind("keydown.mask"),e.unbind("click.mask"),a(window).unbind("resize.mask")}return this},fit:function(){if(g){var a=c();e.css({width:a[0],height:a[1]})}},getMask:function(){return e},isLoaded:function(a){return a?g=="full":g},getConf:function(){return h},getExposed:function(){return f}},a.fn.mask=function(b){a.mask.load(b);return this},a.fn.expose=function(b){a.mask.load(b,this);return this}})(jQuery);

/*
 * ----------------------------- JSTORAGE -------------------------------------
 * Copyright (c) 2010 Andris Reinman, andris.reinman@gmail.com
 * Project homepage: www.jstorage.info
 *
 * $.jStorage.set(key, value) -> saves a value
 * $.jStorage.get(key [, default]) -> retrieves value if key exists, or default if it doesn't
 * $.jStorage.deleteKey(key) -> removes a key from the storage
 * $.jStorage.flush() -> clears the cache
 * $.jStorage.storageObj() -> returns a read-ony copy of the actual storage
 * $.jStorage.storageSize() -> returns the size of the storage in bytes
 * $.jStorage.index() -> returns the used keys as an array
 * $.jStorage.storageAvailable() -> returns true if storage is available
 * $.jStorage.reInit() -> reloads the data from browser storage
 *
 **/
(function(f){if(!f||!(f.toJSON||Object.toJSON||window.JSON)){throw new Error("jQuery, MooTools or Prototype needs to be loaded before jStorage!")}var g={},d={jStorage:"{}"},h=null,j=0,l=f.toJSON||Object.toJSON||(window.JSON&&(JSON.encode||JSON.stringify)),e=f.evalJSON||(window.JSON&&(JSON.decode||JSON.parse))||function(m){return String(m).evalJSON()},i=false;_XMLService={isXML:function(n){var m=(n?n.ownerDocument||n:0).documentElement;return m?m.nodeName!=="HTML":false},encode:function(n){if(!this.isXML(n)){return false}try{return new XMLSerializer().serializeToString(n)}catch(m){try{return n.xml}catch(o){}}return false},decode:function(n){var m=("DOMParser" in window&&(new DOMParser()).parseFromString)||(window.ActiveXObject&&function(p){var q=new ActiveXObject("Microsoft.XMLDOM");q.async="false";q.loadXML(p);return q}),o;if(!m){return false}o=m.call("DOMParser" in window&&(new DOMParser())||window,n,"text/xml");return this.isXML(o)?o:false}};function k(){if("localStorage" in window){try{if(window.localStorage){d=window.localStorage;i="localStorage"}}catch(p){}}else{if("globalStorage" in window){try{if(window.globalStorage){d=window.globalStorage[window.location.hostname];i="globalStorage"}}catch(o){}}else{h=document.createElement("link");if(h.addBehavior){h.style.behavior="url(#default#userData)";document.getElementsByTagName("head")[0].appendChild(h);h.load("jStorage");var n="{}";try{n=h.getAttribute("jStorage")}catch(m){}d.jStorage=n;i="userDataBehavior"}else{h=null;return}}}b()}function b(){if(d.jStorage){try{g=e(String(d.jStorage))}catch(m){d.jStorage="{}"}}else{d.jStorage="{}"}j=d.jStorage?String(d.jStorage).length:0}function c(){try{d.jStorage=l(g);if(h){h.setAttribute("jStorage",d.jStorage);h.save("jStorage")}j=d.jStorage?String(d.jStorage).length:0}catch(m){}}function a(m){if(!m||(typeof m!="string"&&typeof m!="number")){throw new TypeError("Key name must be string or numeric")}return true}f.jStorage={version:"0.1.5.0",set:function(m,n){a(m);if(_XMLService.isXML(n)){n={_is_xml:true,xml:_XMLService.encode(n)}}g[m]=n;c();return n},get:function(m,n){a(m);if(m in g){if(typeof g[m]=="object"&&g[m]._is_xml&&g[m]._is_xml){return _XMLService.decode(g[m].xml)}else{return g[m]}}return typeof(n)=="undefined"?null:n},deleteKey:function(m){a(m);if(m in g){delete g[m];c();return true}return false},flush:function(){g={};c();try{window.localStorage.clear()}catch(m){}return true},storageObj:function(){function m(){}m.prototype=g;return new m()},index:function(){var m=[],n;for(n in g){if(g.hasOwnProperty(n)){m.push(n)}}return m},storageSize:function(){return j},currentBackend:function(){return i},storageAvailable:function(){return !!i},reInit:function(){var m,o;if(h&&h.addBehavior){m=document.createElement("link");h.parentNode.replaceChild(m,h);h=m;h.style.behavior="url(#default#userData)";document.getElementsByTagName("head")[0].appendChild(h);h.load("jStorage");o="{}";try{o=h.getAttribute("jStorage")}catch(n){}d.jStorage=o;i="userDataBehavior"}b()}};k()})(window.jQuery||window.$);

//+ Jonas Raoni Soares Silva
//@ http://jsfromhell.com/number/fmt-money [rev. #2]
Number.prototype.formatMoney = function(c, d, t){
    var n = this, c = isNaN(c = Math.abs(c)) ? 2 : c, d = d == undefined ? "," : d, t = t == undefined ? "." : t, s = n < 0 ? "-" : "",
    i = parseInt(n = Math.abs(+n || 0).toFixed(c)) + "", j = (j = i.length) > 3 ? j % 3 : 0;
    return s + (j ? i.substr(0, j) + t : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + t)
    + (c ? d + Math.abs(n - i).toFixed(c).slice(2) : "");
};


(function ($) {
	'use strict';
	/*jslint devel: true, browser: true, confusion: true, white: true, plusplus: true, maxerr: 50, indent: 4 */
	/*global window, console, $, jQuery, Cufon, alert, iw */
    $.fn.flickr_gallery = function(config) {

		var $canvas = $('<div id="set_canvas"></div>'),
			$preload_wrapper = $('<div style="display: none;"></div>'),
			flickr_sets = config.sets,
			flickr_photos = config.photos,
			flickr_size = 's',
			flickr_set_id = '',
			flickr_photo_id = '',
			flickr_photo_idx = 0,
			preloaded = [],
			thumbnails = [],
			set_offsets = [],
			download_original = config.download_original,
			image_url = config.image_url,
			mark_as_favorite = (config.mark_as_favorite && $.jStorage.storageAvailable()) ? 1 : 0,
			is_init = 1,
			favorites = $.jStorage.get('favorites', '[]'),
			order = $.jStorage.get('order', '{}');

		favorites = JSON.parse(favorites);
		order = JSON.parse(order);


		function load_thumbnails () {
			$(thumbnails).each(function () {
				if (this.viewportOffset().top > $(window).height()) {
					return;
				}
				this.find('img').attr('src', this.find('img').data('src'));
				thumbnails.splice($.inArray(this,thumbnails), 1);
			});
		}

		function save_favorite () {
			favorites.push(flickr_photo_id);
			$.jStorage.set('favorites', JSON.stringify(favorites));
		}

		function delete_favorite () {
			favorites.splice($.inArray(flickr_photo_id, favorites),1);
			$.jStorage.set('favorites', JSON.stringify(favorites));
		}

		function is_favorite () {
			if ($.inArray(flickr_photo_id, favorites) !== -1) {
				return true;
			}
			return false;
		}

		function mark_favorite () {
			if (is_favorite()) {
				$('#mark_as_favorite').addClass('active');
			} else {
				$('#mark_as_favorite').removeClass('active');
			}
			//Cufon.refresh();
		}

		function update_total () {
			var total = 6;
			$('#favorites').find('th').each(function (idx) {
				if (idx) {
					total = total + ($(this).data('cost') * parseInt($(this).find('span').text(), 10));
				}
				$('#total').text(total.formatMoney());
			});
		}

		function start_keyboard_navigation () {
			$(document).unbind('keydown.iw'); // unbind event-handler so it doesnt get bound & executed multiple times
			$(document).bind('keydown.iw', function(e) {
				if (e.keyCode === 37) {
					e.preventDefault();
					show_previous();
				}
				if (e.keyCode === 39) {
					e.preventDefault();
					show_next();
				}
			});
		}

		function build_original_image_src () {
			var uri,
				photo_meta;
			if (!download_original) {
				return '';
			}
			photo_meta = flickr_photos[flickr_photo_id];
			uri = 'http://farm' + photo_meta[2] + '.static.flickr.com/' + photo_meta[1] + '/' + flickr_photo_id + '_' + photo_meta[4] + '_o.' + photo_meta[5];
			return uri;
		}

		function build_image_src (p_id, p_size) {
			var photo_id = p_id || flickr_photo_id,
				photo_size = p_size || flickr_size,
				photo_meta = flickr_photos[photo_id] || 0,
				uri;

			if (photo_meta) {
				uri = 'http://farm' + photo_meta[2] + '.static.flickr.com/' + photo_meta[1] + '/' + photo_id + '_' + photo_meta[0] + '_' + photo_size + '.jpg';
				return uri;
			}
			return false;
		}

		function preload_next () {
			var set = flickr_sets[flickr_set_id];
			if ((flickr_photo_idx + 1) < set.photos.length && ($.inArray(build_image_src(set.photos[flickr_photo_idx + 1]), preloaded) === -1)) {
				$preload_wrapper.append('<img src="' + build_image_src(set.photos[flickr_photo_idx + 1]) + '" alt="" />');
				preloaded.push(build_image_src(set.photos[flickr_photo_idx + 1]));
			}
		}

		function preload_previous () {
			var set = flickr_sets[flickr_set_id];
			if ((flickr_photo_idx - 1) >= 0 && ($.inArray(build_image_src(set.photos[flickr_photo_idx - 1]), preloaded) === -1)) {
				$preload_wrapper.append('<img src="' + build_image_src(set.photos[flickr_photo_idx - 1]) + '" alt="" />');
				preloaded.push(build_image_src(set.photos[flickr_photo_idx - 1]));
			}
		}

		function show_next () {
			var set = flickr_sets[flickr_set_id],
				$image_wrapper = $('#image_wrapper');
			$image_wrapper.empty();
			flickr_photo_idx++;
			if (flickr_photo_idx === set.photos.length) {
				flickr_photo_idx = 0;
			}
			flickr_photo_id = set.photos[flickr_photo_idx];
			$image_wrapper.append('<img src="' + build_image_src(set.photos[flickr_photo_idx]) + '" alt="" />');
			mark_favorite();
			preload_next();
			location.hash = flickr_set_id + '-' + flickr_photo_id + '-' + flickr_size;
		}

		function show_previous () {
			var set = flickr_sets[flickr_set_id],
				$image_wrapper = $('#image_wrapper');
			$image_wrapper.empty();
			flickr_photo_idx--;
			if (flickr_photo_idx < 0) {
				flickr_photo_idx = set.photos.length - 1;
			}
			flickr_photo_id = set.photos[flickr_photo_idx];
			$image_wrapper.append('<img src="' + build_image_src(set.photos[flickr_photo_idx]) + '" alt="" />');
			mark_favorite();
			preload_previous();
			location.hash = flickr_set_id + '-' + flickr_photo_id + '-' + flickr_size;
		}

		function show_image () {
			var wrappersize,
				$imagewrapper,
				first_click_into_image_url = 1,
				$backlink = $('<div id="backlink"></div>'),
				$setnavigation = $('<ul id="navigation"><li class="next"></li><li class="toggle_size"></li><li class="previous"></li></ul>'),
				$photoactions = $('<div id="photoactions"></div>'),
				$image_description = $('<div id="photodescription"><strong>' + flickr_photos[flickr_photo_id][3] + '</strong><br />' + flickr_photos[flickr_photo_id][4] + '</div>'),
				$image_url = $('<div id="image_url"><a>image url</a><input style="display: none" type="text" value="" /></div>'),
				$download_original = $('<div id="download_original"><a href="' + build_original_image_src() + '">Original</a></div>'),
				$mark_as_favorite = $('<div id="mark_as_favorite"><a>Favorit</a></div>');


			$(window).scrollTop(0);
			flickr_size = (flickr_size === 'z' || flickr_size === 'b') ? flickr_size : 'z';
			wrappersize = flickr_size === 'b' ? '1024' : '640';
			$imagewrapper = $('<div id="image_wrapper" style="width:' + wrappersize + 'px; height:' + wrappersize + 'px;"><img src="' + build_image_src() + '" alt="" /></div>');
			$setnavigation.delegate('li', 'click', function () {
				var task = $(this).attr('class');
				if (task === 'previous') {
					show_previous();
				} else if (task === 'next') {
					show_next();
				} else {
					if (flickr_size === 'b') {
						flickr_size = 'z';
						show_image();
					} else {
						flickr_size = 'b';
						show_image();
					}
				}
			});
			$backlink.bind('click', function () {
				show_set();
			});
			$canvas.empty();
			$canvas.append($imagewrapper);
			$canvas.append($backlink);
			$canvas.append($setnavigation);
			$photoactions.append($image_description);
			if (image_url) {
				$image_url.find('input').bind('clickoutside', function () {
					if ($(this).data('just_shown')) {
						$(this).data('just_shown', 0);
						return;
					}
					$(this).hide();
				});
				$image_url.find('input').bind('click', function () {
					if (first_click_into_image_url) {
						$(this).select();
						first_click_into_image_url = 0;
					}
				});
				$image_url.find('a').bind('click', function (e){
					var $input = $image_url.find('input');
					e.preventDefault();
					if (!$input.is(':visible')) {
						$input
							.data('just_shown', 1)
							.val(build_image_src(0, 'b'))
							.show()
							.focus();
					}
				});
				$photoactions.append($image_url);
			}
			if (download_original) {
				$photoactions.append($download_original);
			}
			if (mark_as_favorite) {
				$mark_as_favorite.bind('click', function () {
					$(this).toggleClass('active');
					if ($(this).hasClass('active')) {
						save_favorite();
					} else {
						delete_favorite();
					}
					mark_favorite();
				});
				$photoactions.append($mark_as_favorite);
			}
			$canvas.append($photoactions);
			//Cufon.refresh();
			mark_favorite();
			start_keyboard_navigation();
			preload_next();
			preload_previous();
			location.hash = flickr_set_id + '-' + flickr_photo_id + '-' + flickr_size;
		}

		function show_favorites_set () {

			var $backlink = $('<div id="backlink"></div>'),
				$str = '<h1>Ihre Favoriten / Abzüge bestellen</h1>',
				existing_orders = [0,0,0,0];

			$(window).scrollTop(0);
			flickr_size = 's';
			$backlink.bind('click', function () {
				show_set_overview();
			});
			if (favorites.length) {

				$str += '<p>Stellen Sie sich über die <b>+ / -</b> Schaltflächen neben den Formaten Ihre Bestellung zusammen. Wenn Sie fertig sind, klicken Sie auf <b>Abzugliste verschicken</b>. Daraufhin taucht ein Formular auf, über das Sie die Bestellung per E-Mail verschicken können.</p>';
				if (favorites.length) {
					$str += '<p style="margin: 30px 0;">';
					$str += '<a id="reset_favorites" class="button">Favoriten leeren</a>&nbsp;';
					$str += '<a id="reset_order_list" class="button">Abzugliste leeren</a>&nbsp;';
					$str += '<a id="toggle_mail_order_form" class="button">Abzüge bestellen</a>&nbsp;';
					$str += '<a id="toggle_prices" class="button">Preisliste</a>';
					$str += '</p>';
				} else {
					$str += '<p style="margin: 30px 0;"><a id="show_prices">Preisliste</a></p>';
				}
				$str += '<div id="prices" style="display: none;">';
				$str += '<a id="hide_prices" class="close_button">x</a>';
				$str += '<table cellpadding="0" cellspacing="0" class="pricing">';
				$str += '<tr>';
				$str += '<td>Format</td>';
				$str += '<td>10 x 15</td>';
				$str += '<td>13 x 19</td>';
				$str += '<td>20 x 30</td>';
				$str += '<td>30 x 45</td>';
				$str += '</tr>';
				$str += '<tr>';
				$str += '<td>Exakte Größe</td>';
				$str += '<td>102 x 152 mm</td>';
				$str += '<td>127 x 190 mm</td>';
				$str += '<td>203 x 305 mm</td>';
				$str += '<td>305 x 452 mm</td>';
				$str += '</tr>';
				$str += '<tr>';
				$str += '<td>Preis je Abzug</td>';
				$str += '<td>0,30 €</td>';
				$str += '<td>0,40 €</td>';
				$str += '<td>1,00 €</td>';
				$str += '<td>4,00 €</td>';
				$str += '</tr>';
				$str += '</table>';
				$str += '<p style="margin-bottom: 0;">Alle Abzüge glänzend. Versandpauschale: 6 €</p>';
				$str += '</div>';
				$str += '<form id="mail_order_form" style="display: none">';
				$str += '<a id="hide_mail_order_form" class="close_button">x</a>';
				$str += '<p>Bitte geben Sie in das Textfeld mindestens Ihren <b>Namen</b>, ihre <b>E-Mail</b> Adresse und die <b>Lieferadresse</b> für die Fotos ein. Die Liste mit den Fotos wird automatisch mitversendet.</p>';
				$str += '<input id="order_list" type="hidden" name="order" value=\'' + JSON.stringify(order) + '\' />';
				$str += '<textarea name="message"></textarea>';
				$str += '<div style="text-align: right; padding-top: 5px;"><a class="button" id="submit_order">Bestellung abschicken</a></div>';
				$str += '</form>';
				$str += '<p id="order_success" style="display: none; margin: 30px 0;">Ihre Bestellung ist auf dem Weg zu uns. Sie erhalten in Kürze ein Bestätigung per E-Mail.</p>';
				$str += '<table cellpadding="0" cellspacing="0" id="favorites">';
				$str += '<tr>';
				$str += '<th><span id="total">6,00</span> <span>€</span><br/>Bestellwert</th>';
				$str += '<th id="overall_count_size_0" data-idx="0" data-cost=".3"><span>0</span><br/><b class="add">+</b>&nbsp;10 x 15&nbsp;<b class="substract">-</b></th>';
				$str += '<th id="overall_count_size_1" data-idx="1" data-cost=".4"><span>0</span><br/><b class="add">+</b>&nbsp;13 x 19&nbsp;<b class="substract">-</b></th>';
				$str += '<th id="overall_count_size_2" data-idx="2" data-cost="1"><span>0</span><br/><b class="add">+</b>&nbsp;20 x 30&nbsp;<b class="substract">-</b></th>';
				$str += '<th id="overall_count_size_3" data-idx="3" data-cost="4"><span>0</span><br/><b class="add">+</b>&nbsp;30 x 45&nbsp;<b class="substract">-</b></th>';
				$str += '</tr>';
				$.each(favorites, function (idx) {
					var counts = order[this] || ["0","0","0","0"];
					existing_orders[0] = existing_orders[0] + parseInt(counts[0], 10);
					existing_orders[1] = existing_orders[1] + parseInt(counts[1], 10);
					existing_orders[2] = existing_orders[2] + parseInt(counts[2], 10);
					existing_orders[3] = existing_orders[3] + parseInt(counts[3], 10);
					flickr_photo_id = this;
					$str += '<tr data-id="' + this + '">';
					$str += '<td><img width="75" height="75" src="' + build_image_src() + '" alt="" /></td>';
					$str += '<td data-idx="0" class="type_0"><span>' + counts[0] + '</span><br/><b class="add">+</b>&nbsp;10 x 15&nbsp;<b class="substract">-</b></td>';
					$str += '<td data-idx="1" class="type_1"><span>' + counts[1] + '</span><br/><b class="add">+</b>&nbsp;13 x 19&nbsp;<b class="substract">-</b></td>';
					$str += '<td data-idx="2" class="type_2"><span>' + counts[2] + '</span><br/><b class="add">+</b>&nbsp;20 x 30&nbsp;<b class="substract">-</b></td>';
					$str += '<td data-idx="3" class="type_3"><span>' + counts[3] + '</span><br/><b class="add">+</b>&nbsp;30 x 45&nbsp;<b class="substract">-</b></td>';
					$str += '</tr>';
				});
				$str += '</table>';
				$str += '<div id="please_wait" style="display: none;">Ihre Bestellung wird versendet.</div>';

				$str = $($str);

				$str.find('#overall_count_size_0 span').text(existing_orders[0]);
				$str.find('#overall_count_size_1 span').text(existing_orders[1]);
				$str.find('#overall_count_size_2 span').text(existing_orders[2]);
				$str.find('#overall_count_size_3 span').text(existing_orders[3]);
				$str.find('span').each(function () {
					if(parseInt($(this).text(), 10) === 0) {
						return 1;
					}
					$(this).addClass('ordered');
				});
			} else {
				$str += '<p>Fotos, die Sie als Favorit markiert haben, können Sie hier als Abzüge bestellen. Momentan haben Sie noch keine Favoriten markiert.</p>';
				$str += '<p>Wenn Sie sich ein Foto einzeln ansehen, finden Sie links neben dem Foto die Schaltfläche "Favorit". Klicken Sie einmal auf die Schaltfläche, um das Foto als Favorit zu markieren. Ein erneuter Klick entfernt die Markierung.</p>';
				$str = $($str);
			}
			$canvas.empty();
			$(document).unbind('keydown.iw');
			$canvas.append($str);
			$canvas.append($backlink);
			update_total();
			//Cufon.refresh();
			location.hash = 'favoriten';
		}

		function show_set () {

			var set = flickr_sets[flickr_set_id],
				$setwrapper = $('<ul id="setwrapper"></ul>'),
				$backlink = $('<div id="backlink"></div>');

			set_offsets[flickr_set_id] = set_offsets[flickr_set_id] || 0;
			thumbnails = [];
			flickr_size = 's';
			$setwrapper.delegate('img', 'click', function () {
				flickr_photo_idx = $(this).data('idx');
				flickr_photo_id = $(this).data('id');
				flickr_size = 'z';
				show_image();
			});
			$backlink.bind('click', function () {
				show_set_overview();
			});
			$.each(set.photos, function (idx) {
				var $thumb;
				flickr_photo_id = this;
				$thumb = $('<li><img data-idx="' + idx + '" data-id="' + this + '" data-src="' + build_image_src() + '" alt="" /></li>');
				thumbnails.push($thumb);
				$setwrapper.append($thumb);
			});
			$canvas.empty();
			$(document).unbind('keydown.iw');
			//$canvas.append('<h1>' + set.title + '</h1>');
			//Cufon.refresh();
			$canvas.append($setwrapper);
			//$canvas.append($backlink);
			//$(window).scrollTop(set_offsets[flickr_set_id]);
			load_thumbnails($setwrapper.find('li'));
			location.hash = flickr_set_id;
		}

		function show_set_overview () {

			var $setpreview = $('<div id="setpreview"></div>'),
				$setoverview = $('<div id="setoverview"></div>');

			$(window).scrollTop(0);
			flickr_size = 's';
			$canvas.empty();
			$(document).unbind('keydown.iw');
			$.each(flickr_sets, function () {
				var set = this,
					$setlink = $('<a>' + this.title + '</a><br />'),
					$setprimary = new Image(75, 75);
				flickr_photo_id = set.primary;
				$setprimary.src = build_image_src();
				$setprimary = $($setprimary);
				$setpreview.append($setprimary);
				$setlink.bind('click', function () {
					flickr_set_id = set.id;
					show_set();
				});
				$setlink.hover(
					function () {$setprimary.css('top', $setlink.position().top).show();},
					function () {$setprimary.hide();}
				);
				$setoverview.append($setlink);
			});
			if (mark_as_favorite) {
				$setoverview.append('<a id="show_favorites">Ihre Favoriten</a>');
			}
			$canvas.append($setoverview);
			//Cufon.refresh();
			$canvas.append($setpreview);
			location.hash = 'galerien';
		}

		$canvas.delegate('#show_favorites', 'click', function () {
			show_favorites_set();
		});

		$canvas.delegate('#favorites td b', 'click', function () {

			var $tr = $(this).closest('tr'),
				$td = $(this).closest('td'),
				$current_size_overall_count = $('#overall_count_size_' + $td.data('idx') + ' span'),
				$current_size_count = $(this).closest('td').find('span'),
				values_2_save = [],
				val;

			if ($(this).hasClass('add')) {
				val = parseInt($current_size_count.text(), 10) + 1;
				$current_size_count.text(val).addClass('ordered');
				$current_size_overall_count.text(parseInt($current_size_overall_count.text(), 10) + 1);
			} else {
				val = parseInt($current_size_count.text(), 10) - 1;
				if (val >= 0) {
					$current_size_count.text(val);
					$current_size_overall_count.text(parseInt($current_size_overall_count.text(), 10) - 1);
				}
				if (val === 0) {
					$current_size_count.removeClass('ordered');
				}
			}
			if (parseInt($current_size_overall_count.text(), 10)) {
				$current_size_overall_count.addClass('ordered');
			} else {
				$current_size_overall_count.removeClass('ordered');
			}
			val = 0;
			$tr.find('span').each(function () {
				var current_count = parseInt($(this).text(), 10);
				val = val + current_count;
				values_2_save.push($(this).text());
			});
			if (val) {
				order[$tr.data('id')] = values_2_save;
			} else {
				delete order[$tr.data('id')];
			}
			$('#order_list').val(JSON.stringify(order));
			$.jStorage.set('order', JSON.stringify(order));
			update_total();
		});

		$canvas.delegate('#favorites th b', 'click', function () {
			$(this).closest('table').find('td.type_' + $(this).closest('th').data('idx') + ' .' + $(this).attr('class')).click();
		});

		$canvas.delegate('#reset_favorites', 'click', function () {
			var check = confirm('Ihre Favoritenauswahl wird gelöscht, ebenso die Liste.');
			if (check) {
				$.jStorage.set('favorites', '[]');
				$.jStorage.set('order', '{}');
				window.location.reload();
			}
		});

		$canvas.delegate('#reset_order_list', 'click', function () {
			var check = confirm('Die Liste wird geleert, die Favoriten selbst bleiben davon unberührt.');
			if (check) {
				$.jStorage.set('order', '{}');
				window.location.reload();
			}
		});

		$canvas.delegate('#toggle_mail_order_form, #hide_mail_order_form', 'click', function () {
			$('#mail_order_form').toggle().find('textarea').focus();
		});

		$canvas.delegate('#submit_order', 'click', function (e) {
			e.preventDefault();
			$('#please_wait').show().expose({
				closeOnEsc: 0,
				closeOnClick: 0
			});
			$.ajax({
				type: 'post',
				url: '/include/phpMailer/ordermail.php',
				data: {
					order: JSON.stringify(order),
					message: $('#mail_order_form textarea').val()
				},
				success: function (response) {
					if (response === '1') {
						$('#please_wait').hide();
						$.mask.close();
						$('#mail_order_form textarea').val('');
						$('#mail_order_form').hide();
						$('#order_success').show();
						setTimeout(function () {
							$('#order_success').fadeOut('slow');
						}, 10000);
					} else {
						$('#please_wait').hide();
						$.mask.close();
						alert('Die E-Mail konnte nicht versendet werden.\n\n' + response + '\n\nBitte versuchen Sie es in ein paar Minuten erneut. Sollte es dann immer noch nicht klappen,\nbeschweren Sie sich bitte unter post@ingo-winter.de.');
					}
				},
				error: function () {
					$('#please_wait').hide();
					$.mask.close();
					alert('Die E-Mail konnte nicht versendet werden.\n\n->$.ajax error\n\nBitte versuchen Sie es in ein paar Minuten erneut. Sollte es dann immer noch nicht klappen,\nbeschweren Sie sich bitte unter post@ingo-winter.de.');
				}
			});
		});

		$canvas.delegate('#toggle_prices, #hide_prices', 'click', function (e) {
			e.preventDefault();
			$('#prices').toggle();
		});

		$(window).hashchange(function () {
			var hash = location.hash;
			hash = hash.replace( /^#/, '' );
			if (hash.length) {
				if (hash.split('-').length > 1) { // image
					flickr_set_id = hash.split('-')[0];
					flickr_photo_id = hash.split('-')[1];
					flickr_size = hash.split('-')[2];
					if (flickr_sets[flickr_set_id] && flickr_photos[flickr_photo_id] && $.inArray(flickr_size,['s','z','b'])) {
						show_image();
					}else {
						show_set_overview();
					}
				} else { // set or overview
					flickr_set_id = hash;
					if (flickr_sets[flickr_set_id]) {
						show_set();
					} else if (flickr_set_id === 'favoriten') {
						show_favorites_set();
					} else {
						show_set_overview();
					}
				}
			} else {
				if (is_init) {
					location.replace('#72157627727471029');
					is_init = 0;
				}
			}
		});

		$(window).resize(function () {
			$('#website').css('min-height', $(window).height() - 50 - $('#footer').outerHeight());
		});
		$('#website').css('min-height', $(window).height() - 50 - $('#footer').outerHeight());

		$(window).scroll(function () {
			if ($('#setwrapper').length) {
				load_thumbnails();
				set_offsets[flickr_set_id] = $(window).scrollTop();
			}
		});

		$('#website').append($canvas);
		//Cufon.now();
		$('body').append($preload_wrapper);
		$(window).hashchange();

	};
}(jQuery));
