{"size": 9505, "ext": "js", "max_stars_repo_path": "source/stable/plugins/jquery.layout.buttons.js", "max_stars_repo_name": "GerHobbelt/jquery.layout", "max_stars_repo_stars_event_min_datetime": null, "max_stars_repo_stars_event_max_datetime": null, "max_issues_repo_path": "source/stable/plugins/jquery.layout.buttons.js", "max_issues_repo_name": "GerHobbelt/jquery.layout", "max_issues_repo_issues_event_min_datetime": null, "max_issues_repo_issues_event_max_datetime": null, "max_forks_repo_path": "source/stable/plugins/jquery.layout.buttons.js", "max_forks_repo_name": "GerHobbelt/jquery.layout", "max_forks_repo_forks_event_min_datetime": null, "max_forks_repo_forks_event_max_datetime": null}
{"max_stars_count": null, "max_issues_count": null, "max_forks_count": null, "avg_line_length": 35.5992509363, "max_line_length": 131, "alphanum_fraction": 0.6291425565}
/**
 * @preserve jquery.layout.buttons 1.0
 * $Date: 2011-07-16 08:00:00 (Sat, 16 July 2011) $
 *
 * Copyright (c) 2011 
 *   Kevin Dalman (http://allpro.net)
 *
 * Dual licensed under the GPL (http://www.gnu.org/licenses/gpl.html)
 * and MIT (http://www.opensource.org/licenses/mit-license.php) licenses.
 *
 * @dependancies: UI Layout 1.3.0.rc30.1 or higher
 *
 * @support: https://groups.google.com/forum/#!forum/jquery-ui-layout
 *
 * Docs: [ to come ]
 * Tips: [ to come ]
 */
;(function ($) {

if (!$.layout) return;


// tell Layout that the state plugin is available
$.layout.plugins.buttons = true;

//  Add State-Management options to layout.defaults
$.layout.defaults.autoBindCustomButtons = false;
// Set stateManagement as a layout-option, NOT a pane-option
$.layout.optionsMap.layout.push("autoBindCustomButtons");

/*
 *  Button methods
 */
$.layout.buttons = {
	// set data used by multiple methods below
	config: {
		borderPanes:    "north,south,west,east"
	}

	/**
	* Searches for .ui-layout-button-xxx elements and auto-binds them as layout-buttons
	*
	* @see  _create()
	*/
,   init: function (inst) {
		var pre     = "ui-layout-button-"
		,   layout  = inst.options.name || ""
		,   name;
		$.each("toggle,open,close,pin,toggle-slide,open-slide".split(","), function (i, action) {
			$.each($.layout.buttons.config.borderPanes.split(","), function (ii, pane) {
				$("."+pre+action+"-"+pane).each(function(){
					// if button was previously 'bound', data.layoutName was set, but is blank if layout has no 'name'
					name = $(this).data("layoutName") || $(this).attr("layoutName");
					if (name == undefined || name === layout)
						inst.bindButton(this, action, pane);
				});
			});
		});
	}

	/**
	* Helper function to validate params received by addButton utilities
	*
	* Two classes are added to the element, based on the buttonClass...
	* The type of button is appended to create the 2nd className:
	*  - ui-layout-button-pin
	*  - ui-layout-pane-button-toggle
	*  - ui-layout-pane-button-open
	*  - ui-layout-pane-button-close
	*
	* @param  {(string|!Object)}    selector    jQuery selector (or element) for button, eg: ".ui-layout-north .toggle-button"
	* @param  {string}              pane        Name of the pane the button is for: 'north', 'south', etc.
	* @return {Array.<Object>}      If both params valid, the element matching 'selector' in a jQuery wrapper - otherwise returns null
	*/
,   get: function (inst, selector, pane, action) {
		var $E  = $(selector)
		,   o   = inst.options
		//, err = o.showErrorMessages
		;
		if ($E.length && $.layout.buttons.config.borderPanes.indexOf(pane) >= 0) {
			var btn = o[pane].buttonClass +"-"+ action;
			$E  .addClass( btn +" "+ btn +"-"+ pane )
				.data("layoutName", o.name); // add layout identifier - even if blank!
		}
		return $E;
	}


	/**
	* NEW syntax for binding layout-buttons - will eventually replace addToggle, addOpen, etc.
	*
	* @param {(string|!Object)} sel     jQuery selector (or element) for button, eg: ".ui-layout-north .toggle-button"
	* @param {string}           action
	* @param {string}           pane
	*/
,   bind: function (inst, sel, action, pane) {
		var _ = $.layout.buttons;
		switch (action.toLowerCase()) {
			case "toggle":          _.addToggle (inst, sel, pane); break;   
			case "open":            _.addOpen   (inst, sel, pane); break;
			case "close":           _.addClose  (inst, sel, pane); break;
			case "pin":             _.addPin    (inst, sel, pane); break;
			case "toggle-slide":    _.addToggle (inst, sel, pane, true); break; 
			case "open-slide":      _.addOpen   (inst, sel, pane, true); break;
		}
		return inst;
	}

	/**
	* Add a custom Toggler button for a pane
	*
	* @param {(string|!Object)} selector    jQuery selector (or element) for button, eg: ".ui-layout-north .toggle-button"
	* @param {string}           pane        Name of the pane the button is for: 'north', 'south', etc.
	* @param {boolean=}         slide       true = slide-open, false = pin-open
	*/
,   addToggle: function (inst, selector, pane, slide) {
		$.layout.buttons.get(inst, selector, pane, "toggle")
			.click(function(evt){
				inst.toggle(pane, !!slide);
				evt.stopPropagation();
			});
		return inst;
	}

	/**
	* Add a custom Open button for a pane
	*
	* @param {(string|!Object)} selector    jQuery selector (or element) for button, eg: ".ui-layout-north .toggle-button"
	* @param {string}           pane        Name of the pane the button is for: 'north', 'south', etc.
	* @param {boolean=}         slide       true = slide-open, false = pin-open
	*/
,   addOpen: function (inst, selector, pane, slide) {
		$.layout.buttons.get(inst, selector, pane, "open")
			.attr("title", inst.options[pane].tips.Open)
			.click(function (evt) {
				inst.open(pane, !!slide);
				evt.stopPropagation();
			});
		return inst;
	}

	/**
	* Add a custom Close button for a pane
	*
	* @param {(string|!Object)} selector    jQuery selector (or element) for button, eg: ".ui-layout-north .toggle-button"
	* @param {string}           pane        Name of the pane the button is for: 'north', 'south', etc.
	*/
,   addClose: function (inst, selector, pane) {
		$.layout.buttons.get(inst, selector, pane, "close")
			.attr("title", inst.options[pane].tips.Close)
			.click(function (evt) {
				inst.close(pane);
				evt.stopPropagation();
			});
		return inst;
	}

	/**
	* Add a custom Pin button for a pane
	*
	* Four classes are added to the element, based on the paneClass for the associated pane...
	* Assuming the default paneClass and the pin is 'up', these classes are added for a west-pane pin:
	*  - ui-layout-pane-pin
	*  - ui-layout-pane-west-pin
	*  - ui-layout-pane-pin-up
	*  - ui-layout-pane-west-pin-up
	*
	* @param {(string|!Object)} selector    jQuery selector (or element) for button, eg: ".ui-layout-north .toggle-button"
	* @param {string}           pane        Name of the pane the pin is for: 'north', 'south', etc.
	*/
,   addPin: function (inst, selector, pane) {
		var $E = $.layout.buttons.get(inst, selector, pane, "pin");
		if ($E.length) {
			var s = inst.state[pane];
			$E.click(function (evt) {
				$.layout.buttons.setPinState(inst, $(this), pane, (s.isSliding || s.isClosed));
				if (s.isSliding || s.isClosed) inst.open( pane ); // change from sliding to open
				else inst.close( pane ); // slide-closed
				evt.stopPropagation();
			});
			// add up/down pin attributes and classes
			$.layout.buttons.setPinState(inst, $E, pane, (!s.isClosed && !s.isSliding));
			// add this pin to the pane data so we can 'sync it' automatically
			// PANE.pins key is an array so we can store multiple pins for each pane
			s.pins.push( selector ); // just save the selector string
		}
		return inst;
	}

	/**
	* Change the class of the pin button to make it look 'up' or 'down'
	*
	* @see  addPin(), syncPins()
	* @param {Array.<Object>}   $Pin    The pin-span element in a jQuery wrapper
	* @param {string}   pane    These are the params returned to callbacks by layout()
	* @param {boolean}  doPin   true = set the pin 'down', false = set it 'up'
	*/
,   setPinState: function (inst, $Pin, pane, doPin) {
		var updown = $Pin.attr("pin");
		if (updown && doPin === (updown=="down")) return; // already in correct state
		var
			po      = inst.options[pane]
		,   lang    = po.tips
		,   pin     = po.buttonClass +"-pin"
		,   side    = pin +"-"+ pane
		,   UP      = pin +"-up "+  side +"-up"
		,   DN      = pin +"-down "+side +"-down"
		;
		$Pin
			.attr("pin", doPin ? "down" : "up") // logic
			.attr("title", doPin ? lang.Unpin : lang.Pin)
			.removeClass( doPin ? UP : DN ) 
			.addClass( doPin ? DN : UP ) 
		;
	}

	/**
	* INTERNAL function to sync 'pin buttons' when pane is opened or closed
	* Unpinned means the pane is 'sliding' - ie, over-top of the adjacent panes
	*
	* @see  open(), close()
	* @param {string}   pane   These are the params returned to callbacks by layout()
	* @param {boolean}  doPin  True means set the pin 'down', False means 'up'
	*/
,   syncPinBtns: function (inst, pane, doPin) {
		// REAL METHOD IS _INSIDE_ LAYOUT - THIS IS HERE JUST FOR REFERENCE
		$.each(state[pane].pins, function (i, selector) {
			$.layout.buttons.setPinState(inst, $(selector), pane, doPin);
		});
	}


,   _load: function (inst) {
		//  ADD Button methods to Layout Instance
		$.extend( inst, {
			bindButton:     function (selector, action, pane) { return $.layout.buttons.bind(inst, selector, action, pane); }
		//  DEPRECATED METHODS...
		,   addToggleBtn:   function (selector, pane, slide) { return $.layout.buttons.addToggle(inst, selector, pane, slide); }
		,   addOpenBtn:     function (selector, pane, slide) { return $.layout.buttons.addOpen(inst, selector, pane, slide); }
		,   addCloseBtn:    function (selector, pane) { return $.layout.buttons.addClose(inst, selector, pane); }
		,   addPinBtn:      function (selector, pane) { return $.layout.buttons.addPin(inst, selector, pane); }
		});

		// init state array to hold pin-buttons
		for (var i=0; i<4; i++) {
			var pane = $.layout.buttons.config.borderPanes.split(',')[i];
			inst.state[pane].pins = [];
		}

		// auto-init buttons onLoad if option is enabled
		if ( inst.options.autoBindCustomButtons )
			$.layout.buttons.init(inst);
	}

,   _unload: function (inst) {
		// TODO: unbind all buttons???
	}

};

// add initialization method to Layout's onLoad array of functions
$.layout.onLoad.push(  $.layout.buttons._load );
//$.layout.onUnload.push( $.layout.buttons._unload );

})( jQuery );

