define(
['aloha/jquery'],
function (jQuery) {
/**
* Initialize of the CreateLayer object
*/
CreateLayer = function(TablePlugin){
this.TablePlugin = TablePlugin;
};
/**
* Internal configuration of the create-table panel
*/
CreateLayer.prototype.parameters = {
elemId: 'aloha-table-createLayer', // id of the create-table panel
className: 'aloha-table-createdialog', // class-name of the create-table panel
numX: 10, // Number of cols in the create-layer
numY: 10, // Number of rows in the create-layer vertically
layer: undefined, // Attribute holding the create-layer
target: undefined // the clicktarget which was clicked on (mostly the button of the floatingmenu)
};
/**
* The configuration-object for the implementer of the plugin. All keys of
* the "parameters" object could be overwritten within this object and will
* simply be used instead.
*/
CreateLayer.prototype.config = new Object();
/**
* Flag wether the CreateLayer is currently visble or not
*/
CreateLayer.prototype.visible = false;
/**
* This function checks if there is an create-table-layer. If no layer exists, it creates one and puts it into the configuration.
* If the layer was already created it sets the position of the panel and shows it.
*
* @return void
*/
CreateLayer.prototype.show = function(){
var layer = this.get('layer');
// create the panel if the layer doesn't exist
if (layer == null) {
this.create();
}else {
// or reposition, cleanup and show the layer
this.setPosition(layer);
layer.find('td').removeClass('hover');
layer.show();
}
this.visible = true;
};
/**
* Creates the div-layer which holds a table with the given number of rows and cols.
* It sets click and mouseover-events to the table data fields
*
* @return void
*/
CreateLayer.prototype.create = function () {
var that = this;
var layer = jQuery('
');
layer.id = this.get('elemId');
layer.addClass(this.get('className'));
var table = jQuery('');
table.css('width', (this.get('numX') + 6) * 15);
var tr;
var td;
for (var i = 0; i < this.get('numY'); i++) {
tr = jQuery('
');
for (var j = 0; j < this.get('numX'); j++) {
td = jQuery('\u00a0 | ');
if (i == 0 && j == 0) {
td.addClass('hover');
}
td.bind('mouseover', {rowId: i, colId: j}, function(e) {
that.handleMouseOver(e, table);
});
td.bind('click', {rowId: i, colId: j}, function(e){
var rows = e.data.rowId + 1;
var cols = e.data.colId + 1;
that.TablePlugin.createTable(cols, rows);
that.hide();
});
tr.append(td);
}
table.append(tr);
}
layer.append(table);
// set attributes
this.set('layer', layer);
this.setPosition();
// stop bubbling the click on the create-dialog up to the body event
layer.bind('click', function(e) {
e.stopPropagation();
}).mousedown(function(e) {
e.stopPropagation();
});
// append layer to body and
// hide the create layer if user clicks anywhere in the body
jQuery('body').append(layer).bind('click', function(e) {
if (e.target != that.get('target') && that.visible) {
that.hide();
}
});
};
/**
* handles the mose over state for a cell
* @param e event object
* @param table the aeffected table
* @return void
*/
CreateLayer.prototype.handleMouseOver = function(e, table) {
var rowId = e.data.rowId;
var colId = e.data.colId;
var innerRows = table.find('tr');
for (var n = 0; n <= innerRows.length; n++) {
var innerCells = jQuery(innerRows[n]).find('td');
for (var k = 0; k <= innerCells.length; k++) {
if (n <= rowId && k <= colId) {
jQuery(innerCells[k]).addClass('hover');
} else {
jQuery(innerCells[k]).removeClass('hover');
}
}
}
};
/**
* Sets the "left" and "top" style-attributes according to the clicked target-button
*
* @return void
*/
CreateLayer.prototype.setPosition = function() {
var targetObj = jQuery(this.get('target'));
var pos = targetObj.offset();
this.get('layer').css('left', pos.left + 'px');
this.get('layer').css('top', (pos.top + targetObj.height()) + 'px');
};
/**
* Hides the create-table panel width the jQuery-method hide()
*
* @see jQuery().hide()
* @return void
*/
CreateLayer.prototype.hide = function() {
this.get('layer').hide();
this.visible = false;
};
/**
* The "get"-method returns the value of the given key. First it searches in the
* config for the property. If there is no property with the given name in the
* "config"-object it returns the entry associated with in the parameters-object
*
* @param property
* @return void
*/
CreateLayer.prototype.get = function(property) {
// return param from the config
if (this.config[property]) {
return this.config[property];
}
// if config-param was not found return param from the parameters-object
if (this.parameters[property]) {
return this.parameters[property];
}
return undefined;
};
/**
* The "set"-method takes a key and a value. It checks if there is a key-value
* pair in the config-object. If so it saves the data in the config-object. If
* not it saves the data in the parameters-object.
*
* @param key
* the key which should be set
* @param value
* the value which should be set for the associated key
*/
CreateLayer.prototype.set = function (key, value) {
// if the key already exists in the config-object, set it to the config-object
if (this.config[key]) {
this.config[key] = value;
// otherwise "add" it to the parameters-object
}else{
this.parameters[key] = value;
}
};
return CreateLayer;
});