/* Copyright (c) 2011, Geert Bergman (geert@scrivo.nl)
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following disclaimer in the documentation
 *    and/or other materials provided with the distribution.
 * 3. Neither the name of "Scrivo" nor the names of its contributors may be
 *    used to endorse or promote products derived from this software without
 *    specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * $Id: Label.js 616 2013-04-22 23:48:38Z geert $
 */

"use strict";

SUI.form.Label = SUI.defineClass(
	/** @lends SUI.form.Label.prototype */{

	/** @ignore */ baseClass: SUI.Box,

	/**
	 * @class
	 * SUI.form.Label is a simple box component to create an HTML label.
	 *
	 * @augments SUI.Box
	 *
	 * @description
	 * Create a label.
	 *
	 * @constructs
	 * @param see base class
	 * @param {String} arg.title The text on the label.
	 * @param {SUI.Box} arg.forBox The box where this label's for.
	 */
	initializer: function(arg) {

		arg.tag = "LABEL";
		arg.height = arg.height || this.HEIGHT;

		SUI.form.Label.initializeBase(this, arg);

		this.forBox(arg.forBox || null);
		this.el().innerHTML = arg.title || "";

		this.el().style.overflow = "hidden";
		this.el().style.whiteSpace = "nowrap";

		var that = this;
		// but we do want to show the content if it is truncated
		// that and cell are the tow closure variables
		SUI.browser.addEventListener(this.el(), "mouseover",
			function(e) {
				if (!that._setTitleOnOverflow()) {
					SUI.browser.noPropagation(e);
				}
			}
		);

	},

	/**
	 * Default height of the label.
	 */
	HEIGHT: 20,

	/**
	 * Correction to add to the top of the label to vertically align the text
	 * with the control.
	 */
	TOP_PATCH: 2,

	/**
	 * Get or set the box where the label is for.
	 * @param {SUI.Box} f (optional) the new box where this label points to
	 * @return {SUI.Box} the box where this label points to  (null if method
	 *    was used as setter)
	 */
	forBox: function(f) {
		return f !== undefined ? (this._forBox = f) && null : this._forBox;
	},

	/**
	 * Display the label. Set the CSS size and postion.
	 */
	display: function() {
	 // do the normal lay out
		SUI.form.Label.parentMethod(this, "display");
		// and a little adjustment, note this only works because
		// parentMethod.display() sets this.el().style.top, thus there is
		// no chance of a 'growing' top margin when calling display multiple
		// times.
		this.el().style.top =
			(this.TOP_PATCH + parseInt(this.el().style.top,10)) + "px";
	},

	/**
	 * Lay out the label. Set it's size and position.
	 */
	layOut: function() {
	 // if the label points to a box ...
	 if (this._forBox) {
	   // ... set the for attribute of the box's element
		 this.el().setAttribute("for", this._forBox.el().id);
		}
		SUI.form.Label.parentMethod(this, "layOut");
	},

	// reference to the box where this label points to
	_forBox: null,

	// the top of the box (uncorrected)
	_lTop: 0,

	/* Set the label title if the contents of the label did overflow
	 */
	_setTitleOnOverflow: function() {
		var of = this.el().clientWidth - this.el().scrollWidth;
		this.el().title =
			of >= 0 ? "" : this.el().innerHTML .replace(/<[^>]+>/g,"");
	}

});