// Copyright (c) 2011, Open Experience GmbH. All rights reserved.

/**
 * Plug-in: ox-button
 * 		 
 * @author Konstantin Krahtov
 */
(function ($) {
	var name = 'ox_button';
	var defaults = {
			title: "",
			text: "",
			simple: true,
			onClick: function (event) {},
			onSubmenu: function (event) {},
			$submenu: false,
			iconClass: false,
			butClass: "ox-but-material",
			bodyClass: ""
	};

	function PlugIn ($element, o) {
		$element.data(name, this);
		$element.data(name + "_options", o);
		
		
		if ($element.children().length > 0) {
			o.$submenu = $('<div class="ox-but-submenucnt"/>').hide();
			$element.children().each(function (i, $e){
				o.$submenu.append($e);
			})
		}
		
		$element.addClass("ox-but-div");
		if (o.text == "") o.text = $element.text();
		$element.text("");
		
		var $ox_but = $('<a href="#" class="ox-but ' + o.butClass + '" title="' + o.title + '">')
				.appendTo($element)
				.click(function (event) {
					$ox_but.addClass("ox-but-sel");
					o.onClick(event);
					event.stopPropagation();
				});
			if (!o.simple) $ox_but.append($('<span class="ox-but-first"/>'))

			$ox_but_body = $('<span class="' + o.bodyClass + '"/>')
				.appendTo($ox_but),
			$ox_but_body_text = $('<span/>')
				.text(o.text)
				.appendTo($ox_but_body);
			if (!o.simple) $ox_but_body.addClass("ox-but-body");
				
		if (o.iconClass) {
			var $icon = $('<div class="ox-but-icon" />').addClass(o.iconClass).prependTo($ox_but_body);
		}

		if (o.$submenu) {
			var $f1, $arrow = $('<a href="#" class="ox-but ox-but-submenu ' + o.butClass + '" />')
				.appendTo($element)
				.append($f1 = $('<span>&#9660;</span>'))
				.click(function (event) {
					if (o.$submenu.is(':visible')) {
						o.$submenu.hide();
						$arrow.removeClass("ox-but-sel");
					} else {
						o.$submenu.show();
						$arrow.addClass("ox-but-sel");
					}
					if (o.onSubmenu) o.onSubmenu(event);
					event.stopPropagation();
				});
			if (!o.simple) $arrow.append('<span class="ox-but-last"/>');
			$ox_but_body.addClass("ox-but-pdgr");
			if (!o.simple) $f1.addClass("ox-but-body");
		} else {
			if (!o.simple) $('<span class="ox-but-last"/>').appendTo($ox_but);
		}
		$element.append(o.$submenu);
		
		this.inactive = function (event) {
			$ox_but.removeClass("ox-but-sel");
			if (o.$submenu) {
				o.$submenu.hide();
				$arrow.removeClass("ox-but-sel");
			}
		};
		
		this.set = function (options) {
			var param = options[0], 
				val = options[1];
			o[param] = val;
			switch (param) {
				case "butClass":
					$ox_but.removeClass($ox_but.attr('class'));
					$ox_but.addClass("ox-but " + o.butClass);
					if ($arrow) {
						$arrow.removeClass($arrow.attr('class'));
						$arrow.addClass("ox-but ox-but-submenu " + o.butClass);
					}
					 break;
				case "bodyClass":
					$ox_but_body.removeClass($ox_but_body.attr('class'));
					$ox_but_body.addClass("ox-but-body " + o.bodyClass); break;
				case "iconClass":
					if (o.iconClass) {
						$icon.removeClass($icon.attr('class'));
						$icon.addClass("ox-but-icon " + o.iconClass);
					}
					break;
				case "title":
					$ox_but.attr("title", o.title); break;
				case "text":
					$ox_but_body_text.text(o.text);
					break;
				case "$submenu":
				case "onClick":
				case "onSubmenu":
				case "simple":
					break;
				default:
					alert("Command '" + param + "' not found"); break;
			}
		}; 
		this.copyFrom = function (options) {
			var $source_ox_but = options[0];
			for (var i = 1; i < options.length; i++) {
				this.set([options[i], $source_ox_but.data("ox_button_options")[options[i]]]);
			}
		};
		this.copyAllFrom = function ($source_ox_but) {
			for (var i in o) {
				this.set([i, $source_ox_but.data("ox_button_options")[i]]);
			}
		};
		
	}

	function debug (obj) {
		console.log(obj);
	}

	$.fn[name] = function (method, options) {
		this.each(function () {
			$this = $(this);
			var obj = $this.data(name);
			if (!obj) {
				if (typeof method === 'object') {
					obj = new PlugIn($this, $.extend(true, {}, defaults, method));
				} else {
					obj = new PlugIn($this, $.extend(true, {}, defaults));
				}
			}
			if (typeof method === 'string') {
				obj[method](options);
			}
		});
		return this;
	};

})(jQuery);

