YAHOO.namespace("mirchee.tools");
YAHOO.mirchee.tools.DataVizEdit = function() {
    function displayRecords(o) {
        Dom.get('vizdata').innerHTML = '';
        var records = YAHOO.lang.JSON.parse(o.responseText);
        var fields = YAHOO.mirchee.tools.DataSearchBox.getFields();
        var numRecords = records.results.length;
        for (var i = 0; i < numRecords; i++) {
            displayOneRecord(records.results[i], fields);
        }
        if (numRecords == 0) {
            //Dom.get('vizdata').appendChild("<span>No records found.</span>");
        }
        YAHOO.mirchee.tools.WaitDialog.hide();
    }
    
    
    function displayOneRecord(record, fields) {
    
        var n = Dom.get('record').cloneNode(true);
        n.id = '';
        var uinode = new YAHOO.util.Element(n);
        var save = new YAHOO.widget.Button(uinode.getElementsByClassName('save')[0]);
        Dom.addClass(save, 'save');
        save.on('click', function(e) {
            var data = {"_oData":record};
            var saveList = {};
            var key = "UPDATE_" + record.url;
            saveList[key] = data;
            var s = YAHOO.lang.JSON.stringify(saveList);
            var transaction = YAHOO.util.Connect.asyncRequest(
                            'POST',
                            'do_data_manage_action_ajax.do',
                            {success: function (o) {
                                    YAHOO.mirchee.tools.DataVizEdit.showSuccess('save successful');
                                    saveList = {};
                                    YAHOO.mirchee.tools.DataVizEdit.getData();
                                },
                             failure: function (o) {
                                    YAHOO.mirchee.tools.DataVizEdit.showError('save Failed');
                                    saveList = {};
                                },
                             scope:this
                            },
                            "action=" + encodeURIComponent(YAHOO.lang.JSON.stringify(saveList)) + "&" +
                            "o=" + Dom.get('o').value
                        );

        });
        var del = new YAHOO.widget.Button(uinode.getElementsByClassName('delete')[0]);
        Dom.addClass(del, 'delete');
        del.on('click', function(e) {
            if(confirm("Are You Sure You Want To Delete This Row?")) {
                var data = {"_oData":record};
                var saveList = {};
                var key = "DELETE_" + record.url;
                saveList[key] = data;
                var s = YAHOO.lang.JSON.stringify(saveList);
                var transaction = YAHOO.util.Connect.asyncRequest(
                            'POST',
                            'do_data_manage_action_ajax.do',
                            {success: function (o) {
                                    YAHOO.mirchee.tools.DataVizEdit.showSuccess('save successful');                                    
                                    saveList = {};
                                    YAHOO.mirchee.tools.DataVizEdit.getData();
                                },
                             failure: function (o) {
                                    YAHOO.mirchee.tools.DataVizEdit.showError('save failed');
                                },
                             scope:this
                            },
                            "action=" + encodeURIComponent(YAHOO.lang.JSON.stringify(saveList)) + "&" +
                            "o=" + Dom.get('o').value
                        );

            }
        });
        
        for (var i in record) {
            var field = fields[i];
            //older objects might not have all the fields
            if (YAHOO.lang.isUndefined(field)) {
                field = {field:{primitiveType:'TEXT', name:i}};
            }
            var primType = field.field.primitiveType;
            if (primType === 'TEXT' || primType === 'TEXT_LINK') {
                n.appendChild(YAHOO.mirchee.tools.DataVizEdit.renderText(field, record, false));
            } else 
            if (primType === 'LONG_TEXT') {
                n.appendChild(YAHOO.mirchee.tools.DataVizEdit.renderLongText(field, record, false));
            } else
            if (primType === 'IMAGE' || primType === 'IMAGE_LINK') {
                n.appendChild(YAHOO.mirchee.tools.DataVizEdit.renderImage(field, record, false));
            } else 
            if (primType === 'DATE') {
                n.appendChild(YAHOO.mirchee.tools.DataVizEdit.renderDate(field, record, false));
            } else
            if (primType === 'URL') {
                n.appendChild(YAHOO.mirchee.tools.DataVizEdit.renderUrl(field, record, false));
            } else
            if (primType === 'FLASH_TAG') {
                n.appendChild(YAHOO.mirchee.tools.DataVizEdit.renderLongText(field, record, false));
            }           
        }
        Dom.get('vizdata').appendChild(n);
    }
    
    return {
        renderText : function (field, record, newRecord) {
            var name = field.field.name;
            var description = field.field.description;
            if (YAHOO.lang.isUndefined(description) || YAHOO.lang.trim(description) === '') {
                description = name;
            } 
            var node = Dom.get('text').cloneNode(true);
            node.id = '';
            var uinode = new YAHOO.util.Element(node);
            uinode.getElementsByClassName('text_value')[0].innerHTML = record[name];
            uinode.getElementsByClassName('text')[0].value = record[name];
            uinode.getElementsByClassName('label')[0].innerHTML = description;
            
            if (newRecord) {
                Dom.removeClass(uinode.getElementsByClassName('text')[0], 'hidden');
                Dom.addClass(uinode.getElementsByClassName('text_edit')[0], 'hidden');
                return node;
            }
            if (field.field.editable) {
                var edit = new YAHOO.widget.Button(uinode.getElementsByClassName('text_edit')[0]);
                Dom.addClass(edit, 'text_edit');
                var save = new YAHOO.widget.Button(uinode.getElementsByClassName('text_save')[0]);
                Dom.addClass(save, 'text_save');
                Dom.addClass(save, 'hidden');
                var cancel = new YAHOO.widget.Button(uinode.getElementsByClassName('text_cancel')[0]);
                Dom.addClass(cancel, 'text_cancel');
                Dom.addClass(cancel, 'hidden');
                edit.on('click', function(e) {
                    //Transfer value from span to input
                    uinode.getElementsByClassName('text')[0].value = uinode.getElementsByClassName('text_value')[0].innerHTML;
                    Dom.addClass(uinode.getElementsByClassName('text_value')[0], 'hidden');
                    Dom.addClass(uinode.getElementsByClassName('text_edit')[0], 'hidden');
                    Dom.removeClass(uinode.getElementsByClassName('text')[0], 'hidden');
                    Dom.removeClass(uinode.getElementsByClassName('text_save')[0], 'hidden');
                    Dom.removeClass(uinode.getElementsByClassName('text_cancel')[0], 'hidden');
                });
                
                save.on('click', function(e) {
                    //Transfer value from span to input
                    uinode.getElementsByClassName('text_value')[0].innerHTML = uinode.getElementsByClassName('text')[0].value;
                    record[name] = uinode.getElementsByClassName('text')[0].value;
                    Dom.removeClass(uinode.getElementsByClassName('text_value')[0], 'hidden');
                    Dom.removeClass(uinode.getElementsByClassName('text_edit')[0], 'hidden');
                    Dom.addClass(uinode.getElementsByClassName('text')[0], 'hidden');
                    Dom.addClass(uinode.getElementsByClassName('text_save')[0], 'hidden');
                    Dom.addClass(uinode.getElementsByClassName('text_cancel')[0], 'hidden');
                });
                
                cancel.on('click', function(e) {
                    Dom.removeClass(uinode.getElementsByClassName('text_value')[0], 'hidden');
                    Dom.removeClass(uinode.getElementsByClassName('text_edit')[0], 'hidden');
                    Dom.addClass(uinode.getElementsByClassName('text')[0], 'hidden');
                    Dom.addClass(uinode.getElementsByClassName('text_save')[0], 'hidden');
                    Dom.addClass(uinode.getElementsByClassName('text_cancel')[0], 'hidden');
                });
            } else {
                Dom.addClass(uinode.getElementsByClassName('text_edit')[0], 'hidden');
            }
            return node;
        },
            
        renderLongText : function(field, record, newRecord) {
            var name = field.field.name;
            var description = field.field.description;
            if (YAHOO.lang.isUndefined(description) || YAHOO.lang.trim(description) === '') {
                description = name;
            } 
            var node = Dom.get('longtext').cloneNode(true);
            node.id = '';
            var uinode = new YAHOO.util.Element(node);
            uinode.getElementsByClassName('longtext_value')[0].innerHTML = record[name];
            uinode.getElementsByClassName('longtext')[0].value = record[name];
            uinode.getElementsByClassName('label')[0].innerHTML = description;
            
            if (newRecord) {
                Dom.removeClass(uinode.getElementsByClassName('longtext')[0], 'hidden');
                Dom.addClass(uinode.getElementsByClassName('longtext_edit')[0], 'hidden');
                return node;
            }
            
            if (field.field.editable) {
                var edit = new YAHOO.widget.Button(uinode.getElementsByClassName('longtext_edit')[0]);
                Dom.addClass(edit, 'longtext_edit');
                var save = new YAHOO.widget.Button(uinode.getElementsByClassName('longtext_save')[0]);
                Dom.addClass(save, 'longtext_save');
                Dom.addClass(save, 'hidden');
                var cancel = new YAHOO.widget.Button(uinode.getElementsByClassName('longtext_cancel')[0]);
                Dom.addClass(cancel, 'longtext_cancel');
                Dom.addClass(cancel, 'hidden');
            
                edit.on('click', function(e) {
                    uinode.getElementsByClassName('longtext')[0].value = uinode.getElementsByClassName('longtext_value')[0].innerHTML; 
                    Dom.addClass(uinode.getElementsByClassName('longtext_value')[0], 'hidden');
                    Dom.addClass(uinode.getElementsByClassName('longtext_edit')[0], 'hidden');
                    Dom.removeClass(uinode.getElementsByClassName('longtext')[0], 'hidden');
                    Dom.removeClass(uinode.getElementsByClassName('longtext_save')[0], 'hidden');
                    Dom.removeClass(uinode.getElementsByClassName('longtext_cancel')[0], 'hidden');
                });
                
                save.on('click', function(e) {
                    uinode.getElementsByClassName('longtext_value')[0].innerHTML = uinode.getElementsByClassName('longtext')[0].value;
                    record[name] = uinode.getElementsByClassName('longtext')[0].value;
                    Dom.removeClass(uinode.getElementsByClassName('longtext_value')[0], 'hidden');
                    Dom.removeClass(uinode.getElementsByClassName('longtext_edit')[0], 'hidden');
                    Dom.addClass(uinode.getElementsByClassName('longtext')[0], 'hidden');
                    Dom.addClass(uinode.getElementsByClassName('longtext_save')[0], 'hidden');
                    Dom.addClass(uinode.getElementsByClassName('longtext_cancel')[0], 'hidden');
                });
                
                cancel.on('click', function(e) {
                    Dom.removeClass(uinode.getElementsByClassName('longtext_value')[0], 'hidden');
                    Dom.removeClass(uinode.getElementsByClassName('longtext_edit')[0], 'hidden');
                    Dom.addClass(uinode.getElementsByClassName('longtext')[0], 'hidden');
                    Dom.addClass(uinode.getElementsByClassName('longtext_save')[0], 'hidden');
                    Dom.addClass(uinode.getElementsByClassName('longtext_cancel')[0], 'hidden');
                });
            } else {
                Dom.addClass(uinode.getElementsByClassName('longtext_edit')[0], 'hidden');
            }
            return node;
        },
            
        renderDate : function(field, record, newRecord) {
            var name = field.field.name;
            var description = field.field.description;
            if (YAHOO.lang.isUndefined(description) || YAHOO.lang.trim(description) === '') {
                description = name;
            }
            var node = Dom.get('date').cloneNode(true);
            node.id = '';
            var uinode = new YAHOO.util.Element(node);
            uinode.getElementsByClassName('date_value')[0].innerHTML = record[name];
            uinode.getElementsByClassName('date')[0].value = record[name];
            uinode.getElementsByClassName('label')[0].innerHTML = description;
            
            if (newRecord) {
                Dom.removeClass(uinode.getElementsByClassName('date')[0], 'hidden');
                Dom.addClass(uinode.getElementsByClassName('date_edit')[0], 'hidden');
                return node;
            }
            
            if (field.field.editable) {
                Event.addListener(uinode.getElementsByClassName('date_edit')[0], 'click', function(e) {
                    Dom.addClass(uinode.getElementsByClassName('date_value')[0], 'hidden');
                    Dom.addClass(uinode.getElementsByClassName('date_edit')[0], 'hidden');
                    Dom.removeClass(uinode.getElementsByClassName('date')[0], 'hidden');
                    Dom.removeClass(uinode.getElementsByClassName('date_save')[0], 'hidden');
                    Dom.removeClass(uinode.getElementsByClassName('date_cancel')[0], 'hidden');
                });
            } else {
                Dom.addClass(uinode.getElementsByClassName('date_edit')[0], 'hidden');
            }
            return node;
        },
            
        renderUrl : function(field, record, newRecord) {
            var name = field.field.name;
            var description = field.field.description;
            if (YAHOO.lang.isUndefined(description) || YAHOO.lang.trim(description) === '') {
                description = name;
            }
            var node = Dom.get('url').cloneNode(true);
            node.id = '';
            var uinode = new YAHOO.util.Element(node);
            uinode.getElementsByClassName('url_value')[0].innerHTML = record[name];
            uinode.getElementsByClassName('url_value')[0].href = record[name];
            uinode.getElementsByClassName('url')[0].value = record[name];
            uinode.getElementsByClassName('label')[0].innerHTML = description;
            
            if (newRecord) {
                Dom.removeClass(uinode.getElementsByClassName('url')[0], 'hidden');
                Dom.addClass(uinode.getElementsByClassName('url_edit')[0], 'hidden');
                return node;
            }
            
            if (field.field.editable) {
                var edit = new YAHOO.widget.Button(uinode.getElementsByClassName('url_edit')[0]);
                Dom.addClass(edit, 'url_edit');
                var save = new YAHOO.widget.Button(uinode.getElementsByClassName('url_save')[0]);
                Dom.addClass(save, 'url_save');
                Dom.addClass(save, 'hidden');
                var cancel = new YAHOO.widget.Button(uinode.getElementsByClassName('url_cancel')[0]);
                Dom.addClass(cancel, 'url_cancel');
                Dom.addClass(cancel, 'hidden');
                
                edit.on('click', function(e) {
                    uinode.getElementsByClassName('url')[0].value = uinode.getElementsByClassName('url_value')[0].innerHTML;
                    Dom.addClass(uinode.getElementsByClassName('url_value')[0], 'hidden');
                    Dom.addClass(uinode.getElementsByClassName('url_edit')[0], 'hidden');
                    Dom.removeClass(uinode.getElementsByClassName('url')[0], 'hidden');
                    Dom.removeClass(uinode.getElementsByClassName('url_save')[0], 'hidden');
                    Dom.removeClass(uinode.getElementsByClassName('url_cancel')[0], 'hidden');
                });
                
                save.on('click', function(e) {
                    uinode.getElementsByClassName('url_value')[0].innerHTML = uinode.getElementsByClassName('url')[0].value;
                    record[name] = uinode.getElementsByClassName('url')[0].value;
                    Dom.removeClass(uinode.getElementsByClassName('url_value')[0], 'hidden');
                    Dom.removeClass(uinode.getElementsByClassName('url_edit')[0], 'hidden');
                    Dom.addClass(uinode.getElementsByClassName('url')[0], 'hidden');
                    Dom.addClass(uinode.getElementsByClassName('url_save')[0], 'hidden');
                    Dom.addClass(uinode.getElementsByClassName('url_cancel')[0], 'hidden');
                });
                
                cancel.on('click', function(e) {
                    Dom.removeClass(uinode.getElementsByClassName('url_value')[0], 'hidden');
                    Dom.removeClass(uinode.getElementsByClassName('url_edit')[0], 'hidden');
                    Dom.addClass(uinode.getElementsByClassName('url')[0], 'hidden');
                    Dom.addClass(uinode.getElementsByClassName('url_save')[0], 'hidden');
                    Dom.addClass(uinode.getElementsByClassName('url_cancel')[0], 'hidden');
                });
            } else {
                Dom.addClass(uinode.getElementsByClassName('url_edit')[0], 'hidden');
            }
            return node;
        },
            
        renderImage : function(field, record, newRecord) {
            var name = field.field.name;
            var description = field.field.description;
            if (YAHOO.lang.isUndefined(description) || YAHOO.lang.trim(description) === '') {
                description = name;
            }
            var node = Dom.get('image').cloneNode(true);
            node.id = '';
            var uinode = new YAHOO.util.Element(node);
            uinode.getElementsByClassName('image')[0].value = record[name];
            uinode.getElementsByClassName('label')[0].innerHTML = description;
            
            if (record[name] !== '') {
                uinode.getElementsByClassName('image_value')[0].src = record[name];
            } else {
                uinode.getElementsByClassName('image_value')[0].src = '/images/noImgAvbl.gif';
            }
            
            if (newRecord) {
                Dom.addClass(uinode.getElementsByClassName('image_edit')[0], 'hidden');
                Dom.removeClass(uinode.getElementsByClassName('image')[0], 'hidden');
                var update = new YAHOO.widget.Button(uinode.getElementsByClassName('image_update')[0]);
                update.on('click', function(e) {
                    uinode.getElementsByClassName('image_value')[0].src = uinode.getElementsByClassName('image')[0].value;
                });
                return node;
            }
            if (field.field.editable) {
                var edit = new YAHOO.widget.Button(uinode.getElementsByClassName('image_edit')[0]);
                Dom.addClass(edit, 'image_edit');
                var save = new YAHOO.widget.Button(uinode.getElementsByClassName('image_save')[0]);
                Dom.addClass(save, 'image_save');
                Dom.addClass(save, 'hidden');
                var cancel = new YAHOO.widget.Button(uinode.getElementsByClassName('image_cancel')[0]);
                Dom.addClass(cancel, 'image_cancel');
                Dom.addClass(cancel, 'hidden');
                var update = new YAHOO.widget.Button(uinode.getElementsByClassName('image_update')[0]);
                Dom.addClass(update, 'image_update');
                Dom.addClass(update, 'hidden');
    
                edit.on('click', function(e) {
                    uinode.getElementsByClassName('image')[0].value = uinode.getElementsByClassName('image_value')[0].src; 
                    Dom.addClass(uinode.getElementsByClassName('image_value')[0], 'hidden');
                    Dom.addClass(uinode.getElementsByClassName('image_edit')[0], 'hidden');
                    Dom.removeClass(uinode.getElementsByClassName('image')[0], 'hidden');
                    Dom.removeClass(uinode.getElementsByClassName('image_save')[0], 'hidden');
                    Dom.removeClass(uinode.getElementsByClassName('image_cancel')[0], 'hidden');
                });
                
                save.on('click', function(e) {
                    uinode.getElementsByClassName('image_value')[0].src = uinode.getElementsByClassName('image')[0].value;
                    record[name] = uinode.getElementsByClassName('image')[0].value;
                    Dom.removeClass(uinode.getElementsByClassName('image_value')[0], 'hidden');
                    Dom.removeClass(uinode.getElementsByClassName('image_edit')[0], 'hidden');
                    Dom.addClass(uinode.getElementsByClassName('image')[0], 'hidden');
                    Dom.addClass(uinode.getElementsByClassName('image_save')[0], 'hidden');
                    Dom.addClass(uinode.getElementsByClassName('image_cancel')[0], 'hidden');
                });
                
                cancel.on('click', function(e) {
                    Dom.removeClass(uinode.getElementsByClassName('image_value')[0], 'hidden');
                    Dom.removeClass(uinode.getElementsByClassName('image_edit')[0], 'hidden');
                    Dom.addClass(uinode.getElementsByClassName('image')[0], 'hidden');
                    Dom.addClass(uinode.getElementsByClassName('image_save')[0], 'hidden');
                    Dom.addClass(uinode.getElementsByClassName('image_cancel')[0], 'hidden');
                });
            } else {
                Dom.addClass(uinode.getElementsByClassName('image_edit')[0], 'hidden');
            }
            return node;
        },
            
        getData : function (initial) {
            YAHOO.mirchee.tools.WaitDialog.show();
            var searchValue = Dom.get('searchBox').value;
            var srchQuery = 'search=_init' + 
                            '&o=' + Dom.get('o').value;
                            
            if (YAHOO.lang.trim(searchValue) !== '') {
                srchQuery = "search=" + searchValue + 
                            "&o=" + Dom.get('o').value + 
                            "&field=" + Dom.get('fields').options[Dom.get('fields').selectedIndex].value;
            }
            var transaction = YAHOO.util.Connect.asyncRequest(
                                'POST', 
                                'getdata.do', 
                                {success : displayRecords, failure: displayRecords, cache:false},
                                srchQuery);
        },
        
        showSuccess : function(msg) {
            Dom.get('success').innerHTML = msg;
        },
        
        showError : function(msg) {
            Dom.get('error').innerHTML = msg;
        },
        
        clearStatus : function() {
            Dom.get('success').innerHTML = '';
            Dom.get('error').innerHTML = '';
        },
        
        init : function() {
            var addRecordButton = new YAHOO.widget.Button('add_record');
            addRecordButton.on('click', function(e) {
                YAHOO.mirchee.tools.DataAddDialog.show();
            });
            
            //Subscribe to dataready event
            var evt = YAHOO.mirchee.tools.DataSearchBox.getDataReadyEvent();
            evt.subscribe(YAHOO.mirchee.tools.DataVizEdit.getData, this);
            
            evt = YAHOO.mirchee.tools.DataSearchBox.getDataSearchEvent();
            evt.subscribe(function() {
                YAHOO.mirchee.tools.DataVizEdit.clearStatus();
                YAHOO.mirchee.tools.DataVizEdit.getData();
            
            }, this);
            
            
        }
    }
}();

