﻿function wa() {

    this.debug = false;
    this.targets = new Array();
    this.params = new Array();
    this.results = new Array();
    this.appends = new Array();
    this.ajaxPage = "default.aspx";

    this.success = function() { }
    
    this.addtarget = function(t) {

        if (t != null)
            this.targets.push(t);

        return this;
    }

    this.addresult = function(selector) {

        if (selector != null)
            this.results.push(selector);

        return this;
    }

    this.addappend = function(selector) {

        if (selector != null)
            this.appends.push(selector);

        return this;
    }

    this.setajaxpage = function(url) {

        if (url != null)
            this.ajaxPage = url;

        return this;
    }
     
    this.addvalue = function(waparam, wavalue) {
        p = new WingParam(waparam, '', '', '', wavalue);
        this.params.push(p);

        return this;
    }

    this.addparam = function(waparam, wabind, wavalue) {
        p = new WingParam(waparam, '', wabind, '', wavalue);
        this.params.push(p);

        return this;
    }    

    this.isValid = function(group) {

        valid = false;
        errormessages = '';

        $(document.forms[0]).validate({
            onsubmit: false,
            errorElement: 'p',
            errorPlacement: function(error, element) {
                mess = ($(element).attr("title"));
                if (mess != null && mess.length > 0)
                    errormessages += mess + "\n";
                else
                    errormessages += "Por favor, informe o campo: " + $(element).attr("id") + "\n";
            }
        });

        if (group != null && group != '') {
            if ($(".required[wagroup='" + group + "']").length > 0) {
                valid = $(".required[wagroup='" + group + "']").valid();
            }
            else {
                valid = true;
            }
        }
        else {
            if ($(".required").length > 0) {
                valid = $(".required").valid();
            }
            else {
                valid = true;
            }
        }

        if (!valid && errormessages != null && errormessages.length > 0)
            alert(errormessages);

        return valid;
    }

    this.prepare = function() {

        var ajaxParams = new Object();
        ajaxParams.JQueryAjax = true;

        if (this.targets != null && this.targets.length > 0) {
            ajaxParams.target = this.targets[0];
        }

        if (this.params != null && this.params.length > 0) {
            for (var index = 0; index < this.params.length; index++) {

                var code = "ajaxParams." + this.params[index].waparam + " = this.params[index].wavalue;"
                eval(code);

            }
        }

        $.each($("[waparam]"), function(index, el) {

            waparam = $(el).attr('waparam');

            waeval = $(el).attr('waeval');
            if (waeval == undefined)
                waeval = '';

            wabind = $(el).attr('wabind');
            if (wabind == undefined)
                wabind = '';

            wawildcard = $(el).attr('wawildcard');
            if (wawildcard == undefined)
                wawildcard = '';

            wavalue = '';

            prop = '';
            if (waeval != '')
                prop = waeval;

            if (wabind != '')
                prop = wabind;

            if (prop != '') {
                if (prop.substring(1, 0) == '@') {
                    at = prop.substring(1);
                    wavalue = eval("$(el).attr('" + at + "')");
                }
                else
                    wavalue = eval("$(el)." + prop + "()");
            }

            p = new WingParam(waparam, waeval, wabind, wawildcard, wavalue);

            var code = "ajaxParams." + p.waparam + " = p.wavalue;"
            eval(code);
        });

        if (this.debug)
            alert($.toJSON(ajaxParams));

        return ajaxParams;
    }

    this.goajax = function() {
        return this.goajax("");
    }

    this.goajax = function(group) {    
        
        if ($(".required").length > 0) {
            if (!this.isValid(group)) {
                return this;
            }
        }

        var ps = this.prepare();
        
        $(".carregando").css("top", $(window).scrollTop());
        $(".carregando").show();

        var html = $.ajax({
            afterexecute: this.success,
            debug: this.debug,
            to: this.results,
            appends: this.appends,
            type: "POST",
            url: this.ajaxPage,
            data: ps,
            success: show,
            error: function() { $(".carregando").hide(); }
        });


        return this;
    }

    function show(html) {
        
        
        $(".carregando").hide();        

        if (this.to != null && this.to.length > 0) {

            for (var index = 0; index < this.to.length; index++) {

                if (this.to[index] != null && this.to[index] != "") {

                    $(this.to[index]).html(html);

                }
            }
        }

        if (this.appends != null && this.appends.length > 0) {

            for (var index = 0; index < this.appends.length; index++) {

                if (this.appends[index] != null && this.appends[index] != "") {

                    $(this.appends[index]).append(html);

                }
            }
        }
        
        if (this.debug)
            alert(html);

        if (this.afterexecute != null)
            this.afterexecute();
    }

    this.go = function() {
        return this.go("");
    }

    this.go = function(group) {

        if ($(".required").length > 0) {
            if (!this.isValid(group)) {
                return this;
            }
        }

        var xml = '<WingAjax>';

        if (this.targets != null && this.targets.length > 0) {
            xml += '<Targets>';
            for (var index = 0; index < this.targets.length; index++) {
                xml += '<string>' + this.targets[index] + '</string>';
            }
            xml += '</Targets>';
        }

        pp = new WingParam();
        pp.wabind = '';

        xml += '<Parameters>';

        if (this.params != null && this.params.length > 0) {
            for (var index = 0; index < this.params.length; index++) {
                xml += this.params[index].getXML();
            }
        }

        $.each($("[waparam]"), function(index, el) {

            waparam = $(el).attr('waparam');

            waeval = $(el).attr('waeval');
            if (waeval == undefined)
                waeval = '';

            wabind = $(el).attr('wabind');
            if (wabind == undefined)
                wabind = '';

            wawildcard = $(el).attr('wawildcard');
            if (wawildcard == undefined)
                wawildcard = '';

            wavalue = '';

            prop = '';
            if (waeval != '')
                prop = waeval;

            if (wabind != '')
                prop = wabind;

            if (prop != '') {
                if (prop.substring(1, 0) == '@') {
                    at = prop.substring(1);
                    wavalue = eval("$(el).attr('" + at + "')");
                }
                else
                    wavalue = eval("$(el)." + prop + "()");
            }

            p = new WingParam(waparam, waeval, wabind, wawildcard, wavalue);
            xml += p.getXML();

        });

        xml += '</Parameters>';
        xml += '</WingAjax>';

        if (this.debug)
            alert(xml);

        var prm = Sys.WebForms.PageRequestManager.getInstance();
        var id = $("#1EF1A993-5F96-43ae-A60A-8C08EBE78379 > div").attr("Id");
        prm._doPostBack(id, xml)

        return this;
    }

    return this;
}

function WingParam(waparam, waeval, wabind, wawildcard, wavalue) {
    this.waparam = waparam;
    this.waeval = waeval;
    this.wabind = wabind;
    this.wawildcard = wawildcard;
    this.wavalue = wavalue;

    this.getXML = function() {

        xml = '<AjaxParameter waparam="' + this.waparam + '" waeval="' + this.waeval + '" wabind="' + this.wabind + '" wawildcard="' + this.wawildcard + '"  >';
        xml += '<wavalue>' + this.wavalue + '</wavalue>';
        xml += '</AjaxParameter>';
        return xml;
    }
}

    
    
    
