Your IP : 216.73.216.136


Current Path : /home/zqegovsj/www/us3web.haibo.com.cn/biguo/image/js/js/js/
Upload File :
Current File : /home/zqegovsj/www/us3web.haibo.com.cn/biguo/image/js/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
});