

$.mobile = function() {
    var agents = ['android', 'webos', 'iphone', 'ipad', 'blackberry'];
	 var agent = String(navigator.userAgent).toLowerCase();

    for (i in agents) {
        if (agent.indexOf(agents[i]) > -1) {
            return true;
        }
    }

    return false;
};


$.extend({
	delegate: function(fn, thisObject) {
      var parameters = Array.prototype.slice.call(arguments).slice(2);

      return function() {
         return fn.apply(thisObject || this, parameters.concat(Array.prototype.slice.call(arguments)));
      };
	}

});


$.email = function($value) {
	return /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test($value);						
}


$.snippet = function(template, data) { 
	if (!data) return template;

	var i;
   
   for (i in data) {
   	template = template.split('%7B' + i + '%7D').join(data[i]);
		template = template.split('{' + i + '}').join(data[i]);
   }

   return template;
}


function vimeo_player_loaded(id) {
	var $player = $('#' + id);

	$player[0].api_addEventListener('finish', 'videoVimeoFinish');
}


function videoVimeoFinish(id) {
	var $player = $('#' + id);
	var controller = $player.parent().data('controller');

	if (controller) controller.complete();
}


$.widget('ui.video', {

	_init: function() {
		var key = '__video';
		var value = this.options.value;
		var autoplay = this.options.autoplay;
		var data = this.options;
		
		this.element.data('controller', this);
		this.id = 'video' + String(Math.random() * 100).split('.').join('');
		
		if (!window[key]) window[key] = {};
		if (!value) value = this.element.attr('rel');
		if (!value) return;

		var extension = String(value).split('.').pop().toLowerCase();
		var type;
		var info;
		var flash;
		var url;
		var html;

		if (value.indexOf('youtube.com') !== -1) type = 'youtube';
		else if (value.indexOf('vimeo.com') !== -1) type = 'vimeo';

		data.type = type;
		window[key][this.id] = data;

		info = $.url.parse(value);

      if (type || $.inArray(extension, ['flv', 'f4v']) != -1) {
			if ($.flashVersion()[0] >= 7) {
				switch (type) {
					case 'youtube': url = 'http://www.youtube.com/v/' + info.params.v + '&hl=en_US&fs=1&'; break;
					case 'vimeo': url = "http://vimeo.com/moogaloop.swf?js_swf_id=" + this.id + "&amp;js_api=1&amp;autoplay=" + (autoplay ? 1 : 0) + "&amp;clip_id=" + info.directory.slice(1) +"&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=0&amp;show_portrait=0&amp;color=e9008b&amp;fullscreen=1"; break;
					default: url = this.options.player;
				}

				flash = new SWFObject(url, this.id, '100%', '100%', '8', '#d4d4d4');
				flash.addParam('allowScriptAccess', 'always');
				flash.addParam('allowFullScreen', 'true');
				flash.addParam('wmode', 'transparent');
				flash.addVariable('url', value);
				flash.write(this.element[0]);
				
			}
			else {
				switch (type) {
					case 'youtube': html = "<object width=\"100%\" height=\"100%\"><param name=\"movie\" value=\"" + value + "\"></param><param name=\"allowFullScreen\" value=\"true\"></param><param name=\"allowscriptaccess\" value=\"always\"></param><embed src=\"" + value + "\" type=\"application/x-shockwave-flash\" allowscriptaccess=\"always\" allowfullscreen=\"true\" width=\"100%\" height=\"100%\"></embed></object>"; break;
					//case 'vimeo': html = "<video src=\"http://www.vimeo.com/play_redirect?clip_id=" + info.directory.slice(1) + ($.browser.iphone ? "&quality=" : "") + "\" controls=\"controls\" preload=\"preload\" width=\"000\" height=\"000\"></video>"; break;
					case 'vimeo': html = "<iframe src=\"http://player.vimeo.com/video/" + $.trim(info.directory.slice(1)) + "?title=0&amp;byline=0&amp;portrait=0&amp;autoplay=" + (autoplay ? 1 : 0) + "\" width=\"100%\" height=\"100%\" frameborder=\"0\"></iframe>"; break;
				}
	
				this.element.html(html);
			}
		}
	},
	

	complete: function() {
		this.options.controller.change('1');
	}

});


$.numeric = function(value, places) {
	var pattern = /(\d+)(\d{3})/;
	var parts;
	var integer;
	var decimal;
	var match;
	
	if (isNaN(places)) places = 2;
	if (typeof value != 'number') value = 0;

	value = value.toFixed(places);
	value += '';
	parts = value.split('.');
	integer = parts[0];
	decimal = parts.length > 1 ? '.' + parts[1] : '';

	while (pattern.test(integer)) {
		integer = integer.replace(pattern, '$1' + ',' + '$2');
	}
	
	value = integer + decimal;
	
	if (value.slice(-3) == '.00') value = value.slice(0, -3);
	else if (value.slice(-2) == '.0') value = value.slice(0, -2);

	return value;
}


$.widget('ui.popup', {

	_create: function() {	
		this.cache = {};
		this.methods = {
			click: $.delegate(this.click, this),
			hide: $.delegate(this.hide, this)
		};
		this.frame = this.element.find('.popup-frame');
		this.setup();
		this.animate = !($.browser.msie && $.browser.version < 8);
		this.animate = false;
		this.overlay = this.element.find('.popup-overlay');
		this.overlayColor = this.overlay.css('background-color');
		this.items = this.element.find('.popup-container > *');
		this.items.css('margin-top', 0);

		if ($.browser.msie6) {
			this.frame.show();
			$(window).scroll($.delegate(this.scroll, this));
			this.scroll();
		}

		$(window).resize($.delegate(this.resize, this));
	},


	setup: function($target) {
		($target == null ? $('a') : $target.find('a')).unbind('click', this.methods.click).click(this.methods.click);
	},


	scroll: function() {
		this.element.css('top', $(window).scrollTop() + 'px');
	},
	
	
	resize: function() {
		if (!this.container) return;

		this.overlay.add(this.frame).css('width', Math.max($('body').width(), $(window).width()) + 'px');
		this.overlay.add(this.frame).css('height', Math.max($('body').height(), $(window).height()) + 'px');

		if (this.settings.resize !== false) this.container.css('top', Math.round(($(window).height() - this.container.height()) / 2) + 'px');
	},


	click: function(event) {
		var styles = String($(event.currentTarget).attr('class')).split(' ');
		var style;
		var title;
		
		for (var i = 0; i < styles.length; i++) {
			style = styles[i];
			
			if (style.slice(0, 6) == 'popup-') {
				title = style.slice(6);
				break;	
			}
		}
		
		if (!title) return;

		event.preventDefault();
		this.show(title);
	},
	
	
	show: function(title, settings) {
		var $items;
		var $buttons;

		this.history = this.title;
		this.title = title;
		this.settings = (!settings ? {} : settings);
		this.items.hide();
		this.container = this.items.filter('.' + title);
		this.container.show();
		this.overlay.css('alpha', 0.75);
		this.overlay.unbind();

		if (!this.cache[title]) this.cache[title] = $.snippet(this.container.html(), {});
		if (this.settings.data != null || this.settings.cache === false) this.container.html($.snippet(this.cache[title], this.settings.data));

		$buttons = this.container.find('.close, .cancel');
		$buttons.unbind('click', this.methods.hide).click(this.methods.hide);

		if (this.settings.close !== false && $buttons.length == 0) {
			this.overlay.bind('click', this, function(event) {
				event.preventDefault();
				event.data.hide();
			});
		}

		this.element.css('position', (this.settings.resize === false ? 'absolute' : ($.browser.msie6 ? 'absolute' : 'fixed')));

		if (this.animate) {
			this.element.fadeTo(500, 1);	
		}
		else {
			this.element.show();
		}
		
		if (this.settings.show) this.settings.show(this.container);

		this.resize();
	},
	
	
	hide: function(event) {
		if (event) {
			event.preventDefault();

			if ($(event.target).closest('.disabled').length > 0) return;
		}
		else {
			this.settings = {};
		}

		if (this.animate) {
			this.element.fadeTo(500, 0, $.delegate(this.hideComplete, this));	
		}
		else {
			this.hideComplete();
		}

		if (this.settings.hide) this.settings.hide();
	},
	
	
	hideComplete: function() {
		this.element.hide();

		if (this.settings.history) this.show(this.history);
	}
	
});


$.popup = {};
$.popup.show = function(title, settings) {
	$('#popup').popup('show', title, settings);
};
$.popup.hide = function() {
	$('#popup').popup('hide');
};
$.popup.setup = function($element) {
	$('#popup').popup('setup', $element);
};


$.flashVersion = function() {
	if ($.flashVersionData) return $.flashVersionData;

	var version = [0, 0, 0];

   if (navigator.plugins && navigator.mimeTypes.length) {
		var plugin = navigator.plugins["Shockwave Flash"];

		if (plugin && plugin.description) {
			version = plugin.description.split(" ");
			version = version[2] + '.' + String(version[4]).slice(1);
			version = version.split(".");
		}
	}
	else {
		try {
			var plugin = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
			for (var i = 3; plugin != null; i++) { plugin = new ActiveXObject("ShockwaveFlash.ShockwaveFlash." + i); }
			i--;
		}
		catch(error) { }

		if (i == 6) {
      	version = new Array(6, 0, 0);
		}
      else if (i > 2) {
			try { var version = plugin.GetVariable("$version").split(" ")[1].split(","); }
			catch(error) { }
		}
	}
	
	$.flashVersionData = new Array(parseInt(version[0]), parseInt(version[1]), parseInt(version[2]));

	return $.flashVersionData;
}


$.widget('ui.gallery', {

	_init: function() {
   	var data = this.options.data;
      var value;
      var extension;
		var index;
		var $button;

		this.flash = ($.flashVersion()[0] >= 7);
      this.viewer = this.element.find('.viewer ul');
      if (this.viewer.length == 0) this.viewer = this.element.find('.viewer');
		if (this.viewer.length == 0) this.viewer = this.element;

		this.viewer.show();
		this.duration = (this.options.duration ? this.options.duration : 5000);
		this.buttons = this.element.find('.pagination a, .thumbnails a');
		
		for (var i = 0; i < this.buttons.length; i++) {
			$button = this.buttons.eq(i);
			index = parseInt($button.attr('rel'), 10);
			if (index == 0 || isNaN(index)) index = this.buttons.index($button) + 1;
			$button.attr('rel', index);
		}

		this.buttons.unbind().bind('click', this, function(event) {
      	event.preventDefault();
			event.data.change(parseInt($(this).attr('rel'), 10));
      });
		
		i = 0;

      if (data == null) {
      	data = [];

         if (this.viewer.filter('ul').length > 0) {
            this.element.find('li').each(function() {
            	data.push($('<div />').append(this).css('display', '').html());
            });
         }
         else {
            this.viewer.find('img').each(function() {
               data.push($(this).attr('src'));
            });

            while (i < data.length) {
					extension = String(data[i]).split('.').pop().toLowerCase();
               
               if (!this.flash && $.inArray(extension, ['flv', 'f4v']) != -1) {
                  data.splice(i, 1);
               } 
               else {
                  i++;
               }
            }
			}
      }

		this.data = data;
		this.viewer.html('');
      this.enabled = true;
      
		if (this.data.length > 0) this.change(1);
	},
   
   
   play: function() {
   	this.pause();
   	this.interval = setInterval($.delegate(this.change, this, '1'), this.duration);
   },


   pause: function() {
   	if (this.interval == null) return;
   	clearInterval(this.interval);
      this.interval = null;
   },


	change: function(offset) {
		if (!this.enabled) return;

		var data = this.data;
		var index = Number(this.index);

		switch (offset) {
			case '-1': index = (index == 1 ? data.length : index - 1); break;
			case '1': index = (index == data.length ? 1 : index + 1); break;
			default: index = offset;	
		}

		if (index == this.index) return;
		if (this.container) {
			this.container.find('img').stop(true);
			this.container = null;	
		}

		this.index = index;
		this.buttons.removeClass('active').filter('[rel=' + index + ']').addClass('active');
      this.pause();
		this.fade();
	},


	fade: function() {
     	var value = this.data[this.index - 1];
		var extension = String(value).split('.').pop().toLowerCase();
      var html;
      var $items;
      var $item;
      var $image;
		var $video;
	
		$item = this.viewer.find('> *').filter(':last');
		if (this.options.hide) this.options.hide($item);

		if (value.indexOf('<') == -1 && value.indexOf('>') == -1) {
			if ($.inArray(extension, ['png', 'gif', 'jpg', 'jpeg']) != -1) {
				html = "<img src=\"" + value + "\" style=\"position: absolute; z-index: 1;\" />";
			}
			else if ($.inArray(extension, ['flv', 'f4v']) != -1 || (value.indexOf('youtube.com') !== -1 || value.indexOf('vimeo.com') !== -1)) {
				html = "<div class=\"video\" rel=\"" + value + "\"></div>";
			}
		}
		else {
			html = value;
		}

		this.viewer.append(html);
		$items = this.viewer.find('> *');
		$item = $items.filter(':last');

		if ($item.filter('img').length > 0) $image = $item;
		else $image = $item.find('img:first');

		if ($image.length > 0) {
			$item.fadeTo(0, 0);
			$image.load($.delegate(this.imageLoad, this, $items, $item, $image));
			
			if (this.options.click) {
				$image.click($.delegate(this.click, this));	
			}
			
			this.enabled = false;
		}

		if ($item.filter('.video').length > 0) $video = $item;
		else $video = $item.find('.video:first');

		if ($video.length > 0) {
			$video.video({
				controller: this,
				player: this.options.player,
				autoplay: this.options.autoplay
			});
			this.enabled = true;
		}
		
		$(window).trigger('resize');
	},


	click: function() {
		this.options.click.apply(this.element[0]);
	},


   imageLoad: function($items, $item, $image) {
   	$item.fadeTo(0, 0);
		$item.fadeTo(1000, 1, $.delegate(this.fadeComplete, this, $items, $item));

		this.container = $item;
		this.animate(false);
		this.animate(true);
		
		if (!this.preload) {
			this.preload = true;
			this.backgroundLoad(1);
		}
		
		if (this.options.change) this.options.change(this.index);
   },

   
   fadeComplete: function($items, $item) {
      $item.css('opacity', '').css('filter', '');

		if ($items.length > 1) {
			$items.not(':last').find('embed, object').remove();
			$items.not(':last').remove();
		}

		if (this.buttons.length == 0) this.play();
      this.enabled = true;
		
		if (this.options.show) this.options.show($item);
   },


	animate: function(animate) {
		if (!this.options.animate) return;

		var $image = this.container.find('img');

		if ($image.length == 0 || $image.width() <= this.container.width()) return;

		$image.css('margin-top', -Math.round(($image.height() - this.container.height()) / 2) + 'px');
		$image.css('margin-left', -Math.round(($image.width() - this.container.width()) / 2) + 'px');

		if (!animate) return;

		$image.animate({ 'margin-left': 0 }, { duration: this.duration + 500, easing: 'easeInOutSine' });
	},
	
	
	backgroundLoad: function(index) {
		var $image;

		if (index > this.data.length) {
			this.backgroundContainer.html('');	
			return;
		}

		if (!this.backgroundContainer) {
			$('body').prepend("<div class=\"background-container\" style=\"position: absolute; z-index: 10; left:-4000px;\"></div>");
			this.backgroundContainer = $('.background-container:first');
		}
		
		this.backgroundContainer.html(this.data[index - 1]);
		$image = this.backgroundContainer.find('img:first');

		if ($image.length == 0) {
			this.backgroundLoad(index + 1);
		}
		else {
			$image.load($.delegate(this.backgroundLoad, this, index + 1));
		}
	}

});


$.widget('ui.validate', {

	_create: function() {
		var $buttons = this.element.find('button[type=submit], input[type=submit], a.submit');
		var $button;

		this.cache = {};
		this.element.addClass('ui-validate');
		this.methods = {
			submit: $.delegate(this.submitCallback, this),
			focus: $.delegate(this.fieldFocus, this),
			blur: $.delegate(this.fieldBlur, this),
			change: $.delegate(this.fieldChange, this)
		};
      this.form = this.element.filter('form');
		this.warning = this.element.find('.warning').hide();
		this.enabled = (this.options.enabled !== false);

		if (this.options.buttons) $buttons = $buttons.add(this.options.buttons);

		for (var i = 0; i < $buttons.length; i++) {
			$button = $buttons.eq(i);

			if ($button.data('validator') != null) {         
				$buttons.splice(i, 1);
				i--;
			}
			else {
				$button.data('validator', this);	
			}
		}
		
		$buttons.unbind('click', this.methods.submit).click(this.methods.submit);

		this.form.unbind('submit', this.methods.submit).submit(this.methods.submit);
		this.buttons = $buttons;
		this.type = this.options.type;
      this.show();
	},


	reset: function(change) {
		var $fields = this.fields();
		var $field;
		var $error;

      for (var $i = 0; $i < $fields.length; $i++) {
      	$field = $fields.eq($i);

			if ($field.data('validator') == this) {
				if (change !== false) {
					if ($field.filter('[type=checkbox]').length > 0) {
						$field.attr('checked', false);
					}
					else {
						if ($field.filter('[type=radio]').length == 0) $field.val('');
					}
				}

				$field.removeClass('error');
				this.fieldShow($field, 'error', false);
				this.fieldShow($field, 'success', false);
				$field.trigger('update');
			}
      }
		
		this.warning.hide();
		this.validate(false);
	},


   submitCallback: function(event) {
		if (this.element.filter('form').length == 0 || !this.enabled) event.preventDefault();
		if (!this.enabled) return;
		return this.validate(event);
   },
	
	
	show: function() {
		var $fields = this.fields();
		var $field;

		this.setup();

      for (var i = 0; i < $fields.length; i++) {
      	$field = $fields.eq(i);

			if ($field.val() !== null && $field.val().length == 0) {
				$field.val($field.attr('title'));
				this.clone($field, false);
			}
      }

		this.refresh();
	},
	
	
	status: function(status) {
		this.enabled = status;
	},


   setup: function() {
   	var $fields = this.fields();
      var $field;
		var required;
  
		for (var $i = 0; $i < $fields.length; $i++) {
			$field = $fields.eq($i);
			this.fieldSetup($field);
		}
   },
	
	
	fieldSetup: function($field, type) {
		if ($field.data('validator') == null) $field.data('validator', this);
		if ($field.data('type') == null) {
			$field.data('type', (type ? type : $field.attr('type')));
			$field.data('types', this.fieldTypes($field));
			$field.unbind('focus', this.methods.focus).focus(this.methods.focus);
			$field.unbind('blur', this.methods.blur).blur(this.methods.blur);
			$field.unbind('change keyup', this.methods.change).bind('change keyup click', this.methods.change);
		}
	},
	

	fieldFocus: function(event) {
		var $field = $(event.target);

      if ($field.val() == $field.attr('title')) {
         $field.val('');
         this.clone($field, true);
      }
		
		$field.closest('li').find('.question').show();
   },
  

   fieldBlur: function(event) {
      var $field = $(event.target);
		
		if ($field.val() !== null && $field.val().length == 0) {
         $field.val($field.attr('title'));
         this.clone($field, false);
      }

		if ($field.val() && $field.data('focus') && ($field.val().length > 0 && $field.val() != $field.attr('title'))) this.fieldValidate($field);

		this.update(false);
   },


	fields: function() {
		return this.element.find('input, textarea, select');
	},


	clone: function($field, password) {
		if (!$field.attr('title') || $field.attr('title').length == 0) return;

		var type = $field.data('type');
      var attributes = ['id', 'class', 'style', 'type', 'title', 'name', 'value'];
      var attribute;
      var html;
      var $clone;
      
      if ($field.attr('type') == (password ? 'password' : 'text')) return;

		if (type == 'password') {
         html = "<input type=\"" + (password ? 'password' : 'text') + "\"";
 
         for (var i = 0; i < attributes.length; i++)
         {
         	attribute = $field.attr(attributes[i]);

            if (attribute != null) {
            	html += attributes[i] + "=\"" + attribute + "\"";
            }
         }

         html += "></input>";
 
         $field.after(html);
         $clone = $field.next();
         $field.remove();
         this.fieldSetup($clone, type);
         if (password) $clone.focus();
		}
	},
	
	
	cleanup: function() {
   	var $fields = this.fields();
      var $field;

      for (var i = 0; i < $fields.length; i++) {
         $field = $fields.eq(i);
         if ($field.val() == $field.attr('title')) $field.val('');
      }
   },


   submit: function() {
   	this.cleanup();
      this.element[0].submit();
   },
	
	
	fieldTypes: function($field) {
		var parts = String($field.attr('class')).split(" ");
		var part = [];

		for (var i = 0; i < parts.length; i++) {
			if (parts[i].slice(0, 8) == 'validate') {
				part = parts[i].slice(9, -1).split(',');
				break;	
			}
		}
		
		return part;
	},
	
	
	refresh: function() {
   	this.validate(false);
   },


	fieldShow: function($field, type, show) {
		switch (type) {
			case 'error':

				$field.closest('.field').toggleClass('verify-error', show);
			
				break;

			case 'success':
			
				$field.closest('.field').toggleClass('verify-ok', show);
			
				break;
		}

		if (this.options.show) this.options.show($field, type, show);
	},

	
	fieldChange: function(event, format) {
		var $field = $(event.target);
		var valid = this.fieldValidate($field, false);

		this.fieldShow($field, 'error', false);
		$field.removeClass('error');
		$field.trigger('update');
		this.update(false);
	},


	fieldStatus: function($field, valid) {
		var status = valid;

		if ($field.hasClass('datefield')) {
			var $fields = $field.closest('.field').find('select.datefield').not($field[0]);

			for (var i = 0; i < $fields.length; i++) {
				if ($fields.eq(i).val() == '') status = false;
			}
		}

		
		if ($field.hasClass('searchfield') && $field.searchfield('validate')) status = true;

		if (this.options.status) {
			rule = this.options.status($field, status);
			if (rule === true || rule === false) status = rule;
		}

		return status;
	},
	

	update: function(show) {
		var result = this.check();

		this.buttons.toggleClass('disabled', !result);

		if (show !== false) this.warning[(result ? 'hide' : 'show')]();
	},
	
	
	check: function() {
		var result = true;
		
		for (var i in this.cache) {
			if (!this.cache[i]) result = false;	
		}
		
		return result;
	},


	validate: function(event, search) {
		var $fields = this.fields();
      var $field;
      var values = {};
      var value;
		var name;
		var valid;
		var result = true;
      var errors = {};
      var error;
		var $target = this.element;
		var i = 0;
		var show = (event !== false);
		
		this.cache = {};

		for (i = 0; i < $fields.length; i++) {
			$field = $fields.eq(i);
 			valid = this.fieldValidate($field, show);
			errors[name] = !valid;
			values[name] = value;

			if (!valid) result = false;
			if (show && !valid && this.options.error) this.options.error.apply(this.element[0], [$field, event]);
		}

		this.update(show);

		if (show) {
			if (!result) {
				if (this.options.scroll !== false && $target.css('position') != 'absolute' && $target.css('position') != 'fixed') $(window).scrollTop($target.offset().top);
			}

			if ((search !== false) && result && this.options.submit != null)
			{
				this.options.submit.apply(this.element[0], [event, this.element[0]]);
				return false;
			}
		}
		
		return result;
	},


	fieldValidate: function($field, show) {
		var types;
		var type;
		var status;
		var visible;
		var rule;
		var name;

		if ($field.data('validator') == this) {		
			value = ($field.val() == $field.attr('title') ? '' : $field.val());
			name = $field.attr('name');
			types = this.fieldTypes($field);
			type = types[0];
			visible = $field.is(':visible');

			if (((!visible || $field.attr('disabled')) && $field.filter('input[type=hidden]').length == 0) || types.length == 0) return true;
			if (!value) value = '';

			switch (type) {
				case 'email': valid = $.email(value); break;
				case 'numbers': valid = (Number(value) > 0); break;
				case 'match': valid = (value.length >= 2 && value == this.fields().filter('[name=' + $field.attr('rel') + ']').val()); break;
				case 'postcode': valid = (/[A-Z]{1,2}[0-9]{1,2} ?[0-9][A-Z]{2}/i.test(value)); break;
				case 'phone': valid = (/^[0-9\- ]*$/.test(value) && value.replace(/[^0-9]/g, '').length >= 11); break;
				case 'simple': valid = (value.length >= 1); break;
				default: valid = (value.length >= 2 || ($field.filter('select').length > 0 && value != ''));
			}

			if (type != 'simple' && $field.attr('type') == 'password' && value.length < 8) {
				valid = false;
			}
			else if ($field.filter('[type=checkbox]').length > 0) {
				valid = (this.element.find('input[name=' + $field.attr('name') + '][type=checkbox]:checked').length > 0);
			}
			else if ($field.filter('[type=radio]').length > 0) {
				valid = (this.element.find('input[name=' + $field.attr('name') + '][type=radio]:checked').length > 0);
			}
			else if ($field.hasClass('searchfield')) {
				valid = $field.searchfield('validate');
			}
			else if ($field.hasClass('ui-autocomplete-input') && $field.prev().filter(':input[type=hidden]').length > 0) {
				valid = (String($field.prev().val()).length >= 1);
			}

			if (this.options.validate) {
				rule = this.options.validate($field, show);
				if (rule === true || rule === false) valid = rule;
			}

			this.cache[name] = valid;

			status = this.fieldStatus($field, valid);

			if (show !== false) {
				$field.toggleClass('error', !valid);
				this.fieldShow($field, 'error', !status);
			}

			this.fieldShow($field, 'success', status);

			$field.trigger('update');

			return valid;
		}

		return true;
	}

});



$().ready(function() {
	$('#popup').popup();

	$('#home .gallery, #exhibitions .gallery, #video-detail .player').gallery({
		autoplay: true
	});

	$('#contact form').validate({
     	/*
		submit: function() { 
			$.ajax({
         	url: $(this).attr('action'),
         	type: 'POST',
            data: $(this).serialize(),
				success: function(data) {
					//
				}
         });
      
			alert('Thanks for contacting us.');
		}
		*/
	});
	$('#footer .newsletter form, #exhibitions .subscribe form').validate({
		submit: function() {
      	$.ajax({
         	url: $(this).attr('action'),
         	type: 'POST',
            data: $(this).serialize()
         });

			alert('Thanks for subscribing.');
		}
	});
	
	$('#work .list .images ul li a').click(function(event) {
		event.preventDefault();
		
		var index = Number($(this).attr('rel'));

		//index = $(this).closest('ul').find('a').index(this);

		$('#work .lightbox a.lightbox').eq(index).trigger('click');
	});

	$('a.lightbox').lightBox({
		imageLoading: 'http://www.miguelparedes.com/assets/images/lightbox/lightbox-ico-loading.gif',
		imageBtnPrev: 'http://www.miguelparedes.com/assets/images/lightbox/lightbox-btn-prev.gif',
		imageBtnNext: 'http://www.miguelparedes.com/assets/images/lightbox/lightbox-btn-next.gif',
		imageBtnClose: 'http://www.miguelparedes.com/assets/images/lightbox/lightbox-btn-close.gif',
		imageBlank: 'http://www.miguelparedes.com/assets/images/lightbox/lightbox-blank.gif'	
	});
});
