Skip to content
Snippets Groups Projects
sample.js 8.81 KiB
Newer Older
  • Learn to ignore specific revisions
  • Laura Cappelli's avatar
    Laura Cappelli committed
    /*************************************************************************
    	(c) 2008-2012 Martin Wendt
     *************************************************************************/
    
    /*******************************************************************************
     * jQuery.skinswitcher plugin.
     *
     * Change CSS include when combobox selection changes.
     * Copyright (c) 2012 Martin Wendt
     *
     * Usage:
    	$("select#skinswitcher").skinswitcher({
    		base: "../src/",
    		choices: [{name: "XP", value: "xp", href: "skin/ui.fancytree.css"},
    				  {name: "Vista", value: "vista", href: "skin-vista/ui.fancytree.css"},
    				  {name: "Lion", value: "lion", href: "skin-lion/ui.fancytree.css"}
    				  ],
    		init: "lion"
    	});
     */
    /*globals alert, prettyPrint */
    
    (function( $ ) {
    	var PLUGIN_NAME = "skinswitcher",
    		defaultOptions = {
    			/**RegEx that returns prefix, tag, and suffix of the CSS href.*/
    			// skinPattern: "^(\W/skin-)().css$",
    			// mode: "combo", // {String} mode 'combo' or 'radio'
    			base: "",
    			choices: [],
    			// extraChoices: [],
    			// Events:
    			change: $.noop
    		},
    		methods = {
    			init: function(options) {
    				var i,
    					opts = $.extend({}, defaultOptions, options),
    					hrefs = [],
    					$link = null,
    					initialChoice;
    				// $('').skinswitcher did not match a selector
    				if( !this.length ){
    					return this;
    				}
    				// Attach options to skinswitcher combobox for later access
    				this.data("options", opts);
    				// Find the <link> tag that is used to includes our skin CSS.
    				// Add a class for later access.
    				$.each(opts.choices, function(){
    					hrefs.push(this.href.toLowerCase());
    				});
    				$("head link").each(function(){
    					for(i=0; i<hrefs.length; i++){
    						if(this.href.toLowerCase().indexOf(hrefs[i]) >= 0){
    							$link = $(this);
    							$link.addClass(PLUGIN_NAME);
    							initialChoice = opts.choices[i];
    						}
    					}
    				});
    				if( !$link ){
    					$link = $("link." + PLUGIN_NAME);
    				}
    				if( !$link.length ){
    					$.error("Unable to find <link> tag for skinswitcher. Either set `href` to a known skin url or add a `skinswitcher` class.");
    				}
    				//
    				return this.each(function() {
    					// Add options to dropdown list
    					var $combo = $(this);
    					$combo
    						.empty()
    						.skinswitcher("addChoices", opts.choices)
    						.change(function(event){
    							var choice = $(":selected", this).data("choice");
    							$("link." + PLUGIN_NAME).attr("href", opts.base + choice.href);
    							opts.change(choice);
    						});
    					// Find out initial selection
    					if(opts.init){
    						$combo.val(opts.init).change();
    					}else if (initialChoice){
    						// select combobox value to match current <link> tag
    						// decouple this call to prevent IE6 exception
    						setTimeout(function(){
    							$combo.val(initialChoice.value);
    							opts.change(initialChoice);
    						}, 100);
    					}
    				});
    			},
    			option: function(name, value) {
    				var opts = this.data("options");
    				if(typeof value !== "undefined"){
    					opts[name] = value;
    					return this;
    				}else{
    					return opts[name];
    				}
    			},
    			addChoices: function(choices) {
    				var $combo = $(this);
    				if( $.isPlainObject(choices) ){
    					choices = [ choices ];
    				}
    				$.each(choices, function(i, choice){
    					var $opt = $("<option>", {
    							text: choice.name,
    							value: choice.value
    						}).data("choice", choice);
    					$combo.append($opt);
    				});
    				return this;
    			},
    			change: function(value) {
    				$(this).val(value).change();
    				return this;
    			},
    			reset: function() {
    				$(this).val("").change();
    				return this;
    			}
    		};
    
    	$.fn[PLUGIN_NAME] = function(method) {
    		// Method calling logic
    		if ( methods[method] ) {
    			return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
    		} else if ( typeof method === "object" || ! method ) {
    			return methods.init.apply(this, arguments);
    		} else {
    			$.error("Method " +  method + " does not exist on jQuery." + PLUGIN_NAME);
    		}
    	};
    })( jQuery );
    
    
    /**
     * Replacement for $().toggle(func1, func2), which was deprecated with jQuery 1.8
     * and removed in 1.9.;
     * Taken from http://stackoverflow.com/a/4911660/19166
     * By Felix Kling
     */
    (function($) {
    
    var _gaq = _gaq || [],
    	SAMPLE_BUTTON_DEFAULTS = {
    		id: undefined,
    		label: "Sample",
    		newline: true,
    		code: function(){ alert("not implemented"); }
    	};
    
    $.fn.clickToggle = function(func1, func2) {
    	var funcs = [func1, func2];
    	this.data("toggleclicked", 0);
    	this.click(function() {
    		var data = $(this).data(),
    			tc = data.toggleclicked;
    		$.proxy(funcs[tc], this)();
    		data.toggleclicked = (tc + 1) % 2;
    	});
    	return this;
    };
    
    
    window.addSampleButton = function(options) {
    	var sourceCode,
    		opts = $.extend({}, SAMPLE_BUTTON_DEFAULTS, options),
    		$buttonBar = $("#sampleButtons"),
    		$container = $("<span />", {
    			"class": "sampleButtonContainer"
    		});
    
    	$("<button />", {
    		id: opts.id,
    		title: opts.tooltip,
    		text: opts.label
    	}).click(function(e){
    		e.preventDefault();
    		opts.code();
    	}).appendTo($container);
    
    	$("<a />", {
    		text: "Source code",
    		href: "#",
    		"class": "showCode"
    	}).appendTo($container)
    	.click(function(e){
    		try {
    			prettyPrint();
    		} catch (e2) {
    			alert(e2);
    		}
    		var $pre = $container.find("pre");
    		if($pre.is(":visible")){
    			$(this).text("Source code");
    		}else{
    			$(this).text("Hide source");
    		}
    		$pre.toggle("slow");
    		return false;
    	});
    	sourceCode = "" + opts.code;
    	// Remove outer function(){ CODE }
    //    sourceCode = sourceCode.match(/[]\{(.*)\}/);
    	sourceCode = sourceCode.substring(
    		sourceCode.indexOf("{") + 1,
    		sourceCode.lastIndexOf("}"));
    //    sourceCode = $.trim(sourceCode);
    	// Reduce tabs from 8 to 2 characters
    	sourceCode = sourceCode.replace(/\t/g, "  ");
    	// Format code samples
    
    	$("<pre />", {
    		text: sourceCode,
    		"class": "prettyprint"
    	}).hide().appendTo($container);
    	if(opts.newline){
    		$container.append($("<br />"));
    	}
    	if(opts.header){
    		$("<h5 />", {text: opts.header}).appendTo($("p#sampleButtons"));
    	}
    	if( !$("#sampleButtons").length ){
    		$.error("addSampleButton() needs a container with id #sampleButtons");
    	}
    	$container.appendTo($buttonBar);
    };
    
    
    function initCodeSamples() {
    	var info,
    		$source = $("#sourceCode");
    
    	$("#codeExample").clickToggle(
    		function(){
    			$source.show("fast");
    			if( !this.old ){
    				this.old = $(this).html();
    				$.get(this.href, function(code){
    					// Remove <!-- Start_Exclude [...] End_Exclude --> blocks:
    					code = code.replace(/<!-- Start_Exclude(.|\n|\r)*?End_Exclude -->/gi, "<!-- (Irrelevant source removed.) -->");
    					// Reduce tabs from 8 to 2 characters
    					code = code.replace(/\t/g, "  ");
    					$source.text(code);
    					// Format code samples
    					try {
    						prettyPrint();
    					} catch (e) {
    						alert(e);
    					}
    				}, "html");
    			}
    			$(this).html("Hide source code");
    		},
    		function(){
    			$(this).html(this.old);
    			$source.hide("fast");
    		}
    	);
    	if(jQuery.ui){
    		info = "Fancytree " + jQuery.ui.fancytree.version +
    			", jQuery UI " + jQuery.ui.version +
    			", jQuery " + jQuery.fn.jquery;
    /*
    		info += "\n<br>";
    		info += "document.compatMode: " + document.compatMode + "\n";
    		for(e in jQuery.support){
    			info += "<br>\n" + e + ": " + jQuery.support[e];
    		}
    */
    		$("p.sample-links").after("<p class='version-info'>" + info + "</p>");
    	}
    }
    
    $(function(){
    	// Log to Google Analytics, when not running locally
    	if ( document.URL.toLowerCase().indexOf("wwwendt.de/") >= 0 ) {
    		_gaq.push(["_setAccount", "UA-316028-1"]);
    		_gaq.push(["_trackPageview"]);
    
    		(function() {
    			var s, ga = document.createElement("script"); ga.type = "text/javascript"; ga.async = true;
    			ga.src = ("https:" === document.location.protocol ? "https://ssl" : "http://www") + ".google-analytics.com/ga.js";
    			s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(ga, s);
    		})();
    	}
    
    	// Show some elements only, if (not) inside the Example Browser
    	if (top.location === window.location){
    		$(".hideOutsideFS").hide();
    	}else{
    		$(".hideInsideFS").hide();
    	}
    	initCodeSamples();
    
    	$("select#skinswitcher").skinswitcher({
    		base: "../src/",
    		choices: [{name: "XP", value: "xp", href: "skin-xp/ui.fancytree.css"},
    				  {name: "Vista (classic Dynatree)", value: "vista", href: "skin-vista/ui.fancytree.css"},
    				  {name: "Win7", value: "win7", href: "skin-win7/ui.fancytree.css"},
    				  {name: "Win8", value: "win8", href: "skin-win8/ui.fancytree.css"},
    				  {name: "Win8-N", value: "win8n", href: "skin-win8-n/ui.fancytree.css"},
    				  {name: "Win8 xxl", value: "win8xxl", href: "skin-win8-xxl/ui.fancytree.css"},
    				  {name: "Lion", value: "lion", href: "skin-lion/ui.fancytree.css"}
    				  ],
    		change: function(choice) {
    			// console.log("choice: " + choice.value)
    			$("#connectorsSwitch").toggle(choice.value !== "xp");
    		}
    	}).after($("<label id='connectorsSwitch'><input name='cbConnectors' type='checkbox'>Connectors</label>"));
    
    	$("input[name=cbConnectors]").on("change", function(e){
    		$(".fancytree-container").toggleClass("fancytree-connectors", $(this).is(":checked"));
    	});
    });
    
    }(jQuery));