/*!
 * jQuery corner plugin: simple corner rounding
 * Examples and documentation at: http://jquery.malsup.com/corner/
 * version 2.11 (15-JUN-2010)
 * Requires jQuery v1.3.2 or later
 * Dual licensed under the MIT and GPL licenses:
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.gnu.org/licenses/gpl.html
 * Authors: Dave Methvin and Mike Alsup
 */

/**
 *  corner() takes a single string argument:  $('#myDiv').corner("effect corners width")
 *
 *  effect:  name of the effect to apply, such as round, bevel, notch, bite, etc (default is round).
 *  corners: one or more of: top, bottom, tr, tl, br, or bl.  (default is all corners)
 *  width:   width of the effect; in the case of rounded corners this is the radius.
 *           specify this value using the px suffix such as 10px (yes, it must be pixels).
 */
(function($) {

	var style = document.createElement('div').style,
	moz = style['MozBorderRadius'] !== undefined,
	webkit = style['WebkitBorderRadius'] !== undefined,
	radius = style['borderRadius'] !== undefined || style['BorderRadius'] !== undefined,
	mode = document.documentMode || 0,
	noBottomFold = $.browser.msie && (($.browser.version < 8 && !mode) || mode < 8),

	expr = $.browser.msie && (function() {
		var div = document.createElement('div');
		try {
			div.style.setExpression('width','0+0');
			div.style.removeExpression('width');
		}
		catch(e) {
			return false;
		}
		return true;
	})();

	$.support = $.support || {};
	$.support.borderRadius = moz || webkit || radius; // so you can do:  if (!$.support.borderRadius) $('#myDiv').corner();

	function sz(el, p) {
		return parseInt($.css(el,p))||0;
	};
	function hex2(s) {
		var s = parseInt(s).toString(16);
		return ( s.length < 2 ) ? '0'+s : s;
	};
	function gpc(node) {
		while(node) {
			var v = $.css(node,'backgroundColor'), rgb;
			if (v && v != 'transparent' && v != 'rgba(0, 0, 0, 0)') {
				if (v.indexOf('rgb') >= 0) {
					rgb = v.match(/\d+/g);
					return '#'+ hex2(rgb[0]) + hex2(rgb[1]) + hex2(rgb[2]);
				}
				return v;
			}
			if (node.nodeName.toLowerCase() == 'html')
				break;
			node = node.parentNode; // keep walking if transparent
		}
		return '#ffffff';
	};

	function getWidth(fx, i, width) {
		switch(fx) {
			case 'round':
				return Math.round(width*(1-Math.cos(Math.asin(i/width))));
			case 'cool':
				return Math.round(width*(1+Math.cos(Math.asin(i/width))));
			case 'sharp':
				return Math.round(width*(1-Math.cos(Math.acos(i/width))));
			case 'bite':
				return Math.round(width*(Math.cos(Math.asin((width-i-1)/width))));
			case 'slide':
				return Math.round(width*(Math.atan2(i,width/i)));
			case 'jut':
				return Math.round(width*(Math.atan2(width,(width-i-1))));
			case 'curl':
				return Math.round(width*(Math.atan(i)));
			case 'tear':
				return Math.round(width*(Math.cos(i)));
			case 'wicked':
				return Math.round(width*(Math.tan(i)));
			case 'long':
				return Math.round(width*(Math.sqrt(i)));
			case 'sculpt':
				return Math.round(width*(Math.log((width-i-1),width)));
			case 'dogfold':
			case 'dog':
				return (i&1) ? (i+1) : width;
			case 'dog2':
				return (i&2) ? (i+1) : width;
			case 'dog3':
				return (i&3) ? (i+1) : width;
			case 'fray':
				return (i%2)*width;
			case 'notch':
				return width;
			case 'bevelfold':
			case 'bevel':
				return i+1;
		}
	};

	$.fn.corner = function(options) {
		// in 1.3+ we can fix mistakes with the ready state
		if (this.length == 0) {
			if (!$.isReady && this.selector) {
				var s = this.selector, c = this.context;
				$(function() {
					$(s,c).corner(options);
				});
			}
			return this;
		}

		return this.each(function(index){
			var $this = $(this),
			// meta values override options
			o = [$this.attr($.fn.corner.defaults.metaAttr) || '', options || ''].join(' ').toLowerCase(),
			keep = /keep/.test(o),                       // keep borders?
			cc = ((o.match(/cc:(#[0-9a-f]+)/)||[])[1]),  // corner color
			sc = ((o.match(/sc:(#[0-9a-f]+)/)||[])[1]),  // strip color
			width = parseInt((o.match(/(\d+)px/)||[])[1]) || 10, // corner width
			re = /round|bevelfold|bevel|notch|bite|cool|sharp|slide|jut|curl|tear|fray|wicked|sculpt|long|dog3|dog2|dogfold|dog/,
			fx = ((o.match(re)||['round'])[0]),
			fold = /dogfold|bevelfold/.test(o),
			edges = {
				T:0,
				B:1
			},
			opts = {
				TL:  /top|tl|left/.test(o),
				TR:  /top|tr|right/.test(o),
				BL:  /bottom|bl|left/.test(o),
				BR:  /bottom|br|right/.test(o)
			},
			// vars used in func later
			strip, pad, cssHeight, j, bot, d, ds, bw, i, w, e, c, common, $horz;

			if ( !opts.TL && !opts.TR && !opts.BL && !opts.BR )
				opts = {
					TL:1,
					TR:1,
					BL:1,
					BR:1
				};

			// support native rounding
			if ($.fn.corner.defaults.useNative && fx == 'round' && (radius || moz || webkit) && !cc && !sc) {
				if (opts.TL)
					$this.css(radius ? 'border-top-left-radius' : moz ? '-moz-border-radius-topleft' : '-webkit-border-top-left-radius', width + 'px');
				if (opts.TR)
					$this.css(radius ? 'border-top-right-radius' : moz ? '-moz-border-radius-topright' : '-webkit-border-top-right-radius', width + 'px');
				if (opts.BL)
					$this.css(radius ? 'border-bottom-left-radius' : moz ? '-moz-border-radius-bottomleft' : '-webkit-border-bottom-left-radius', width + 'px');
				if (opts.BR)
					$this.css(radius ? 'border-bottom-right-radius' : moz ? '-moz-border-radius-bottomright' : '-webkit-border-bottom-right-radius', width + 'px');
				return;
			}

			strip = document.createElement('div');
			$(strip).css({
				overflow: 'hidden',
				height: '1px',
				minHeight: '1px',
				fontSize: '1px',
				backgroundColor: sc || 'transparent',
				borderStyle: 'solid'
			});

			pad = {
				T: parseInt($.css(this,'paddingTop'))||0,
				R: parseInt($.css(this,'paddingRight'))||0,
				B: parseInt($.css(this,'paddingBottom'))||0,
				L: parseInt($.css(this,'paddingLeft'))||0
			};

			if (typeof this.style.zoom != undefined) this.style.zoom = 1; // force 'hasLayout' in IE
			if (!keep) this.style.border = 'none';
			strip.style.borderColor = cc || gpc(this.parentNode);
			cssHeight = $(this).outerHeight();

			for (j in edges) {
				bot = edges[j];
				// only add stips if needed
				if ((bot && (opts.BL || opts.BR)) || (!bot && (opts.TL || opts.TR))) {
					strip.style.borderStyle = 'none '+(opts[j+'R']?'solid':'none')+' none '+(opts[j+'L']?'solid':'none');
					d = document.createElement('div');
					$(d).addClass('jquery-corner');
					ds = d.style;

					bot ? this.appendChild(d) : this.insertBefore(d, this.firstChild);

					if (bot && cssHeight != 'auto') {
						if ($.css(this,'position') == 'static')
							this.style.position = 'relative';
						ds.position = 'absolute';
						ds.bottom = ds.left = ds.padding = ds.margin = '0';
						if (expr)
							ds.setExpression('width', 'this.parentNode.offsetWidth');
						else
							ds.width = '100%';
					}
					else if (!bot && $.browser.msie) {
						if ($.css(this,'position') == 'static')
							this.style.position = 'relative';
						ds.position = 'absolute';
						ds.top = ds.left = ds.right = ds.padding = ds.margin = '0';

						// fix ie6 problem when blocked element has a border width
						if (expr) {
							bw = sz(this,'borderLeftWidth') + sz(this,'borderRightWidth');
							ds.setExpression('width', 'this.parentNode.offsetWidth - '+bw+'+ "px"');
						}
						else
							ds.width = '100%';
					}
					else {
						ds.position = 'relative';
						ds.margin = !bot ? '-'+pad.T+'px -'+pad.R+'px '+(pad.T-width)+'px -'+pad.L+'px' :
						(pad.B-width)+'px -'+pad.R+'px -'+pad.B+'px -'+pad.L+'px';
					}

					for (i=0; i < width; i++) {
						w = Math.max(0,getWidth(fx,i, width));
						e = strip.cloneNode(false);
						e.style.borderWidth = '0 '+(opts[j+'R']?w:0)+'px 0 '+(opts[j+'L']?w:0)+'px';
						bot ? d.appendChild(e) : d.insertBefore(e, d.firstChild);
					}

					if (fold && $.support.boxModel) {
						if (bot && noBottomFold) continue;
						for (c in opts) {
							if (!opts[c]) continue;
							if (bot && (c == 'TL' || c == 'TR')) continue;
							if (!bot && (c == 'BL' || c == 'BR')) continue;

							common = {
								position: 'absolute',
								border: 'none',
								margin: 0,
								padding: 0,
								overflow: 'hidden',
								backgroundColor: strip.style.borderColor
							};
							$horz = $('<div/>').css(common).css({
								width: width + 'px',
								height: '1px'
							});
							switch(c) {
								case 'TL':
									$horz.css({
										bottom: 0,
										left: 0
									});
									break;
								case 'TR':
									$horz.css({
										bottom: 0,
										right: 0
									});
									break;
								case 'BL':
									$horz.css({
										top: 0,
										left: 0
									});
									break;
								case 'BR':
									$horz.css({
										top: 0,
										right: 0
									});
									break;
							}
							d.appendChild($horz[0]);

							var $vert = $('<div/>').css(common).css({
								top: 0,
								bottom: 0,
								width: '1px',
								height: width + 'px'
							});
							switch(c) {
								case 'TL':
									$vert.css({
										left: width
									});
									break;
								case 'TR':
									$vert.css({
										right: width
									});
									break;
								case 'BL':
									$vert.css({
										left: width
									});
									break;
								case 'BR':
									$vert.css({
										right: width
									});
									break;
							}
							d.appendChild($vert[0]);
						}
					}
				}
			}
		});
	};

	$.fn.uncorner = function() {
		if (radius || moz || webkit)
			this.css(radius ? 'border-radius' : moz ? '-moz-border-radius' : '-webkit-border-radius', 0);
		$('div.jquery-corner', this).remove();
		return this;
	};

	// expose options
	$.fn.corner.defaults = {
		useNative: true, // true if plugin should attempt to use native browser support for border radius rounding
		metaAttr:  'data-corner' // name of meta attribute to use for options
	};

})(jQuery);

(function($) {
	var cache = [];
	$.preLoadImages = function() {
		var args_len = arguments.length;
		for (var i = args_len; i--;) {
			var cacheImage = document.createElement('img');
			cacheImage.src = arguments[i];
			cache.push(cacheImage);
		}
	}
})(jQuery)

var Qallery = {
	host:'http://www.qallery.de',
	classGallery:'qallery',
	classGalleryWrapper:'qalleryWrapper',
	classGalleryMask:'qalleryMask',
	classGalleryTitle:'qalleryTitle',
	classGalleryCounter:'qalleryCounter',
	classGalleryMarker:'qalleryMarker',
	classMeta:'qalleryMeta',
	idMeta:'qalleryMeta',
	idGalleries:'qalleryGalleries',
	idImages:'qalleryImages',
	idWall:'qalleryWall',
	flash:{
		vars:null,
		params:null
	},
	galleries:[],
	images:[],
	debug:false,
	clientInfo:{
		browserName:'unknown',
		browserVersion:'0',
		flashVersion:'0,0,0'
	},

	_getClientInfo:function() {
		var userAgent = navigator.userAgent.toLowerCase();
		var browserName = userAgent.match(/(firefox|chrome|safari|opera|msie|qdev)/)[1];
		var browserVersion = (userAgent.match(new RegExp('.+(?:version)[\/: ]([\\d.]+)')) || userAgent.match(new RegExp('.+(?:'+browserName+')[\/: ]([\\d.]+)')) || [0,'0'])[1];
		this.clientInfo.browserName = browserName
		this.clientInfo.browserVersion = browserVersion
		this.clientInfo.flashVersion = (function() {
			try {
				try {
					var axo = new ActiveXObject('ShockwaveFlash.ShockwaveFlash.6');
					try {
						axo.AllowScriptAccess = 'always';
					}
					catch(e) {
						return '6,0,0';
					}
				} catch(e) {}
				return new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version').replace(/\D+/g, ',').match(/^,?(.+),?$/)[1];
			} catch(e) {
				try {
					if(navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin){
						return (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]).description.replace(/\D+/g, ",").match(/^,?(.+),?$/)[1];
					}
				} catch(e) {}
			}
			return '0,0,0';
		})();

		if (browserName == 'qdev') {
			this.debug = true;
			this._log('true', 'debug');
		}

		this._log('_getClientInfo()', 'call');
		this._log(this.clientInfo, 'dump clientInfo');

	},

	_log:function(value, label) {
		if (typeof console == 'object' && this.debug === true) {
			if (!label) {
				label = 'data';
			}
			console.log(label, value)
		}
	},

	_init:function() {
		if ($('#' + this.idMeta).length) {
			$('#' + this.idMeta).hide();
		}

		this._getClientInfo();
		this._log('_init()', 'call');
		this._getGalleriesAsJson();
	},

	_processFlash:function(path) {
		this._log('_processFlash(' + path + ')', 'call');

		this.flash.vars = {
			feed:this.host + '/getPiclensRss/' + path,
			backgroundAlpha:'0.0',
			numRows:4,
			style:'black',
			showEmbed:true,
			showSearch:true,
			showChrome:true,
			showNavArrows:false,
			showTutorial:false
		};

		this.flash.params = {
			allowFullScreen:'true',
			allowScriptAccess:'always',
			wmode:'opaque'
		};

		swfobject.embedSWF('http://apps.cooliris.com/embed/cooliris.swf', this.idWall, '736', '750', '9.0.0', '', this.flash.vars, this.flash.params);
	},

	_isLastGallery:function(path) {
		this._log('_isLastGallery(' + path + ')', 'call');

		for (var i = 0; i < this.galleries.length; i++) {
			if (this.galleries[i].path == path) {
				if (this.galleries.length - 1 == i) {
					return true;
				} else {
					return false;
				}
			}
		}
		throw 'Error: _isLastGallery(' + path+ ')';
	},
	
	_getGalleriesAsJson:function() {
		this._log('_getGalleriesAsJson()', 'call');

		$.getJSON(this.host + '/getGalleriesAsJson/', function(data) {
			Qallery._processGalleries(data);
		});
	},

	_getImagesAsJson:function(path) {
		this._log('_getImagesAsJson(' + path + ')', 'call');

		$.getJSON(this.host + '/getImagesAsJson/' + path, function(data) {
			Qallery._processImages(data, path);
		});
	},

	_processImages:function(data, path) {
		this._log('_processImages(' + data + ', ' + path + ')', 'call');

		this.images.push(data);

		$.preLoadImages(this.host + '/preview/' + path + '/preview.tmp');

		$('#' + this.classGallery + '_' + path)
		.css('background', 'url(' + this.host + '/preview/' + path + '/preview.tmp)')
		.css('backgroundColor', 'transparent')
		.css('backgroundRepeat', 'no-repeat')
		.css('backgroundPosition', '0px 0px')
		.bind("click", {
			_this: this
		}, function(e) {
			e.data._this._log('cooliris.embed.setFeedURL(' + e.data._this.host + '/getPiclensRss/' + path + ')', 'call');
			cooliris.embed.setFeedURL(Qallery.host + '/getPiclensRss/' + path);
		});

		$('#' + this.classGalleryCounter + '_' + path)
		.html(data.length);

		if (this._isLastGallery(path)) {
			this._processFlash(path);
		}
	},
	
	_processGalleries:function(data) {
		this._log('_processGalleries(' + data + ')', 'call');

		this.galleries = data;

		for (var i = 0; i < data.length; i++) {

			$('#' + this.idGalleries).append(
				$('<div></div>')
				.attr('class', this.classGalleryWrapper)
				.attr('id', (this.classGalleryWrapper + '_' + data[i].path))
				.append(
					$('<div></div>')
					.attr('class', this.classGallery)
					.attr('id', this.classGallery + '_' + data[i].path)
					.css('background', 'url(' + this.host + '/templates/default/img/loader.gif)')
					.css('backgroundColor', 'transparent')
					.css('backgroundRepeat', 'no-repeat')
					.css('backgroundPosition', 'center center')
					.corner("cc:#fff 5px")
					.append(
						$('<div></div>')
						.attr('class', this.classGalleryMask)
						.attr('id', (this.classGalleryMask + '_' + data[i].path))
						.corner("cc:#fff 5px")
						)
					.append(
						$('<div></div>')
						.attr('class', this.classGalleryMarker)
						.attr('id', (this.classGalleryMarker + '_' + data[i].path))
						)
					)
				.append(
					$('<p></p>')
					.attr('class', this.classGalleryTitle)
					.attr('id', (this.classGalleryTitle + '_' + data[i].path))
					.html(data[i].name)
					)
				.append(
					$('<p></p>')
					.attr('class', this.classGalleryCounter)
					.attr('id', (this.classGalleryCounter + '_' + data[i].path))
					.html(data[i].count)
					)
				);

			
			this._getImagesAsJson(data[i].path);
		}

		var _this = this;
		cooliris = {
			onEmbedInitialized:function() {
				cooliris.embed.setCallbacks({
					select: function(item) {
						_this._log('_coolirisSelectItem(' + item + ')', 'call');

						if (item === null) {
							$('#' + _this.idMeta).hide();
							$('#' + _this.idMeta).html($(''));
						} else {
							if (typeof item.data == 'object') {
								$('#' + _this.idMeta).show();
								if (item.data.EXIFDateTimeOriginal.length > 0) {
									var date = item.data.EXIFDateTimeOriginal.split(' ')[0].split(':');
									var time = item.data.EXIFDateTimeOriginal.split(' ')[1].split(':');
								}
								$('#' + _this.idMeta).html(
									$('<div class="' + _this.classMeta + '"></div>')
									.append($('<h2>Details zum Bild:</h2>'))
									.append(
										$('<ul></ul>')
										.append($('<li>Datum: ' + (date ? date[2] + '.' + date[1] + '.' + date[0]:'') + '</li>'))
										.append($('<li>Uhrzeit: ' + (time ? time[0] + ':' + time[1]:'') + '</li>'))
										.append($('<li>Kamera: ' + item.data.EXIFModel + '</li>'))
										.append($('<li>Brennweite: ' + item.data.EXIFFocalLength + '</li>'))
										.append($('<li>Blende: ' + item.data.EXIFFNumber + '</li>'))
										.append($('<li>ISO: ' + item.data.EXIFISOSpeedRatings + '</li>'))
										.append($('<li>Belichtungszeit: ' + item.data.EXIFExposureTime + '</li>'))
										)
									);
							}
						}
					}
				});
			}
		};

		this.control.init({
			gallery:this.classGallery,
			marker:this.classGalleryMarker,
			mask:this.classGalleryMask,
			size:160
		});
	},

	control:{
		init:function(options) {

			this.options = options || {};
			this.gallery = this.options.gallery;
			this.marker = this.options.marker;
			this.mask = this.options.mask;
			this.size = this.options.size;
			this.counter = 0;
			this.anchors = $('div.' + this.gallery);

			for (var i = 0; i < this.anchors.length; i++) {

				$(this.anchors[i]).bind('mousemove', {
					_this: this
				}, function(e) {
					e.data._this.move(e);
				});

				$(this.anchors[i]).bind('mouseout', {
					_this: this
				}, function(e) {
					e.data._this.reset(e);
				});

			}
		},

		move:function(e) {
			e = e || window.event;

			var activeGallery = e.currentTarget;

			for ( var i = 0; i < this.anchors.length; i++) {
				if ((activeGallery.id != this.anchors[i].id) && $(this.anchors[i]).css('display') != 'none') {
					$(this.anchors[i]).find('.' + this.marker)
					.css('backgroundPosition', '0px 0px')
					.css('display', 'none');
					this.counter = 0;
				}
			}

			if (this.counter == 0) {
				var imgSrc = $(activeGallery).css('background-image').match(new RegExp("((http)(:\/\/))?([a-zA-Z0-9]+[.]{1}){2}[a-zA-z0-9]+(\/{1}[a-zA-Z0-9\.]+)*\/?", "i"))[0];
				var image = new Image();
				image.src = imgSrc;
				this.counter = image.height / this.size;
			}

			var pos = Math.round(( e.clientX - $(activeGallery).offset().left) / (this.size / (this.counter - 1)));
			$(activeGallery).find('.' + this.marker).css('display', 'block');
			this.moveImage(activeGallery, pos);
		},

		moveImage:function(activeGallery, pos) {

			switch (pos) {
				case 0:
					$(activeGallery).find('.' + this.marker)
					.css('width', (this.size / this.counter) + 'px')
					.uncorner()
					.corner('left 5px');
					break;
				case this.counter - 1:
					$(activeGallery).find('.' + this.marker)
					.css('width', (this.size / this.counter) + 'px')
					.uncorner()
					.corner('right 5px');
					break;
				default:
					$(activeGallery).find('.' + this.marker)
					.css('width', (this.size / this.counter) + 'px')
					.uncorner();
					break;
			}

			$(activeGallery).find('.' + this.marker).css('left', (this.size / this.counter) * pos + 'px');
			$(activeGallery).css('backgroundPosition', '0px ' + (-this.size * pos) + 'px');
		},

		reset:function(e) {
			e = e || window.event;
			
			var eventTarget = e.relatedTarget || e.toElement;

			if (($(eventTarget).attr('class') != this.marker) && ($(eventTarget).attr('class') != this.mask)) {
				var activeGallery = e.currentTarget;
				this.moveImage(activeGallery, 0);
				this.counter = 0;
				$(activeGallery).find('.' + this.marker).css('display', 'none');
			}
		}
	}

}

$(function() {
	Qallery._init();
});
