var has_bubble_problem = (0 < Y.UA.ie && Y.UA.ie < 9);
Y.QueryBuilder.Calendar = function(
/* object */ query_builder,
/* object */ config)
{
this.qb = query_builder;
this.op_menu_name_pattern = config.field_prefix + 'query_op_{i}';
this.val_input_name_pattern = config.field_prefix + 'query_val_{i}_c{j}';
};
Y.QueryBuilder.Calendar.prototype =
{
create: function(
/* int */ query_index,
/* object */ var_config,
/* array */ op_list,
/* array */ value)
{
var op_cell = this.qb._createContainer();
op_cell.set('className', this.qb.getClassName('operator'));
op_cell.set('innerHTML', this._operationsMenu(this.operationName(query_index)));
this.op_menu = op_cell.one('select');
var options = Y.Node.getDOMNode(this.op_menu).options;
var isMultipleValue = op_list[0].multipleValue;
for (var i=0; i<op_list.length; i++)
{
options[i] = new Option(op_list[i].text, op_list[i].value);
}
value = value || ['',''];
if (value[0])
{
this.op_menu.set('value', value[0]);
}
if (has_bubble_problem)
{
this.op_menu.on('change', this.qb._notifyChanged, this.qb);
}
this.value_input = [];
var value_cell_1 = this.qb._createContainer();
value_cell_1.set('className', this.qb.getClassName('value'));
value_cell_1.set('innerHTML', this._valueInput(this.valueName(query_index,0), var_config.validation));
this.value_input[0] = value_cell_1.one('input');
this.value_input[0].set('value', value[1]); // avoid formatting
this._createDatePicker(0)
var value_cell_2 = this.qb._createContainer();
value_cell_2.set('className', this.qb.getClassName('value'));
value_cell_2.set('innerHTML', this._valueInput(this.valueName(query_index,1), var_config.validation));
this.value_input[1] = value_cell_2.one('input');
this.value_input[1].set('value', value[1]); // avoid formatting
this._createDatePicker(1)
if(!isMultipleValue){
value_cell_2.setStyle("display","none");
this.hasMultipleSelection=false;
}
var self = this;
this.op_menu.on('change', function()
{
var operationSelected=this.get("value");
for(i=0;i<op_list.length;i++)
{
if(operationSelected===op_list[i].value)
{
if(op_list[i].multipleValue)
{
value_cell_2.setStyle("display","block");
self.hasMultipleSelection=true;
}
else
{
value_cell_2.setStyle("display","none");
self.hasMultipleSelection=false;
}
}
}
});
return [ op_cell, value_cell_1, value_cell_2 ];
},
postCreate: function(
/* int */ query_index,
/* object */ var_config,
/* array */ op_list,
/* array */ value)
{
},
destroy: function()
{
this.op_menu = null;
for(i=0;i<this.value_input;i++){
this.value_input[i] = null;
}
},
updateName: function(
/* int */ new_index)
{
this.op_menu.setAttribute('name', this.operationName(new_index));
for(i=0;i<this.value_input;i++){
this.value_input[i].setAttribute('name', this.valueName(new_index,i));
}
},
set: function(
/* int */ query_index,
/* map */ data)
{
this.op_menu.set('value', data[ this.operationName(query_index) ]);
for(i=0;i<this.value_input;i++){
this.value_input[i].set('value', data[ this.valueName(query_index,1) ]);
}
},
toDatabaseQuery: function()
{
var values=[this.value_input[0].get('value')];
if(this.hasMultipleSelection){
values.push(this.value_input[1].get('value'));
}
return [ [ this.op_menu.get('value'), values ] ];
},
/* *********************************************************************
* Form element names.
*/
operationName: function(
/* int */ i)
{
return Y.Lang.sub(this.op_menu_name_pattern, {i:i});
},
valueName: function(
/* int */ i,
/* int */ j)
{
return Y.Lang.sub(this.val_input_name_pattern, {i:i,j:j});
},
//
// Markup
//
_operationsMenu: function(
/* string */ menu_name)
{
// This must use a select tag!
var markup = '<select name="{n}" class="{f} {c}" />';
return Y.Lang.sub(markup,
{
n: menu_name,
f: Y.FormManager.field_marker_class,
c: this.qb.getClassName('field')
});
},
_valueInput: function(
/* string */ input_name,
/* string */ validation_class)
{
// This must use an input tag!
var markup = '<input type="text" name="{n}" class="yiv-required {f} {c}"/>';
return Y.Lang.sub(markup,
{
n: input_name,
f: Y.FormManager.field_marker_class,
c: validation_class + ' ' + this.qb.getClassName('field')
});
},
_createDatePicker:function(
/* int */index)
{
var WidgetPositionAlign = Y.WidgetPositionAlign;
var dtdate = Y.DataType.Date;
this.qb.datePicker = this.qb.datePicker || [];
this.qb.dt_input = this.qb.dt_input || [];
/* We don't need multiple instance of calendar for each criterion row
* */
if(!this.qb.datePicker[index])
{
var WIDTH = "150px";
var HEIGHT = "150px"
var overlay = new Y.Overlay({
height:HEIGHT,
width:WIDTH,
visible:false
});
overlay.render("#workspace");
overlay.get("boundingBox").addClass("yui3-skin-sam");
overlay.plug(Y.Plugin.OverlayAutohide);
var calendar = new Y.Calendar({
height:HEIGHT,
width:WIDTH,
visible:true,
showPrevMonth: true,
showNextMonth: true
}).render();
overlay.set("bodyContent",calendar.get("boundingBox"));
this.qb.datePicker[index]={overlay:overlay,calendar:calendar};
}
this.value_input[index].on("click",function(e){
var overlay = this.qb.datePicker[index].overlay;
overlay.show();
overlay.set("align", {node:this.value_input[index], points:[WidgetPositionAlign.TC, WidgetPositionAlign.RC]});
this.qb.dt_input[index] = this.value_input[index];
},this);
this.qb.datePicker[index].calendar.on("selectionChange", function (ev) {
var newDate = ev.newSelection[0];
this.qb.dt_input[index].set("value",dtdate.format(newDate,{format:"%m/%d/%Y"}));
this.qb.datePicker[index].overlay.hide();
},this);
}
};
Y.QueryBuilder.plugin_mapping.calendar=Y.QueryBuilder.Calendar;