/*jslint browser:true, white:false, eqeqeq:false, onevar:false, plusplus:false, regexp:false, nomen:false, forin: true  */
/*global window:false, self:false, alert:false, escape:false, confirm:false,
	$:false, jQuery:false */

(function($) {
	
	$.marqueeNext = function(marqueeid) {
		var $container = $('#'+marqueeid);
		var $marquee = $container.children('div:eq(0)');
		var marqueedelay = $marquee.data('delay');
		if (!$container.data('paused')) {
			
			var increment = $marquee.data('increment');
			var pagesize = $marquee.data('pagesize');
			var totalheight = $marquee.data('totalheight');

			var current = parseInt($container.scrollTop(),10);
			
			var cbk = null;
			if (current+increment>=totalheight) {
				increment = totalheight - current;
				cbk = function(){
					$container.scrollTop(0); 
				};
			}

			$container.animate({ scrollTop: (current + increment) },'slow','swing',cbk);
		}
		setTimeout(function(){ $.marqueeNext(marqueeid); },marqueedelay);
	};
	
	$.fn.addMarquee = function(marqueecontent,marqueewidth,marqueeheight,marqueedelay) {
		var $container = $(this);
		$container
			.css({
				overflow: 'hidden',
				width: marqueewidth.length ? marqueewidth : 'auto',
				height: marqueeheight
			})
			.mouseover(function(){
				$(this).data('paused',true);
			})
			.mouseout(function(){
				$(this).data('paused',false);
			});
			
		if (marqueecontent === null) {
			marqueecontent = $container.html();
			$container.html('');
		}
		$container.show();
		
		var pagesize = parseInt(marqueeheight,10);
		var increment = Math.floor(pagesize * 0.90);
		
		var $marquee = $('<div />')
			.data('increment',increment)
			.data('delay',marqueedelay)
			.html(marqueecontent)
			.prepend($('<div />',{ height: pagesize+'px' }))
			.append($('<div />',{ height: pagesize+'px' }))
			.appendTo($container);
			
		var totalheight = $marquee.height() - pagesize;
			
		$marquee.data('totalheight',totalheight);
		$marquee.data('pagesize',pagesize);
		$container.scrollTop(pagesize);

		// if there is less than one page of content, no need to scroll
		if (totalheight-pagesize<pagesize) { return; }
		
		var marqueeid = $container.attr('id');
		setTimeout(function(){ $.marqueeNext(marqueeid); },marqueedelay);
	};

	$.photoViewerPositionNotice = function($imagecontainer,$el) {
		var width,height;
		var $image = $imagecontainer.data('image');

		var imgoffset = $image.offset();
		if (!imgoffset.left) {
			imgoffset = $imagecontainer.offset();
			height = 0;

			width = $(window).width();
		} else {
			width = $image.width();
			height = $image.height();
		}

		$el.css({
			top:  Math.floor( imgoffset.top  + (height - $el.height()) / 2 ) + 'px',
			left: Math.floor( imgoffset.left + (width  - $el.width() ) / 2 ) + 'px',
			position: 'absolute'
		});

	}
	
	$.photoViewerLoaded = function(event) {
		var $dotbox = event.data.dotbox,
			$navcontainer = $dotbox.parent(),
			$throbber = $navcontainer.data('throbber'),
			$imagecontainer = $navcontainer.data('imagecontainer'),
			$preloader = $navcontainer.data('preloadimg'),
			$image = $imagecontainer.data('image');

		$throbber.hide();

		if (event.data.error) {

			var imgoffset = $image.offset();

			$image.fadeOut('fast',function(){
				var $missing = $('<div/>',{
					html: 'Image missing.',
					css: {
						backgroundColor: '#C00000',
						border: '1px solid #500000',
						color: 'white',
						padding: '5px 10px 5px 10px'
					}
				}).appendTo($('body'));

				$.photoViewerPositionNotice($imagecontainer,$missing);

				setTimeout(function(){
					$missing.remove()
				},2000);
			});
			return;
		}

		$image.fadeOut('fast',function(){
			$image.attr('src',$preloader.attr('src'));
			$image.fadeIn('fast');
		});
	};
	
	$.photoViewerSelectImage = function($dotbox,index) {
		var $targetdot,targetindex;
		
		if (index===true || index===false) {
			var $current = $dotbox.children('img.selectedimage');
			if ($current.length) {
				targetindex = $current.data('dotindex') + ((index===true) ? 1 : -1);
			} else {
				targetindex = 0;
			}
		} else {
			targetindex = index;
		}

		var totaldots = $dotbox.data('totaldots');
		if (targetindex<0) {
			targetindex = totaldots - 1;
		} else if (targetindex>totaldots-1){
			targetindex = 0;
		}
		$targetdot = $dotbox.children('img:eq('+targetindex+')');
		
		$dotbox.children('img.selectedimage').removeClass('selectedimage').attr('src','/themes/images/photo-dot-off.gif');
		$targetdot.addClass('selectedimage').attr('src','/themes/images/photo-dot-on.gif');
		
		
		var $navcontainer = $dotbox.parent();
		var $throbber = $navcontainer.data('throbber');
		var $imagecontainer = $navcontainer.data('imagecontainer');

		$.photoViewerPositionNotice($imagecontainer,$throbber);
		$throbber.show();

		var $preloader = $navcontainer.data('preloadimg');
		$preloader.attr('src',$targetdot.data('imageurl'));
		$preloader.bind('load',{ dotbox: $dotbox },$.photoViewerLoaded);
		$preloader.bind('error',{ dotbox: $dotbox, error:true },$.photoViewerLoaded);
		
		/*
		// IE4 can't dynamically resize images when image.src is changed, so we have
		// to remove and re-add the image element
		if (IE4) {
			window.pviewer.display_image = new Image();
			window.pviewer.display_image.style.display = 'none';
			window.pviewer.display_image.onload = window.pviewer.resize_image_viewer;
			window.pviewer.display.appendChild(window.pviewer.display_image);
		}
		
		window.pviewer.display_image.src = dot.imgurl;
		window.pviewer.display_image.style.display = '';

		if (IE4) {
			var oldnode = window.pviewer.display.childNodes[0];
			window.pviewer.display.removeChild(oldnode);
		}
		
		this.activeindex = dot.dotindex;
		*/
		
	//	window.pviewer.imagejustchanged = true;
	};
	
	$.fn.reactivatePhotoViewer = function() {
		var $navcontainer = $(this);
		var $imagecontainer = $navcontainer.data('imagecontainer');
		var $image = $imagecontainer.data('image');
		$imagecontainer.height($image.height());
	};
	
	
	$.photoViewerDotClick = function(){
		var $this = $(this);
		var $dotbox = $this.parent();
		$.photoViewerSelectImage($dotbox,$this.data('dotindex'));
	};
	
	$.fn.addPhotoViewer = function($imagecontainer,imagenames) {
		var dbbordercolor = '#A0A0A0',
			dbbackgroundcolor = 'white',
			dotwidth = 18,
			dotheight = 22,
			nextprevwidth = 60,
			nextprevtoppad = 0;

		var $navcontainer = $(this);
		$navcontainer.data('imagecontainer',$imagecontainer);
	
		var $preloadimg = $('<img />',{
			css: {
				display: 'none'
			}
		});
		$imagecontainer.append($preloadimg);
		$navcontainer.data('preloadimg',$preloadimg);
		
		var $throbber = $('<div />',{
			html: ' Loading ...',
			css: {
				backgroundColor: 'white',
				border: '1px solid #A0A0A0',
				padding: '5px 10px 5px 10px'
			}
		}).hide();
		$throbber.prepend($('<img />').attr('src','/themes/images/ajax-loading.gif').attr('align','absmiddle'));
		
		$imagecontainer.append($throbber);
		$navcontainer.data('throbber',$throbber);
	
		var $image = $('<img />').load(function(){
			var $img = $(this);
			$img.parent().height($img.height());
		});
		$imagecontainer.append($image);
		$imagecontainer.data('image',$image);
			
		var $dotbox = $('<div />',{
			css: {
				border: '1px solid '+dbbordercolor,
				backgroundColor: dbbackgroundcolor,
				width: (dotwidth * imagenames.length + nextprevwidth*2) + 'px',
				height: (dotheight+0)+'px',
				textAlign: 'left',
				overflow: 'hidden'
			}
		});
		
		if ($.browser.mozilla){//Firefox
			$(this).css('MozUserSelect','none');
		} else if ($.browser.msie){//IE
			$(this).bind('selectstart',function(){return false;});
		}
		
		$dotbox.data('totaldots',imagenames.length);
		

		var $goprev = $('<div />',{
			css: {
				width: nextprevwidth + 'px',
				height: dotheight+'px',
				'float': 'left',
//				display: 'inline',
				//position: 'relative',
				//left: '0',
				//top: '0',
				paddingTop: nextprevtoppad+'px',
				textAlign: 'center',
				cursor: 'pointer'
			}
		});
		
		$goprev.mouseup(function(){
			$dotbox = $(this).parent();
			$.photoViewerSelectImage($dotbox,false);
		});
		
		$goprev.html(' Prev').prepend(
			$('<img />',{
				align: 'absmiddle',
				src: '/themes/images/photo-prev.gif',
				alt: 'Prev'
			})
		);
		//$goprev.css({ border: '1px solid red' }) 
		$dotbox.append($goprev);
		
		var i;		
		for (i=0; i<imagenames.length; i++) {
			var $dot = $('<img />',{
				css: {
					cursor: 'pointer',
					'float': 'left'
				}
			});
			$dot.attr('src','/themes/images/photo-dot-off.gif')
				.mouseup($.photoViewerDotClick)
				.data('imageurl',imagenames[i])
				.data('dotindex',i);
			$dotbox.append($dot);
		}
		
		var $gonext = $('<div />',{
			css: {
				width: nextprevwidth + 'px',
				height: dotheight+'px',
				textAlign: 'center',
				cursor: 'pointer',
				'float': 'left'
			}
		});
		
		$gonext.mouseup(function(){
			$dotbox = $(this).parent();
			$.photoViewerSelectImage($dotbox,true);
		});
		
		$gonext.html('Next ').append(
			$('<img />',{
				align: 'absmiddle',
				src: '/themes/images/photo-next.gif',
				alt: 'Next'
			})
		);
		
		$dotbox.append($gonext);
		
		$navcontainer.append($dotbox);
		
		$.photoViewerSelectImage($dotbox,0);
	};

	$.dbg_dialog = function(title, x) {

		var $existing = $('#dbg_dialog');
		if ($existing.length) {
			var $more = $('<div/>', {
				css: {
					borderTop: '1px dashed #909090',
					marginTop: '10px',
					padding: '10px 3px 3px 3px',
					whiteSpace: 'pre',
					fontFamily: 'Courier New, Courier, serif',
					fontSize: '11px',
					color: '#303030'
				}
			});
			$more.html('<strong>' + title + '</strong>' + ( (typeof x != 'undefined') ? ('<br /><br />' + x) : ''));
			$existing.append($more);

			return;
		}

		var winwidth = $(window).width();
		var winheight = $(window).height();
		var w = Math.floor(winwidth * 0.75);
		var h = Math.floor(winheight * 0.75);
		var t = Math.floor((winheight - h) / 2);
		var l = Math.floor((winwidth - w) / 2);

		var $container = $('<div/>', {
			id: 'dbg_dialog',
			css: {
				position: 'fixed',
				top: t + 'px',
				left: l + 'px',
				width: w + 'px',
				height: h + 'px',
				border: '1px solid #b0b0b0',
				backgroundColor: '#f0f0f0',
				overflow: 'scroll',
				zIndex: 255
			}
		});
		var $dump = $('<div/>', {
			css: {
				padding: '3px',
				whiteSpace: 'pre',
				fontFamily: 'Courier New, Courier, serif',
				fontSize: '11px',
				color: '#303030'
			}
		});
		$dump.html('<strong>' + title + '</strong>' + ( (typeof x != 'undefined') ? ('<br /><br />' + x) : ''));

		var $titlebar = $('<div/>', {
			css: {
				position: 'fixed',
				top: (t + 1) + 'px',
				left: (l + w - 16 - 18) + 'px',
				//'float': 'right',
				width: '16px',
				height: '16px',
				backgroundColor: 'red',
				color: 'white',
				textAlign: 'center',
				cursor: 'pointer'
			}
		});
		$titlebar.html('x');
		$titlebar.click(function() {
			$container.remove();
		});

		$titlebar.appendTo($container);
		$dump.appendTo($container);
		$('body').append($container);
	};


	// helper function for $.var_dump()
	function _var_dump(v, html, maxdepth) {
		//window._vd_indent++;

		if (window._vd_indent.length > 20) {
			return "*RECURSION*";
		}

		var s = '(' + (html ? '<span style="color: #0000FF">' : '') + typeof v + (html ? '</span>' : '') + ')';

		var norecurse = maxdepth && (window._vd_indent.length >= maxdepth * 2);

		if (!norecurse && ( (typeof v == 'Array') || (typeof v == 'object') )) {
			s += " {\n";

			for (var key in v) {
				if (typeof v[key] != 'function') {
					s += window._vd_indent + key + ': ';
					window._vd_indent += '  ';
					try {
						s += _var_dump(v[key], html, maxdepth);
					} catch(e) {
						var etext = e + '';
						if (etext.length > 75) {
							etext = etext.substring(0, 75) + ' ...';
						}
						s += "[Exception: " + etext + "]\n";
					}
					window._vd_indent = window._vd_indent.substring(0, window._vd_indent.length - 2);
				}
			}

			s += window._vd_indent.substring(0, window._vd_indent.length - 2) + "}\n";

		} else {
			s += " \"" + (html ? "<span style='font-weight: bold; color: black'>" : '') + v + (html ? "</span>" : "") + "\"\n";
		}

		//window._vd_indent --;
		return s;
	}

	$.var_dump = function(x, async, maxdepth) {
		window._vd_indent = '  ';
		if (async) {
			$.dbg_dialog('var_dump()', _var_dump(x, true, maxdepth));
		} else {
			alert('var_dump()\n' + _var_dump(x, false, maxdepth));
		}
	};

	$.dbg = function(s) {
		$.dbg_dialog(s);
	};


/**
 * jQuery plugin for posting form including file inputs.
 *
 * Copyright (c) 2010 Ewen Elder
 *
 * Licensed under the MIT and GPL licenses:
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.gnu.org/licenses/gpl.html
 *
 * @author: Ewen Elder <glomainn at yahoo dot co dot uk> <ewen at jainaewen dot com>
 * @version: 1.0.1 (2010-07-22)
**/
	$.fn.iframePostForm = function (options)
	{
		var contents, elements, element, iframe;

		elements = $(this);
		options = $.extend({}, $.fn.iframePostForm.defaults, options);

		// Add the iframe.
		if (!$('#' + options.iframeID).length)
		{
			$('body').append('<iframe name="' + options.iframeID + '" id="' + options.iframeID + '" style="display:none"></iframe>');
		}


		return elements.each
		(
			function ()
			{
				element = $(this);


				// Target the iframe.
				element.attr('target', options.iframeID);


				// Submit listener.
				element.submit
				(
					function ()
					{
						options.post.apply(this);

						iframe = $('#' + options.iframeID);
						iframe.one
						(
							'load',
							function ()
							{
								contents = iframe.contents().find('body');
								options.complete.apply(this, [contents.html()]);

								setTimeout
								(
									function ()
									{
										contents.html('');
									},
									1
								);
							}
						);
					}
				);
			}
		);
	};


	$.fn.iframePostForm.defaults = {
		iframeID : 'iframe-post-form',       // IFrame ID.
		post : function () {},               // Form onsubmit.
		complete : function (response) {}    // After everything is completed.
	};

	
})(jQuery);
	

