
var FormsManager = {
    __forms: {},

    ajaxify: function(){
        
        $(document).find('form').each(
            function(){
                var form = $(this);
                var url = $(this).attr('action');
                var method = $(this).attr('method');

                if( $(this).attr('callback') != undefined){
                    $(form).attr('action', '');

                    var callback = $(form).attr('callback');
                    eval(
                        'var lambda = function(form, url, method){ ' +
                        callback +
                        '}'
                        );

                    $(form).submit(function(){
                        timer.stop(form.attr('id') + " submit");
                        return lambda(form, url, method);
                    });
                }
                else if( $(this).attr('jsClass') != undefined ){
                    $(form).attr('action', '');
                    var className = $(this).attr('jsClass');

                    eval('var obj = new ' + className + '("' +
                        $(this).attr('id') + '" , "' +
                        url + '", "' + method + '")' );

                    FormsManager.__forms[$(this).attr('id')] = obj;
                    $(form).submit(function(){
                        timer.stop($(this).attr('jsClass') + " submit");
                        return obj.submit();
                    });
                }


            });
    },
    getForm: function(id){
        return FormsManager.__forms[id];
    }
};



var PostMessageForm = function(form_id, url, method){
    this.id = '#' + form_id;
    this.url = url;
    this.method = method;
    this.oldMessage = "";


    this.debugParams = {};

    this.submit = function(room, nick, message, reset){
        var data = {};
        if( reset == undefined ){
            reset = true;
        }
        
        if( message == undefined ){
            message = $(Global.MessageInput).val();
            if( message.trim() == '' ){
                timer.start();
                return false;
            }
            if( this.isException(message) ){
                this.exception(message);
                timer.start();
                return false;
            }

            data = $(this.id).serialize();
        }
        else{
            if( message.trim() == '' ){
                timer.start();
                return false;
            }
            if( this.isException(message) ){
                this.exception(message);
                timer.start();
                return false;
            }
            
            data = {
                'data': {
                    'Whisps': {
                        'room': room,
                        'nick': nick,
                        'message': message
                    }
                }
            };
        }

        var ajaxParams = this.build(data, reset);
        Autocompletor.reset();

        History.add($(Global.MessageInput).val());
        History.clean();

        this.oldMessage =  $(Global.MessageInput).val();
        $(Global.MessageInput).val('');

        $.ajax(ajaxParams);

        return false;
    }

    this.isException = function(message){
        message = message.trim().toLowerCase();
        var except = ['/debug'];
        if( jQuery.inArray(message, except) >= 0 ){
            debug(message + " is an exception ");
            return true;
        }
        return false;
    }

    this.exception = function(message){
        if( message == '/debug'){
            if( $WM.isDev() ){
                toggleDebug();
                $(Global.MessageInput).val('');
            }
        }
    }

    this.build = function(data, reset){
        return {
            cache: false,
            type: this.method,
            url: this.url,
            dataType: "xml",
            data: data,
            success: function(xml){
                var xmlstring = xmlToString(xml);
                $('#iAjax2').html("xml = " + xmlentities(xmlstring));
                var res = xml;
                Updater.parse($(xml), 'post', res);
                if( reset ){
                    var hasError = false;
                    var msgError = "";
                    $(xml).find('errors').find('error').each(function(){
                        hasError = hasError || ($(this).text() != '');

                        msgError += ((msgError == "")?"":"<br/>") + $(this).text()
                    });
                    if( hasError ){
                        $(Global.MessageInput).val(this.oldMessage);
                        debug('msgError = ' + msgError);
                        $WM.cmdError(msgError);
                    }
                }
                
            },
            error: function(xml, serror, ex){
                $WM.ajaxError('#iAjax2', "POST", xml, serror, ex, true);
            }
        };
    }

    this.sendLeaveRoom = function(room_name, nickname){
        var message = '/leave ' + room_name;
        debug(xmlentities(message));
        return this.submit(room_name, nickname, message, false);
    }

    this.setNickname = function(nickname){
        $(Global.NickInput).attr('value', nickname);
    }
};


var PostNicknameForm = function(form_id, url, method){
    this.id = '#' + form_id;
    this.url = url;
    this.method = method;

    this.submit = function(){
        var data = {
            data: {
                Chatter: {
                    'nickname': $(Global.NickPromptInput).val()
                }
            }
        }

        var ajaxParams = this.build(data);
        $.ajax(ajaxParams);

        return false;
    }

    this.build = function(data){
        return {
            cache: false,
            type: this.method,
            url: this.url,
            dataType: "xml",
            data: data,
            success: function(xml){
                var hasError = false;
                //alert("xml = " + xmlToString(xml));
                var xmlstring = xmlToString(xml);
                $('#iAjax').html( xmlentities(xmlstring) );
                
                var hasScript = false;

                $(xml).find('errors').find('error').each(function(){
                    hasScript = hasScript || ($(this).text() != '');
                });

                $(xml).find('json').find('script').each(function(){
                    hasError = hasError || ($(this).text() != '');
                    try{
                        eval( $(this).text() );
                    }
                    catch(e){
                        debug("[" + xmlentities($(this).text()) + ']:' + e);
                    }
                });

                //alert('hasError = ' + hasError);

                if( hasError == true ){
                    $(xml).find('errors').find('error').each( function(){
                        alert($(this).text());
                    });
                }
                else{
                    window.location.reload();
                }

            },
            error: function(xml, serror, ex){
                $WM.ajaxError('#iAjax2', "POST", xml, serror, ex, true);
            }
        };
    }


};