﻿/*
* Cookie plugin
*
* Copyright (c) 2006 Klaus Hartl (stilbuero.de)
* Dual licensed under the MIT and GPL licenses:
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
*
*/

/*
* Create a cookie with the given name and value and other optional parameters.
*
* @example $.cookie('the_cookie', 'the_value');
* @desc Set the value of a cookie.
* @example $.cookie('the_cookie', 'the_value', { expires: 7, path: '/', domain: 'jquery.com', secure: true });
* @desc Create a cookie with all available options.
* @example $.cookie('the_cookie', 'the_value');
* @desc Create a session cookie.
* @example $.cookie('the_cookie', null);
* @desc Delete a cookie by passing null as value. Keep in mind that you have to use the same path and domain
*       used when the cookie was set.
*
* @param String name The name of the cookie.
* @param String value The value of the cookie.
* @param Object options An object literal containing key/value pairs to provide optional cookie attributes.
* @option Number|Date expires Either an integer specifying the expiration date from now on in days or a Date object.
*                             If a negative value is specified (e.g. a date in the past), the cookie will be deleted.
*                             If set to null or omitted, the cookie will be a session cookie and will not be retained
*                             when the the browser exits.
* @option String path The value of the path atribute of the cookie (default: path of page that created the cookie).
* @option String domain The value of the domain attribute of the cookie (default: domain of page that created the cookie).
* @option Boolean secure If true, the secure attribute of the cookie will be set and the cookie transmission will
*                        require a secure protocol (like HTTPS).
* @type undefined
*
* @name $.cookie
* @cat Plugins/Cookie
* @author Klaus Hartl/klaus.hartl@stilbuero.de
*/

/*
* Get the value of a cookie with the given name.
*
* @example $.cookie('the_cookie');
* @desc Get the value of a cookie.
*
* @param String name The name of the cookie.
* @return The value of the cookie.
* @type String
*
* @name $.cookie
* @cat Plugins/Cookie
* @author Klaus Hartl/klaus.hartl@stilbuero.de
*/

$.cookie = function(name, value, options) {
	if (typeof value !== 'undefined') { // name and value given, set cookie
		options = options || {};
		if (value === null) {
			value = '';
			options.expires = -1;
		}
		var expires = '';
		if (options.expires && (typeof options.expires === 'number' || options.expires.toUTCString)) {
			var date;
			if (typeof options.expires === 'number') {
				date = new Date();
				date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
			} else {
				date = options.expires;
			}
			expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
		}
		// CAUTION: Needed to parenthesize options.path and options.domain
		// in the following expressions, otherwise they evaluate to undefined
		// in the packed version for some reason...
		var path = options.path ? '; path=' + (options.path) : '';
		var domain = options.domain ? '; domain=' + (options.domain) : '';
		var secure = options.secure ? '; secure' : '';
		document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
	} else { // only name given, get cookie
		var cookieValue = null;
		if (document.cookie && document.cookie !== '') {
			var cookies = document.cookie.split(';');
			for (var i = 0; i < cookies.length; i++) {
				var cookie = $.trim(cookies[i]);
				// Does this cookie string begin with the name we want?
				if (cookie.substring(0, name.length + 1) === (name + '=')) {
					cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
					break;
				}
			}
		}
		return cookieValue;
	}
};

/*
* Show/hide plugin
*/

(function($) {
	$.fn.attachShowHideEvents = function(options) {
		options = jQuery.extend({
			showHideClass: 'showHide',
			slideClass: 'slide:',
			saveStateAsCookieClass: 'saveStateAsCookie',
			showSpanClass: 'showSpan',
			hideSpanClass: 'hideSpan'
		}, options || {});

		return $(this).find('.' + options.showHideClass).each(function() {
			var controllerClassName = this.className.match(/controlElement-(\w+)/);
			var showHideElementClass;
			//jos class oli match, saadaan piiltettavan alueen nimi
			if (controllerClassName && controllerClassName.length > 1) {
				showHideElementClass = controllerClassName[1];
			} else {
				return; //ei löytynyt mitä piilotella/näyttää
			}
			var showHideElementSelector = '.' + showHideElementClass.substring(0, 1).toLowerCase() + showHideElementClass.substring(1);

			//optionaaliset parametrit klikattavan elementin class-attribuutista
			var slide = $(this).hasClass(options.slideClass);
			var toggleSpeed = 0;
			var toggleClassName = this.className.match(/toggleSpeed-(\d+)/);
			if (toggleClassName && toggleClassName.length > 1) {
				toggleSpeed = parseInt(toggleClassName[1], 10);
			}
			var saveStateAsCookie = $(this).hasClass(options.saveStateAsCookieClass);
			if (saveStateAsCookie && $.cookie(showHideElementClass)) {
				$(showHideElementClass).show();
			}
			var cookieStoreDays = 1;
			var cookieName = showHideElementClass;
			var cookieStoreClassName = this.className.match(/cookieStoreDays(\d+)/);
			if (cookieStoreClassName && cookieStoreClassName.length > 1) {
				cookieStoreDays = parseInt(cookieStoreClassName[1], 10);
			}

			if ($(showHideElementSelector).length > 0) {
				if (saveStateAsCookie && $.cookie(cookieName)) {
					$(showHideElementSelector).show();
					$(this).find('.' + options.showSpanClass).hide();
					$(this).find('.' + options.hideSpanClass).show();
				} else {
					//oletustilanne: suljettuna
					$(showHideElementSelector).hide();
					$(this).find('.' + options.showSpanClass).show();
					$(this).find('.' + options.hideSpanClass).hide();
				}
			} else {
				return; //ei löytynyt mitä piilotella/näyttää
			}
			$(this).click(function(event) {
				if (slide && toggleSpeed > 0) {
					$(showHideElementSelector).slideToggle(toggleSpeed);
				} else {
					$(showHideElementSelector).toggle(toggleSpeed);
				}

				if ($(event.target).hasClass('hideSpan')) {
					if (saveStateAsCookie) {
						$.cookie(cookieName, null); //poistetaan keksi
					}
					$(event.target).hide().siblings('.showSpan').show();
				} else {
					if (saveStateAsCookie) {
						$.cookie(cookieName, 'true', { expires: cookieStoreDays });
					}
					$(event.target).hide().siblings('.hideSpan').show();
				}
				return false;
			});
		});
	};
})(jQuery);

/*
* Filter multi select list options 
*/

(function($) {
	$.fn.attachFilterMultiSelectOptions = function(source, target, classPrefix) {
		var sourceOptions = $(this).find(source + ' option');
		var targetOptions = $(this).find(target + ' option');
		var targetOptionsBackup = $(this).find(target + ' option');
		$(source).change(function() {
			targetOptions.remove();
			targetOptionsBackup.appendTo(target);
			$(target + ' option').each(function() {
				var that = $(this);
				var found = false;
				$(source + ' option:selected').each(function() {
					if (that.hasClass(classPrefix + $(this).val())) {
						found = true;
					}
				});
				if (!found) that.remove();
			});
			if ($(this).val() == '' || $(this).val() == null) {
				targetOptionsBackup.appendTo(target);
				return;
			}
		}).change();
	};
})(jQuery);

/*
* Select all checkboxes (except the first)
*/

(function($) {
	$.fn.attachSelectAllFunctionality = function() {
		var selectAllElement = $(this);
		var checkboxes = $(this).parents('fieldset').find('input[type=checkbox]').slice(1);
		var allSelected = true;
		for (var i = 0; i < checkboxes.length; i++) {
			if (!($(checkboxes[i]).attr('checked', 'checked'))) {
				allSelected = false;
				break;
			}
		}
		if (allSelected == true) {
			$(this).attr('checked', 'checked');
		}
		$(this).click(function() {
			if ($(this).is(':checked')) {
				checkboxes.attr('checked', 'checked').each(function() {
					$(this).click(function() {
						$(selectAllElement).removeAttr('checked');
					});
				});
			} else {
				checkboxes.removeAttr('checked').unbind('click');
			}
		});
		return $(this);
	};
})(jQuery);

/*
* Table events (odd and even rows, row hover and click)
*/

(function($) {
	$.fn.attachTableEvents = function(filter) {
		var tableBodyRows = $(this).find('tr');
		if (filter) tableBodyRows = tableBodyRows.filter(filter);
		var i = 0;
		tableBodyRows.each(function() {
			i++;
			if (i % 2) {
				$(this).addClass('odd');
			} else {
				$(this).addClass('even');
			}
		});
		tableBodyRows.mouseover(function() {
			$(this).addClass('hover');
		}).mouseout(function() {
			$(this).removeClass('hover');
		});
		for (var i = 0; i < tableBodyRows.length; i++) {
			if ($(tableBodyRows[i]).find('td.type a').attr('href')) {
				$(tableBodyRows[i]).click(function() {
					var link = $(this).find('td.type a').attr('href');
					window.location.href = link;
				});
			} else {
				return true;
			}
		}
	}
})(jQuery);

/*
* Image thumbnail viewer
*/

(function($) {
	$.fn.attachImageViewer = function(previewWidth, previewHeight, fullWidth, fullHeight, gallery) {
		var imageLink = $(this).find('.image a');
		var image = $(this).find('.image img');
		var thumbnailLinks = $(this).find('.thumbnails li a');

		// If gallery variable isn't defined, all rel attributes are removed from link elements 
		if (!gallery) {
			imageLink.removeAttr('rel');
			thumbnailLinks.removeAttr('rel');
		}

		thumbnailLinks.click(function() {
			var tnLink = $(this);
			var tnImage = $(this).attr('href');
			var tnFile = tnImage.match(/\/File\/[\w\-]*/);
			var tnAllowCrop = tnImage.match(/\/AllowCrop\/\w+\//);
			var tnName = tnImage.match(/[\w\-]*.[\w\-]*$/);

			imageLink.attr({ href: tnImage });
			image.attr({ src: tnFile + '/Width/' + previewWidth + '/Height/' + previewHeight + tnAllowCrop + tnName });

			if (gallery) {
				tnLink.parents().find('.thumbnails li a').attr({ rel: gallery });
				tnLink.removeAttr('rel');
			}
			return false;
		});

		for (var i = 0; i < thumbnailLinks.length; i++) {
			if ($(thumbnailLinks[i]).attr('href') == imageLink.attr('href')) {
				$(thumbnailLinks[i]).removeAttr('rel');
			} else {
				return true;
			}
		}
	}
})(jQuery);

$(document).ready(function($) {
	$('.noScript').hide();
	$('.script').show();
	$('.locationFieldset').attachFilterMultiSelectOptions('select.selectCounty','select.selectMunicipality','countyId_');
	$('.selectAllCheckboxes').attachSelectAllFunctionality();
	$('.tableEvents').attachTableEvents(function() {
		return !$(this).hasClass('Header');
	});
	$('.images').attachImageViewer(350,263,800,800,'gallery');
	jQuery('.thumbnails').jcarousel({
		scroll: 5
	});
	$('a.thickbox').thickbox({
		macFFBgHack: '/Layout/Default/Image/Metsakiinteistot/thickbox/macFFBgHack.png',
		loadingImage: '/Layout/Default/Image/Metsakiinteistot/thickbox/thickbox-loading.gif'
	});

	$(document).attachShowHideEvents();
});