/**
 * jQuery Theme Switcher plugin
 *
 * Copyright (c) 2011 Dave Hoff (davehoff.com)
 * Dual licensed under the MIT and GPL licenses:
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.gnu.org/licenses/gpl.html
 *
 */

(function( $ ){

	$.fn.themeswitcher = function( options ) {
		var switcherDiv = this, switcherOptions = {};
		var settings = {
			loadtheme : "",
			height: 200,
			width: 175,
			rounded: true,
			imgpath: "",
			themepath: "https://ajax.googleapis.com/ajax/libs/jqueryui/",
			jqueryuiversion: "1.8.10",
			initialtext: "Switch Theme",
			buttonpretext: "Theme:",
			closeonselect: true,
			buttonheight: 14,
			cookiename: "jquery-ui-theme",
			themes: [],
			additionalthemes: [],
			onopen: null,
			onclose: null,
			onselect: null,
			cookieexpires: 365,
			cookiepath: '/'
		};

		if(options) {
			//lowercase all options passed in
			$.each(options, function(k,v){
				switcherOptions[k.toLowerCase()] = v;
			});

			$.extend( settings, switcherOptions );
		}

		if( ! settings.themes.length ){
			var themes = [
				{
					title: "Black Tie",
					name: "black-tie",
					icon: "theme_90_black_tie.png"
				},
				{
					title: "Blitzer",
					name: "blitzer",
					icon: "theme_90_blitzer.png"
				},
				{
					title: "Cupertino",
					name: "cupertino",
					icon: "theme_90_cupertino.png"
				},
				{
					title: "Dark Hive",
					name: "dark-hive",
					icon: "theme_90_dark_hive.png"
				},
				{
					title: "Dot Luv",
					name: "dot-luv",
					icon: "theme_90_dot_luv.png"
				},
				{
					title: "Eggplant",
					name: "eggplant",
					icon: "theme_90_eggplant.png"
				},
				{
					title: "Excite Bike",
					name: "excite-bike",
					icon: "theme_90_excite_bike.png"
				},
				{
					title: "Flick",
					name: "flick",
					icon: "theme_90_flick.png"
				},
				{
					title: "Hot Sneaks",
					name: "hot-sneaks",
					icon: "theme_90_hot_sneaks.png"
				},
				{
					title: "Humanity",
					name: "humanity",
					icon: "theme_90_humanity.png"
				},
				{
					title: "Le Frog",
					name: "le-frog",
					icon: "theme_90_le_frog.png"
				},
				{
					title: "Mint Choc",
					name: "mint-choc",
					icon: "theme_90_mint_choco.png"
				},
				{
					title: "Overcast",
					name: "overcast",
					icon: "theme_90_overcast.png"
				},
				{
					title: "Pepper Grinder",
					name: "pepper-grinder",
					icon: "theme_90_pepper_grinder.png"
				},
				{
					title: "Redmond",
					name: "redmond",
					icon: "theme_90_windoze.png"
				},
				{
					title: "Smoothness",
					name: "smoothness",
					icon: "theme_90_smoothness.png"
				},
				{
					title: "South Street",
					name: "south-street",
					icon: "theme_90_south_street.png"
				},
				{
					title: "Start",
					name: "start",
					icon: "theme_90_start_menu.png"
				},
				{
					title: "Sunny",
					name: "sunny",
					icon: "theme_90_sunny.png"
				},
				{
					title: "Swanky Purse",
					name: "swanky-purse",
					icon: "theme_90_swanky_purse.png"
				},
				{
					title: "Trontastic",
					name: "trontastic",
					icon: "theme_90_trontastic.png"
				},
				{
					title: "UI Darkness",
					name: "ui-darkness",
					icon: "theme_90_ui_dark.png"
				},
				{
					title: "UI Lightness",
					name: "ui-lightness",
					icon: "theme_90_ui_light.png"
				},
				{
					title: "Vader",
					name: "vader",
					icon: "theme_90_black_matte.png"
				}
			]
		}else{
			var themes = settings.themes;
		}

		if( settings.additionalthemes.length ){
			$.extend( themes, settings.additionalthemes );
		}

		// Switcher link
		var switcherLinkStyle = {
			"cursor": "pointer",
			"font-family": "'Trebuchet MS', Verdana, sans-serif",
			"font-size": "11px",
			"color": "#666",
			"background": "#eee url("+settings.imgpath+"buttonbg.png) repeat-x 50% 50%",
			"border": "1px solid #CCC",
			"text-decoration": "none",
			"padding": "3px 3px 3px 8px",
			"width": settings.width+"px",
			"display": "block",
			"height": settings.buttonheight+"px",
			"outline": "0px" ,
			"line-height": settings.buttonheight+"px"
		}

		if( settings.rounded ){
			switcherLinkStyle['border-radius'] = "6px";
			switcherLinkStyle['-moz-border-radius'] = "6px";
			switcherLinkStyle['-webkit-border-radius'] = "6px";
		}

		var switcherLink = $("<a/>")
			.addClass("jquery-ui-switcher-link")
			.css(switcherLinkStyle)
			.bind({
				mouseenter: function(){
					$(this).css({
						"background": "#eee"
					})
				},
				mouseleave: function(){
					if( ! switcherDiv.find(".jquery-ui-switcher-list-hldr").is(":visible") ){
						$(this).css({
							"background":"#eee url("+settings.imgpath+"buttonbg.png) repeat-x 50% 50%"
						})
					}
				},
				click: function(){
					(!switcherDiv.find(".jquery-ui-switcher-list-hldr").is(":visible")) ? openSwitcher() : closeSwitcher();
				}
			});

		// Title & Icon for switcher link
		var switcherTitle = $("<span/>").addClass("jquery-ui-switcher-title").appendTo(switcherLink);
		$("<span/>").addClass("jquery-ui-switcher-arrow")
			.css({
				"float": "right",
				"width": "16px",
				"height": "16px",
				"background": "url("+settings.imgpath+"icon_color_arrow.gif) no-repeat 50% 50%"
			})
			.appendTo(switcherLink);

		// load the default theme or the theme stored in the cookie
		if( $.cookie(settings.cookiename) ){
			updateTheme( findTheme($.cookie(settings.cookiename)) );

		}else if( settings.loadtheme.length ){
			updateTheme( findTheme(settings.loadtheme) );

		}else{
			switcherTitle.text(settings.initialtext);
		}

		var switcherListHldr = $("<div/>")
			.addClass("jquery-ui-switcher-list-hldr")
			.css({
				"width": eval(settings.width+8)+"px",
				"background": "#000",
				"color": "#FFF",
				"font-family": "'Trebuchet MS', Verdana, sans-serif",
				"font-size": "12px",
				"border": "1px solid #CCC",
				"border-top": "none",
				"z-index": "999999",
				"position": "absolute",
				"top": eval(settings.buttonheight+3)+"px",
				"left": "0px",
				"padding": "3px 3px 3px 0",
				"display": "none"
			})
			.bind({
				mouseleave: function(){
					closeSwitcher();
				}
			});

			if( settings.rounded ){
				switcherListHldr.css("border-radius","0 0 6px 6px");
				switcherListHldr.css("-moz-border-radius","0 0 6px 6px");
				switcherListHldr.css("-webkit-border-radius","0 0 6px 6px");
			}

		var switcherList = $("<ul/>")
			.css({
				"list-style": "none",
				"margin": "0",
				"padding": "0",
				"overflow-y": "auto",
				"overflow-x": "hidden",
				"height": settings.height+"px"
			})
			.appendTo(switcherListHldr);

		// Iterate over themes and build links
		$.each(themes, function(k,v){
			var listItem = $("<li>")
				.css("height","90px")
				.appendTo(switcherList);

			var listLink = $("<a>")
				.css({
					"display": "block",
					"padding": "5px 3px 5px 5px",
					"text-decoration": "none",
					"float": "left",
					"width": "100%",
					"clear": "left"
				})
				.bind({
					mouseenter: function(){
						listLink.css("background","url("+settings.imgpath+"menuhoverbg.png) repeat-x 50% 50%");
					},
					mouseleave: function(){
						listLink.css("background","none");
					},
					click: function(e){
						updateTheme($(this).data());
						e.preventDefault();
					}
				})
				.attr("href","#")
				.data(v)
				.appendTo(listItem);

			var linkImg = $("<img>")
				.attr("src", settings.imgpath + v.icon)
				.attr("title",v.title)
				.css({
					"float": "left",
					"margin-right": "5px",
					"border": "1px solid #333"
				})
				.appendTo(listLink);

			var linkText = $("<span>")
				.css({
					"float": "left",
					"padding-top": "5px",
					"color": "#AAA"
				})
				.text(v.title)
				.appendTo(listLink);
		});

		function updateTheme(data){
			if( settings.onselect !== null )
				settings.onselect();

			switcherTitle.text(settings.buttonpretext +" "+ data.title);


		var currentStyle = [];
		var url = data.url;

		if (!url) {
			var urlPrefix = settings.themepath + settings.jqueryuiversion + "/themes/";
			url = urlPrefix + data.name + "/jquery-ui.css";
			currentStyle = $('link[href^="' + urlPrefix + '"]').first();
		}

		if (currentStyle.length) {
			currentStyle[0].href = url;
		} else {
			var style = $("<link/>")
				.attr("type","text/css")
				.attr("rel","stylesheet")
				.attr("href", url);

			style.appendTo("head");
		}

			$.cookie(settings.cookiename, data.name,
				{ expires: settings.cookieexpires, path: settings.cookiepath }
			);

			switcherDiv.find(".jquery-ui-switcher-title").text(settings.buttonpretext + " " + data.title);

			if( settings.closeonselect )
				closeSwitcher();
		}

		// Finds a theme[] based on a valid name or title
		function findTheme(theme){
			var result = null;
			$.each(themes, function(k,v){
				if( v.name.toLowerCase() === theme.toLowerCase() || v.title.toLowerCase() === theme.toLowerCase() ){
					result = v;
					return false;
				}
			});

			if( !result ){
				return themes[0];
			}
			return result;
		}

		function openSwitcher(){
			if( settings.onopen !== null )
				settings.onopen();

			switcherDiv.find(".jquery-ui-switcher-link").css({
				"color": "#AAA",
				"background": "#000"
			});
			switcherDiv.find(".jquery-ui-switcher-list-hldr").slideDown("fast");
		}

		function closeSwitcher(){
			if( settings.onclose !== null )
				settings.onclose();

			switcherDiv.find(".jquery-ui-switcher-list-hldr").slideUp("fast", function(){
				switcherDiv.find(".jquery-ui-switcher-link").css({
					"color":"#666",
					"background": "#eee url("+settings.imgpath+"buttonbg.png) repeat-x 50% 50%"
				});
			});
		}


		this.css("position","relative");
		this.append(switcherLink);
		this.append(switcherListHldr);

		return this;
	}

})( jQuery );

/*!
 * jQuery Cookie Plugin
 * https://github.com/carhartl/jquery-cookie
 *
 * Copyright 2011, Klaus Hartl
 * Dual licensed under the MIT or GPL Version 2 licenses.
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.opensource.org/licenses/GPL-2.0
 */
(function($) {
	$.cookie = function(key, value, options) {

		// key and at least value given, set cookie...
		if (arguments.length > 1 && (!/Object/.test(Object.prototype.toString.call(value)) || value === null || value === undefined)) {
			options = $.extend({}, options);

			if (value === null || value === undefined) {
				options.expires = -1;
			}

			if (typeof options.expires === 'number') {
				var days = options.expires, t = options.expires = new Date();
				t.setDate(t.getDate() + days);
			}

			value = String(value);

			return (document.cookie = [
				encodeURIComponent(key), '=', options.raw ? value : encodeURIComponent(value),
				options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
				options.path    ? '; path=' + options.path : '',
				options.domain  ? '; domain=' + options.domain : '',
				options.secure  ? '; secure' : ''
			].join(''));
		}

		// key and possibly options given, get cookie...
		options = value || {};
		var decode = options.raw ? function(s) { return s; } : decodeURIComponent;

		var pairs = document.cookie.split('; ');
		for (var i = 0, pair; pair = pairs[i] && pairs[i].split('='); i++) {
			if (decode(pair[0]) === key) return decode(pair[1] || ''); // IE saves cookies with empty string as "c; ", e.g. without "=" as opposed to EOMB, thus pair[1] may be undefined
		}
		return null;
	};
})(jQuery);
