| Current Path : /home/zqegovsj/www/us3web.haibo.net/a_web_bak/image/js/js/ |
| Current File : /home/zqegovsj/www/us3web.haibo.net/a_web_bak/image/js/js/keyword.js |
/**
* @author baojun
*
*/
(function($){
$.fn.keyword = function(options){
var defaults = {
max: 20,
tableId: "#wordTable",
addId: "#addMore",
suggestId: "#suggest",
suggestTab: "#suggestTab",
tipId: "wordTip",
tooLongErrMsg: "An keyword should be within 40 characters.",
maxAddErrMsg: "You have reached the keyword maximum number.",
keywordName: "prodKeyword",
globeSuggestUrl: "/product.do?xcase=suggest"
};
var o = $.extend(defaults, options);
$(o.addId).click(function(){
addKeywordColumn();
});
if ($(o.tableId).find('input').size() >= o.max) {
$(o.addId).hide();
}
$(o.suggestId).click(function(){
$(this).parent('div').attr('class', 'suggestdivBoxH');
$(this).prev('a').show();
getSuggestWords();
});
$(o.suggestId).prev('a').click(function(){
$(this).parent('div').attr('class', 'suggestdivBox');
$(o.suggestTab).prevAll('ul').hide();
$(o.suggestTab).hide();
$(this).hide();
});
$('form').find(':input[class!=full]').focus(function(){
if ($(o.suggestId).parent('div').attr('class') == 'suggestdivBoxH') {
$(o.suggestId).prev('a').click();
}
});
registerRemoveHandle();
$.ajaxSetup({
dataType: "json",
cache: false,
error: function(xhr){
alert("Server busy,please try later");
}
});
/*
* $(o.tableId).tableDnD({ onDragClass: "draging" });
*/
/*
* $(o.tableId).parent('div').mouseout(function(){ $(this).find('tr
* a').hide(); console.info($(this).find('tr a').size()); });
*/
function addKeywordColumn(){
var altName = $(o.tableId).find('img:first').attr('alt') || 'close';
if ($(o.tableId).find('tr:first a').size() == 0) {
$(o.tableId).find('tr:first td:last').html('<a href="javascript:void(0)"><img alt="' + altName + '" src="../../haibo/en/images/close_r.gif"/></a>');
$(o.tableId).find('tr:first a').click(function(){
removeWordText($(this))
});
}
if ($(o.tableId).find('input').size() < o.max) {
var nextNo = $(o.tableId).find('input').size() + 1;
if (nextNo == o.max) {
$(o.addId).hide();
}
$(o.tableId).find('tr:last').after(' <tr><td><input maxlength="40" class="full" type="text" name=' +
o.keywordName+'['+nextNo+']/></td><td><a href="javascript:void(0)"><img alt="' +
altName +
'" src="../../haibo/en/images/close_s.gif"/></a></td></tr>');
/*
* $(o.tableId).tableDnD({ onDragClass: "draging" });
*/
$(o.tableId).find('tr:last input').attr({
id: o.keywordName + nextNo
}).focus();
$(o.tableId).find('tr:last a').click(function(){
removeWordText($(this));
});
registerRemoveHandle();
$(o.tableId).parent('div').attr('scrollTop', $(o.tableId).parent('div').offset().top);
addValidator($('#' + o.keywordName + nextNo));
}
else {
alert(o.maxAddErrMsg);
$(o.addId).hide();
}
}
$(o.tableId).find('a').click(function(){
removeWordText($(this));
});
function registerRemoveHandle(){
$(o.tableId).find('tr').mouseover(function(){
$(this).find('a').show();
}).mouseout(function(){
$(this).find('a').hide();
}).find('a').hide().end().find('input').blur(function(){
$(this).val(jQuery.trim($(this).val()));
});
}
function removeWordText(target){
target.parents('tr:first').remove();
/*
* $(':input[class=full]').each(function(i){
* $(this).parent().prev('td').text(i + 1); });
*/
if ($(':input[class=full]').size() == 1) {
$(o.tableId + ' a').remove();
}
/*
* $(o.tableId).tableDnD({ onDragClass: "draging" });
*/
$(o.addId).show();
}
function addValidator(obj){
$(obj).formValidator({
tipid: o.tipId,
onempty: " ",
oncorrect: " "
}).FunctionValidator({
fun: checkkeyWord
}).InputValidator({
max: 40,
onerror: o.tooLongErrMsg
});
}
function getIndexOfArray(array_obj, data){
for (var i = 0; i < array_obj.length; i++) {
if (array_obj[i] == data) {
return i;
}
}
return -1;
}
function getSuggestWords(){
$(o.suggestTab).find('tr:not(:first)').remove().end().show();
var notEmptyCount = $(o.tableId).find('input').filter(function(index){
return $.trim($(this).val()).length != 0;
}).size();
if (notEmptyCount == 0) {
$(o.suggestTab).prevAll('ul').hide().filter(':last').show();
$(o.tableId).find('tr input[value=""]:first').focus();
return;
}
else {
var count = 0;
var word = $(o.tableId).find("input").filter(function(index){
if (count == 3 || $.trim($(this).val()).length == 0) {
return false;
}
else {
count++;
return true;
}
}).serialize();
$.get(o.customUrl || o.globeSuggestUrl, word, function(data){
if (data.length == 0) {
$(o.suggestTab).prevAll('ul').hide().filter(':first').show();
return;
}
$(o.suggestTab).prevAll('ul').hide();
var textArray = $(o.tableId).find("input").filter(function(index){
return $.trim($(this).val()).length != 0;
});
var wordArray = jQuery.makeArray(textArray.map(function(){
return jQuery.trim($(this).attr('value'));
}));
for (var i = 0; i < data.length; i++) {
if (getIndexOfArray(wordArray, data[i]) == -1) {
$(o.suggestTab).find('tr:last').after('<tr><td><button type="button"></button></td><td>' +
data[i] +
'</tr>');
}
}
$(o.suggestTab).find('tr button').click(function(){
if ($(o.tableId).find('input').size() < o.max &&
$(o.tableId).find("input").filter(function(index){
return $.trim($(this).val()).length == 0;
}).size() ==
0) {
addKeywordColumn();
}
var taget = $(this).parent().parent();
$(o.tableId).find('tr input').each(function(i, n){
if ($(n).val().length == 0) {
$(n).val(taget.find('td:last').text()).focus();
taget.unbind().remove();
return false;
}
if (i == o.max - 1) {
alert(o.maxAddErrMsg);
}
});
});
});
}
}
}
})(jQuery);
jQuery.tableDnD = {
currentTable: null,
dragObject: null,
mouseOffset: null,
oldY: 0,
build: function(options){
this.each(function(){
this.tableDnDConfig = jQuery.extend({
onDragStyle: null,
onDropStyle: null,
onDragClass: "tDnD_whileDrag",
onDrop: null,
onDragStart: null,
scrollAmount: 20,
onAllowDrop: function(draggedRow, row){
var dragContainer = jQuery(jQuery.tableDnD.currentTable).parent('div');
var divTop = dragContainer.attr('scrollTop');
if ($(draggedRow).offset().top >
dragContainer.offset().top +
150) {
dragContainer.attr('scrollTop', divTop + 10);
}
else {
if ($(draggedRow).offset().top <
dragContainer.offset().top +
50) {
dragContainer.attr('scrollTop', divTop - 10);
}
}
return true;
},
serializeRegexp: /[^\-]*$/,
serializeParamName: null,
dragHandle: null
}, options ||
{});
jQuery.tableDnD.makeDraggable(this);
});
jQuery(document).bind('mousemove', jQuery.tableDnD.mousemove).bind('mouseup', jQuery.tableDnD.mouseup);
return this;
},
makeDraggable: function(table){
var config = table.tableDnDConfig;
if (table.tableDnDConfig.dragHandle) {
var cells = jQuery("td." + table.tableDnDConfig.dragHandle, table);
cells.each(function(){
jQuery(this).mousedown(function(ev){
jQuery.tableDnD.dragObject = this.parentNode;
jQuery.tableDnD.currentTable = table;
jQuery.tableDnD.mouseOffset = jQuery.tableDnD.getMouseOffset(this, ev);
if (config.onDragStart) {
config.onDragStart(table, this);
}
return false;
});
})
}
else {
var rows = jQuery("tr", table);
rows.each(function(){
var row = jQuery(this);
if (!row.hasClass("nodrag")) {
row.mousedown(function(ev){
if (ev.target.tagName == "TD") {
jQuery.tableDnD.dragObject = this;
jQuery.tableDnD.currentTable = table;
jQuery.tableDnD.mouseOffset = jQuery.tableDnD.getMouseOffset(this, ev);
if (config.onDragStart) {
config.onDragStart(table, this);
}
return false;
}
}).css("cursor", "row-resize");
}
});
}
},
updateTables: function(){
this.each(function(){
if (this.tableDnDConfig) {
jQuery.tableDnD.makeDraggable(this);
}
})
},
mouseCoords: function(ev){
if (ev.pageX || ev.pageY) {
return {
x: ev.pageX,
y: ev.pageY
};
}
return {
x: ev.clientX + document.body.scrollLeft -
document.body.clientLeft,
y: ev.clientY + document.body.scrollTop - document.body.clientTop
};
},
getMouseOffset: function(target, ev){
ev = ev || window.event;
var docPos = this.getPosition(target);
var mousePos = this.mouseCoords(ev);
return {
x: mousePos.x - docPos.x,
y: mousePos.y - docPos.y
};
},
getPosition: function(e){
var left = 0;
var top = 0;
if (e.offsetHeight == 0) {
e = e.firstChild;
}
while (e.offsetParent) {
left += e.offsetLeft;
top += e.offsetTop;
e = e.offsetParent;
}
left += e.offsetLeft;
top += e.offsetTop;
return {
x: left,
y: top
};
},
mousemove: function(ev){
if (jQuery.tableDnD.dragObject == null) {
return;
}
var dragObj = jQuery(jQuery.tableDnD.dragObject);
var config = jQuery.tableDnD.currentTable.tableDnDConfig;
var mousePos = jQuery.tableDnD.mouseCoords(ev);
var y = mousePos.y - jQuery.tableDnD.mouseOffset.y;
var yOffset = window.pageYOffset;
if (document.all) {
if (typeof document.compatMode != 'undefined' &&
document.compatMode != 'BackCompat') {
yOffset = document.documentElement.scrollTop;
}
else
if (typeof document.body != 'undefined') {
yOffset = document.body.scrollTop;
}
}
if (mousePos.y - yOffset < config.scrollAmount) {
window.scrollBy(0, -config.scrollAmount);
}
else {
var windowHeight = window.innerHeight ? window.innerHeight : document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.clientHeight;
if (windowHeight - (mousePos.y - yOffset) < config.scrollAmount) {
window.scrollBy(0, config.scrollAmount);
}
}
if (y != jQuery.tableDnD.oldY) {
var movingDown = y > jQuery.tableDnD.oldY;
jQuery.tableDnD.oldY = y;
if (config.onDragClass) {
dragObj.addClass(config.onDragClass);
}
else {
dragObj.css(config.onDragStyle);
}
var currentRow = jQuery.tableDnD.findDropTargetRow(dragObj, y);
if (currentRow) {
if (movingDown && jQuery.tableDnD.dragObject != currentRow) {
jQuery.tableDnD.dragObject.parentNode.insertBefore(jQuery.tableDnD.dragObject, currentRow.nextSibling);
}
else
if (!movingDown &&
jQuery.tableDnD.dragObject != currentRow) {
jQuery.tableDnD.dragObject.parentNode.insertBefore(jQuery.tableDnD.dragObject, currentRow);
}
}
}
return false;
},
findDropTargetRow: function(draggedRow, y){
var rows = jQuery.tableDnD.currentTable.rows;
for (var i = 0; i < rows.length; i++) {
var row = rows[i];
var rowY = this.getPosition(row).y;
var rowHeight = parseInt(row.offsetHeight) / 2;
if (row.offsetHeight == 0) {
rowY = this.getPosition(row.firstChild).y;
rowHeight = parseInt(row.firstChild.offsetHeight) / 2;
}
if ((y > rowY - rowHeight) && (y < (rowY + rowHeight))) {
if (row == draggedRow) {
return null;
}
var config = jQuery.tableDnD.currentTable.tableDnDConfig;
if (config.onAllowDrop) {
if (config.onAllowDrop(draggedRow, row)) {
return row;
}
else {
return null;
}
}
else {
var nodrop = jQuery(row).hasClass("nodrop");
if (!nodrop) {
return row;
}
else {
return null;
}
}
return row;
}
}
return null;
},
mouseup: function(e){
if (jQuery.tableDnD.currentTable && jQuery.tableDnD.dragObject) {
var droppedRow = jQuery.tableDnD.dragObject;
var config = jQuery.tableDnD.currentTable.tableDnDConfig;
if (config.onDragClass) {
jQuery(droppedRow).removeClass(config.onDragClass);
}
else {
jQuery(droppedRow).css(config.onDropStyle);
}
jQuery.tableDnD.dragObject = null;
jQuery.tableDnD.sortkeywordIndex(jQuery.tableDnD.currentTable);
if (config.onDrop) {
config.onDrop(jQuery.tableDnD.currentTable, droppedRow);
}
jQuery.tableDnD.currentTable = null;
}
},
serialize: function(){
if (jQuery.tableDnD.currentTable) {
return jQuery.tableDnD.serializeTable(jQuery.tableDnD.currentTable);
}
else {
return "Error: No Table id set, you need to set an id on your table and every row";
}
},
sortkeywordIndex: function(currentTable){
/*
* $(currentTable).find('tr td:nth-child(1)').each(function(i, n){
* $(this).html(i + 1); });
*/
},
serializeTable: function(table){
var result = "";
var tableId = table.id;
var rows = table.rows;
for (var i = 0; i < rows.length; i++) {
if (result.length > 0)
result += "&";
var rowId = rows[i].id;
if (rowId && rowId && table.tableDnDConfig &&
table.tableDnDConfig.serializeRegexp) {
rowId = rowId.match(table.tableDnDConfig.serializeRegexp)[0];
}
result += tableId + '[]=' + rowId;
}
return result;
},
serializeTables: function(){
var result = "";
this.each(function(){
result += jQuery.tableDnD.serializeTable(this);
});
return result;
}
};
jQuery.fn.extend({
tableDnD: jQuery.tableDnD.build,
tableDnDUpdate: jQuery.tableDnD.updateTables,
tableDnDSerialize: jQuery.tableDnD.serializeTables
});