/* 
 * This class is used to convert existing html tags
 *
 * @author Ivan Stoilov
 */


function TagConverter(style, defaultValue)
{
    var _elementToConvertBack = null;
    var _type = '';
    var _saveCallback = null;
    var _trigger = null;
    var _additionalParams = null;
    var _defaultStyle = (typeof(style) != 'undefined') ? style : '';
    var _defaultValue = (typeof(defaultValue) != 'undefined') ? defaultValue : '';

    /*
     * getter and setter for _defaultStyle
     */
    this.setStyle = function (style) {
        _defaultStyle = style;
    };

    this.getStyle = function () {
        return _defaultStyle;
    };

    /*
     * getter and setter for _defaultValue
     */
    this.setDefaultValue = function (value) {
        _defaultValue = value;
    };

    this.getDefaultValue = function () {
        return _defaultValue;
    };

    /*
     * This method converts any tag to TextArea or Input(text)
     *
     * @param type - string - the type of the attribute (textarea, input)
     * @param element - HTMLElement - the element which will be converted\
     * @param callback - function - the function to be called when new data is
     *                              submitted
     * @param additionalParams - Array - additional parameters to be added to
     *                                   the callback function
     * @author Ivan Stoilov
     */
    this.convertToEditableTag = function (type, element, callback, trigger) {
        this.convertToEditableTag(type, element, callback, trigger, null);
    };

    this.convertToEditableTag = function (type, element, callback, trigger, additionalParams)
    {
        // save data for converting the element back
        _elementToConvertBack = $(element);
        _type = type;
        _saveCallback = callback;
        _additionalParams = additionalParams;
        _trigger = $(trigger);
        
        _trigger.hide();
        
        // get element's text
        var elementToConvert = $(element);
        if (type.toLowerCase() != 'input')
        {
            var text = elementToConvert.innerHTML;
        }
        else
        {
            var text = elementToConvert.innerHTML;
        }
        text = text.replace(/^\s*/, '');        // remove leading whitespaces
        text = text.replace(/\s*$/, '');        // remove trailing whitespaces

        text = text.replace(/\n/gi, '');            // remove all \n
        text = text.replace(/\r/gi, '');            // remove all \r
        text = text.replace(/<br(\s\/)?>/gi, '\n'); // convert <br> to \n

        text = text.replace(/&lt;/gi, '<');         // |
        text = text.replace(/&gt;/gi, '>');         // | decode html
        text = text.replace(/&amp;/gi, '&');        // |

        if (text == _defaultValue)
        {
            text = '';
        }
        

        // create the new element
        var newElement = new Element(type);

        if (type == 'textarea')
        {
            newElement.value = (text);
        }
        else if (type == 'input')
        {
            newElement.writeAttribute('type', 'text');
            newElement.writeAttribute('value', text);
            newElement.observe('keypress', _convertToTextTag);
        }
        else
        {
            alert('TagConverter: Wrong parameter !');
        }

        // add the new element
        elementToConvert.insert({before: newElement});

        // attach event to restore the changed element
        newElement.observe('blur', _convertToTextTag);

        newElement.writeAttribute('style', _defaultStyle);

        newElement.focus();

        // destroy the old element
        elementToConvert.remove();
    };
	
	/*
	 * This method converts any tag to TextArea or Input(text)
     *  - Modified method ot load bbCode
     *
     * @param type - string - the type of the attribute (textarea, input)
     * @param element - HTMLElement - the element which will be converted\
     * @param loadFunction - function to call to load element contents from database
     * @param callback - function - the function to be called when new data is submitted (save)
     * @param trigger - function - the function to be called when new data is submitted
     * @param additionalParams - Array - additional parameters to be added to
     *                                   the callback function
     * @author Konstantin Delchev <kdelchev@melontech.com>
     */
	this.loadToEditableTag = function (type, element, loadFunction, callback, trigger, additionalParams)
    {
        // save data for converting the element back
        _elementToConvertBack = $(element);
        _type = type;
        _saveCallback = callback;
        _additionalParams = additionalParams;
        _trigger = $(trigger);
        
        _trigger.hide();
        
        // get element's text
        var elementToConvert = $(element);
        if (type.toLowerCase() != 'input')
        {
            var text = elementToConvert.innerHTML;
        }
        else
        {
            var text = elementToConvert.innerHTML;
        }
		
        if (text == _defaultValue)
        {
            text = '';
        }

        // create the new element
        var newElement = new Element(type);

        if (type == 'textarea')
        {
            //newElement.value = text;
			newElement.writeAttribute('value', '');
        }
        else if (type == 'input')
        {
            newElement.writeAttribute('type', 'text');
            newElement.writeAttribute('innerHTML', text);
        }
        else
        {
            alert('TagConverter: Wrong parameter !');
        }

        // add the new element
        elementToConvert.insert({before: newElement});

		newElement.writeAttribute('style', _defaultStyle);
        newElement.writeAttribute('id', element.id + '_input');
		
        // attach event to restore the changed element
        newElement.observe('blur', _convertToTextTag);
        newElement.focus();

        // destroy the old element
        elementToConvert.remove();
		
		// load contents from database to the newly created element
		loadFunction(additionalParams, element.id + '_input');
    };
	
	this.reloadElement = function(id)
	{
		loadFunction(_additionalParams, element.id);
	};

    /*
     * This method converts the recently converted tag back to its original one
     *
     * @param - Event - the parameter of the event that occured
     * @author Ivan Stoilov
     */
    var _convertToTextTag = function (event)
    {
        // if the event is comming from a key press
        // ignore keys other than RETURN

        //if ((event.keyCode) && event.keyCode != 13)
        if (event.type == 'keypress' && event.keyCode != 13)
        {
            return;
        }

        var elementToConvert = $(event.element());
        var newElement = $(_elementToConvertBack);

        // retrieve the new value and fill the new element with it
        var newValue = '';

        if (_type == 'textarea' || _type == 'input')
        {
            newValue = elementToConvert.value;
        }
        else
        {
            alert('TagConverter: Wrong parameter !');
        }

        //newElement.update(newValue);

        // insert the new element and remove the old one
        elementToConvert.insert({before: newElement});
        elementToConvert.remove();
        
        _trigger.show();

        var args = new Array();
        args.push(newValue);
        args = args.concat(_additionalParams);

        _saveCallback.apply(this, args);
    };
}
