// Copyright (c) 2005-2007 Cran Consulting, S.L. All rights reserved.
Function.prototype.method=function(name, f) {
this.prototype[name]=f;
}
Function.method("inherit", function(parent) {
this.prototype=new parent();
this.prototype.constructor=this;
});
Function.method("defaultMethod", function(name, first, second) {
if (first===undefined) {
this.method(name, second);
} else if (first!=null) {
this.method(name, first);
}
});
Function.method("getterName", function(propertyName) {
return propertyName;
});
Function.method("setterName", function(propertyName) {
return "set"+propertyName.substr(0, 1).toUpperCase()+propertyName.substr(1);
});
Function.method("property", function(name, setter, getter) {
var memberName="this._"+name;
this.defaultMethod(
this.setterName(name), setter, Function(name, memberName+"="+name+";")
);
this.defaultMethod(
this.getterName(name), getter, Function("return "+memberName+";")
);
});
Function.method("initializer", function() {
var n;
var f;
if (arguments.length<=1) {
n="make";
f=arguments[0];
} else if (arguments.length>1) {
n=arguments[0];
f=arguments[1];
}
this.defaultMethod(n, f, function() {});
var c=this;
this[n]=function() {
var self=new c();
if (self[n]!=null) {
self[n].apply(self, arguments);
}
return self;
}
});
function Set() {}
Set.initializer(function() {
this._items=new Object();
});
Set.method("put", function(item) {
this._items[item]=true;
});
Set.method("has", function(item) {
return this._items[item]==true;
});
Set.method("remove", function(item) {
delete this._items[item];
});
Set.method("putAll", function(other) {
for (var key in other._items) {
this._items[key]=true;
}
});
Set.method("removeAll", function(other) {
for (var key in other._items) {
delete this._items[key];
}
});
Set.method("retainOnly", function(other) {
for (var key in this._items) {
if (other._items[key]===undefined) {
delete this._items[key];
}
}
});
Set.method("empty", function() {
for (var key in this._items) {
return false;
}
return true;
});
Set.method("items", function() {
var result=new Array();
for (var key in this._items) {
result.push(key);
}
return result;
});
Set.method("detect", function(p) {
for (var key in this._items) {
if (p(key)) {
return key;
}
}
return null;
});
Set.method("toString", function() {
return "{"+this.items().join(", ")+"}";
});
function Column() {}
Column.initializer(function(name) {
this.setName(name);
this.setHiddenValue(null);
this.setValueExpression(null);
this._index=new Array();
this._checked=Set.make();
this._checkedArray=new Array();
});
Column.property("name");
Column.property("hiddenValue");
Column.property("valueExpression");
Column.method("put", function(value, row) {
if (this._index[value]===undefined) {
this._index[value]=Set.make();
}
this._index[value].put(row);
});
Column.method("honorValueExpression", function() {
if (this._checkedArray.length==0 && this._valueExpression!=null) {
var values=this.values();
for (var i=0; i<values.length; i++) {
this._checked.put(values[i]);
}
this._checkedArray=this._checked.items();
}
});
Column.method("change", function(value, checked) {
var rows=this._index[value];
if (rows==null) {
throw new Error("The value '"+value+"' is not in this column");
}
if (checked) {
this._checked.put(value);
} else {
this._checked.remove(value);
}
this._checkedArray=this._checked.items();
this.honorValueExpression();
});
Column.method("checkOne", function(value) {
if (value=='') {
this._checked=Set.make();
this._checkedArray=this._checked.items();
} else {
var rows=this._index[value];
if (rows==null) {
throw new Error("The value '"+value+"' is not in this column");
}
this._checked=Set.make();
this._checked.put(value);
this._checkedArray=this._checked.items();
}
this.honorValueExpression();
});
Column.method("checkFirst", function() {
this.checkOne(this.values()[0]);
});
Column.method("checkAll", function() {
this._checked=Set.make();
for (var value in this._index) {
this._checked.put(value);
}
this._checkedArray=this._checked.items();
this.honorValueExpression();
});
Column.method("uncheckAll", function(bare) {
this._checked=Set.make();
this._checkedArray=this._checked.items();
if (!bare) {
this.honorValueExpression();
}
});
Column.method("valueRows", function(value) {
var rows=this._index[value];
if (rows==null) {
throw new Error("The value '"+value+"' is not in this column");
} else {
return rows;
}
});
Column.method("values", function() {
var result=new Array();
var re=this._valueExpression;
for (var value in this._index) {
if (value!=this.hiddenValue() && (re==null || re.test(value))) {
result.push(value);
}
}
if ("".localeCompare==null) {
result.sort();
} else {
result.sort(function(a, b) { return a.localeCompare(b); });
}
return result;
});
Column.method("checked", function(value) {
return this._checked.has(value);
});
Column.method("checkedValues", function() {
return this._checked.items();
});
Column.method("hasCheckedValues", function() {
return this._checkedArray.length>0;
});
Column.method("hasRow", function(row) {
if (this.hasCheckedValues()) {
return this.hasRowConsideringChecked(row);
} else {
return true;
}
});
Column.method("hasRowConsideringChecked", function(row) {
var checkedArray=this._checkedArray;
var index=this._index;
for (var i=0; i<checkedArray.length; i++) {
var value=checkedArray[i];
if (index[value]._items[row]) {
return true;
}
}
return false;
});
function Table() {}
Table.initializer(function() {
this._columns=new Array(arguments.length);
for (var i=0; i<arguments.length; i++) {
this._columns[i]=Column.make(arguments[i]);
}
this._nextRow=0;
this._checkedColumns=new Array();
this._previous=null;
this._timeOutId=null;
this.setDictionary({});
this.setCheckOnKeyUp(true);
this.setOnChangeHook(null);
});
Table.property("dictionary");
Table.property("checkOnKeyUp");
Table.property("onChangeHook");
Table.method("translate", function(text) {
var result=this.dictionary()[text.toLowerCase()];
if (result==null) {
result=text;
}
return result;
});
Table.method("put", function() {
if (arguments.length!=this._columns.length) {
throw new Error("Invalid row length");
}
for (var i=0; i<arguments.length; i++) {
this._columns[i].put(arguments[i], this._nextRow);
}
this._nextRow++;
});
Table.method("compressedPut", function() {
var nargs=arguments.length;
var ncols=this._columns.length;
if ((nargs>ncols) || (nargs<ncols && this._previous==null)) {
throw new Error("Invalid row length");
}
if (this._previous==null) {
this._previous=new Array(ncols);
}
for (var i=0; i<nargs; i++) {
this._previous[ncols-nargs+i]=this.symbol(arguments[i]);
}
Table.prototype.put.apply(this, this._previous);
});
Table.method("change", function(i, value, checked) {
this._columns[i].change(value, checked);
this.refresh(i);
});
Table.method("checkFirst", function(i) {
this._columns[i].checkFirst();
this.refresh(i);
});
Table.method("checkOne", function(i, value) {
this._columns[i].checkOne(value);
this.refresh(i);
});
Table.method("checkAll", function() {
for (var i=0; i<this._columns.length; i++) {
this._columns[i].checkAll();
}
this.refresh(this._column.length);
});
Table.method("checkMany", function(i, values) {
this._columns[i].uncheckAll(true);
for (var j=0; j<values.length; j++) {
this._columns[i].change(values[j], true);
}
this.refresh(i);
});
Table.method("checkFound", function(i) {
var column=this._columns[i];
var values=column.values();
var text=this.removeAccents(this.columnText(i).toLowerCase())
var anchored=this.columnTextIsAnchored(i);
column.uncheckAll();
if (text!="" && this.checkOnKeyUp()) {
for (var j=0; j<values.length; j++) {
var value=values[j];
var translation=this.translate(value);
var position=(
this.removeAccents(translation.toLowerCase()).indexOf(text)
);
var found=(anchored&&position==0)||(!anchored&&position!=-1);
if (found) {
column.change(value, true);
}
}
}
var self=this;
if (this._timeOutId!=null) {
window.clearTimeout(this._timeOutId);
this._timeOutId=null;
}
this._timeOutId=window.setTimeout(function() { self.refresh(i); }, 250);
});
Table.method("uncheckAll", function() {
for (var i=0; i<this._columns.length; i++) {
this._columns[i].uncheckAll();
}
this.refresh(this._columns.length);
});
Table.method("refresh", function(i) {
if (this._timeOutId!=null) {
window.clearTimeout(this._timeOutId);
this._timeOutId=null;
}
if (i==null) {
i=this._columns.length;
}
for (var j=0; j<this._columns.length; j++) {
this.calculateCheckedColumns();
this.refreshColumn((i+j+1)%this._columns.length);
}
for (var j=0; j<this._columns.length; j++) {
this.calculateCheckedColumns();
this.refreshColumn((i+j+1)%this._columns.length);
}
});
Table.method("refreshColumn", function(i) {
this.clearColumnDiv(i);
this.fillColumnDiv(i);
this.clearColumnSelect(i);
this.fillColumnSelect(i);
this.fillColumnSimpleSelects(i);
});
Table.method("clearColumnDiv", function(i) {
var div=this.columnDiv(i);
if (div!=null) {
div.innerHTML="";
}
});
Table.method("clearColumnSelect", function(i) {
var select=this.columnSelect(i);
if (select!=null) {
select.options.length=0;
}
});
Table.method("clearColumnSimpleSelects", function(i) {
for (var j=0; j<9; j++) {
this.clearColumnSimpleSelect(i, j, true);
this.clearColumnSimpleSelect(i, j, false);
}
});
Table.method("clearColumnSimpleSelect", function(i, j, start) {
var select=this.columnSimpleSelect(i, j, start);
if (select!=null) {
select.options.length=0;
}
});
Table.method("fillColumnDiv", function(i) {
var div=this.columnDiv(i);
var text=this.columnText(i);
var cleanText=this.removeAccents(text.toLowerCase())
var anchored=this.columnTextIsAnchored(i);
if (div!=null) {
var column=this._columns[i];
var values=column.values();
for (var j=0; j<values.length; j++) {
var value=values[j];
var translation=this.translate(value);
var line=document.createElement("div");
var position=this.removeAccents(translation.toLowerCase()).indexOf(
cleanText
);
var hidden=(anchored&&position!=0)||(!anchored&&position==-1);
var valid=true;
if (hidden) {
column.change(value, false);
} else {
valid=this.valid(i, value);
if (!valid) {
column.change(value, false);
}
}
var checked=column.checked(value);
line.className=this.className(valid, checked, hidden);
var checkParagraph=document.createElement("p");
checkParagraph.className="pandora-parametric-value-check-paragraph";
var check=document.createElement("input");
check.className="pandora-parametric-value-check";
check.type="checkbox";
check.checked=checked;
check.defaultChecked=checked;
check.onclick=this.onChange(i, value, checked);
var textParagraph=document.createElement("p");
textParagraph.className="pandora-parametric-value-text-paragraph";
var textNode=document.createTextNode(translation);
checkParagraph.appendChild(check);
textParagraph.appendChild(textNode);
line.appendChild(checkParagraph);
line.appendChild(textParagraph);
div.appendChild(line);
}
}
});
Table.method("fillColumnSelect", function(i) {
var select=this.columnSelect(i);
if (select!=null) {
select.onchange=null;
select.options[select.options.length]=new Option("---", "");
var column=this._columns[i];
var values=column.values();
var selectedIndex=0;
var index=0;
for (var j=0; j<values.length; j++) {
var value=values[j];
if (this.valid(i, value)) {
select.options[select.options.length]=new Option(value, value);
index++;
if (column.checked(value)) {
selectedIndex=index;
}
}
}
select.selectedIndex=selectedIndex;
var self=this;
select.onchange=function() {
var value=select.options[select.selectedIndex].value;
self.checkOne(i, value);
}
}
});
Table.method("fillColumnSimpleSelects", function(i) {
for (var j=0; j<9; j++) {
this.fillColumnSimpleSelect(i, j, true);
this.fillColumnSimpleSelect(i, j, false);
}
});
Table.method("fillColumnSimpleSelect", function(i, j, start) {
var select=this.columnSimpleSelect(i, j, start);
if (select!=null) {
var column=this._columns[i];
var values=column.values();
var index=0;
var newIndex=-1;
var old=null;
if (select.options.length>0 && select.selectedIndex>=0) {
old=select.options[select.selectedIndex].value;
}
select.options.length=0;
for (var j=0; j<values.length; j++) {
var value=values[j];
if (this.valid(i, value)) {
select.options[select.options.length]=new Option(value, value);
if (
(old!=null) && (
(start && value<=old) ||
(!start && newIndex==-1 && value>=old)
)
) {
newIndex=index;
}
index++;
}
}
if (old==null) {
select.selectedIndex=start?0:select.options.length-1;
} else {
select.selectedIndex=newIndex;
}
}
});
Table.method("onChange", function(i, value, checked) {
var self=this;
return function() {
self.change(i, value, !checked);
var f=self.onChangeHook();
if (f!=null) {
f();
}
};
});
Table.method("columnDiv", function(i) {
return document.getElementById("parametric_field_"+i);
});
Table.method("columnTextInput", function(i) {
var element=document.getElementById("parametric_text_"+i);
if (element==null) {
element=document.getElementById("parametric_anchored_text_"+i);
}
return element;
});
Table.method("columnText", function(i) {
var input=this.columnTextInput(i);
if (input==null) {
return "";
} else {
return input.value;
}
});
Table.method("columnTextIsAnchored", function(i) {
return (
document.getElementById("parametric_text_"+i)==null &&
document.getElementById("parametric_anchored_text_"+i)!=null
);
});
Table.method("removeAccents", function(text) {
var result=text;
result=result.replace(/[áàäâã]/g, "a");
result=result.replace(/[éèëê]/g, "e");
result=result.replace(/[íìïî]/g, "i");
result=result.replace(/[óòöôõ]/g, "o");
result=result.replace(/[úùüû]/g, "u");
result=result.replace(/[ç]/g, "c");
return result;
});
Table.method("columnSelect", function(i) {
return document.getElementById("parametric_select_"+i);
});
Table.method("columnSimpleSelect", function(i, j, start) {
var adj=start?"start":"end";
return document.getElementById("parametric_"+adj+"_select_"+i+"_"+j);
});
Table.method("className", function(valid, checked, hidden) {
var result="pandora-parametric-value";
result+=(valid?"-valid":"-invalid");
result+=(checked?"-checked":"");
result+=(hidden?"-hidden":"");
return result;
});
Table.method("calculateCheckedColumns", function() {
this._checkedColumns=new Array();
for (var j=0; j<this._columns.length; j++) {
var column=this._columns[j];
if (column.hasCheckedValues()) {
this._checkedColumns.push(column);
}
}
});
Table.method("hasRow", function(row, column) {
for (var j=0; j<this._checkedColumns.length; j++) {
var checkedColumn=this._checkedColumns[j];
if (
checkedColumn!=column &&
!checkedColumn.hasRowConsideringChecked(row)
) {
return false;
}
}
return true;
});
Table.method("valid", function(i, value) {
var self=this;
var column=this._columns[i];
var rows=column.valueRows(value);
var checkedColumns=this._checkedColumns;
rowloop: for (var row in rows._items) {
columnloop: for (var j=0; j<checkedColumns.length; j++) {
var checkedColumn=checkedColumns[j];
if (checkedColumn!=column) {
var checkedArray=checkedColumn._checkedArray;
var index=checkedColumn._index;
for (var k=0; k<checkedArray.length; k++) {
if (index[checkedArray[k]]._items[row]) {
continue columnloop;
}
}
continue rowloop;
}
}
return true;
}
return false;
});
Table.method("columnQuery", function(i) {
var column=this._columns[i];
var checked=column.checkedValues();
var valid=new Array();
for (var j=0; j<checked.length; j++) {
if (this.valid(i, checked[j])) {
valid.push(checked[j]);
}
}
for (var j=0; j<valid.length; j++) {
valid[j]='"'+valid[j]+'"';
}
var factor=valid.join(" || ");
if (factor=="") {
return "";
} else {
return column.name()+":("+factor+")"
}
});
Table.method("query", function() {
var factors=new Array();
for (var i=0; i<this._columns.length; i++) {
var factor=this.columnQuery(i);
if (factor!="") {
factors.push(factor);
}
}
return factors.join(" AND ");
});
Table.method("columnQuerySummary", function(i, label) {
var factors=new Array();
var column=this._columns[i];
var checked=column.checkedValues();
var valid=new Array();
for (var j=0; j<checked.length; j++) {
if (this.valid(i, checked[j])) {
valid.push(checked[j]);
}
}
for (var j=0; j<valid.length; j++) {
valid[j]='"'+valid[j]+'"';
}
var factor=valid.join(", ");
if (factor!="") {
if (label==null) {
label=column.name();
}
return label+" "+factor;
} else {
return "";
}
});
Table.method("querySummary", function() {
var factors=new Array();
for (var i=0; i<this._columns.length; i++) {
var factor=this.columnQuerySummary(i, arguments[i]);
if (factor!="") {
factors.push(factor);
}
}
return factors.join(". ");
});
Table.method("values", function(i) {
return this._columns[i].values();
});
Table.method("checkedValues", function(i) {
return this._columns[i].checkedValues();
});
Table.method("fillSelect", function(i, select) {
select.options.length=0;
var values=this.values(i);
for (var j=0; j<values.length; j++) {
var value=values[j];
select.options[select.options.length]=new Option(value, value);
}
});
Table.method("setUpColumnTextInputs", function() {
for (var i=0; i<this._columns.length; i++) {
this.setUpColumnTextInput(i);
}
});
Table.method("setUpColumnTextInput", function(i) {
var self=this;
var input=this.columnTextInput(i);
if (input!=null) {
input.onkeyup=function() { self.checkFound(i); }
}
});
Table.method("setHiddenValue", function(i, value) {
this._columns[i].setHiddenValue(value);
});
Table.method("setValueExpression", function(i, expression) {
this._columns[i].setValueExpression(expression);
});

