;(function($) {
     // the floater element
    var elFloater = {},
    elLoader = {},
    // the url to request
    url,
    // the id used for the floater
    id,
    // title
    title,
    fade_time = false,
    loader_fade_time = 400,
    // IE 5.5 or 6
    IE = $.browser.msie && /MSIE\s(5\.5|6\.)/.test(navigator.userAgent),
    // the content returned by the url
    content,
    // loading img
    loadingAnimation = '<div id="loader-container">&nbsp;</div>';

    $.fn.extend({
        floater: function() {
                createFloater();
                return this.each(function(){
                    this.url = $(this).attr('href');
                    //$(this).attr('href','#');
                }).click(init);
            }
    });


    function createFloater()
    {
        if (elFloater.parent) {
            return;
        }
        // create the floater element
        elFloater.parent = $('<div id="floater-parent" style="width:100%; height:100%">' +
                                '<div id="floater-bg">&nbsp;</div>' +
                                '<div id="floater-container">' +
                                    '<div id="floater-title">' +
                                        '<span style="float:right;"><span id="floater-close">close</span></span>' +
                                        '<span id="floater-title-content">&nbsp;</span>' +
                                    '</div>'+
                                    '<div id="floater-content-container">' +
                                        '<div id="floater-content"></div>' +
                                    '</div>' +
                                '</div>' +
                             '</div>').appendTo(document.body).hide();

        // content referrence
        elFloater.bg =  $('#floater-bg');
        elFloater.content =  $('#floater-content');
        elFloater.contentRef =  document.getElementById('floater-content');
        elFloater.contentContainer =  $('#floater-content-container');
        elFloater.container =  $('#floater-container');
        elFloater.title =  $('#floater-title');
        elFloater.titleContent =  $('#floater-title-content');
        elFloater.close =  $('#floater-close');
        elFloater.close.click(close);

        elLoader.parent = $(loadingAnimation).appendTo(elFloater.parent).hide();
        elLoader.bg = $('#loader-container');

        // apply bgiframe if available
        if ( $.fn.bgiframe ) {
            //elFloater.container.bgiframe();
            elFloater.bg.bgiframe();
            elLoader.parent.bgiframe();
        }


    }

    function close(event)
    {
        hide();
    }

    function init(event)
    {
        setContent("");
        showLoader();
        this.tOpacity = elFloater.parent.css("opacity");
        //this.old_url = $(this).attr('href');
        $(this).removeAttr('href');
        var title = $(this).attr('title');
        if (title.length == 0) {
            var title = $('img', this).get(0).getAttribute('tooltip');
        }
        if (title != null) {
            $(elFloater.titleContent).html(title);

        }
        show();
        loadContent(this.url);
    }

    function loadContent(url)
    {
        $.ajax({
           type: "GET",
           url: url,
           cache: false,
           success: setContent
         });

        //elFloater.content.load(url, null, setEvents);

    }

    function setContent(content)
    {
        elFloater.content.html(content);
        //elFloater.contentRef.innerHTML = "";
        //elFloater.contentRef.innerHTML = content;
        setEvents();
        hideLoader();
    }

    function getContent(event)
    {

        var href = $(this).attr('href');
        var confirm_message = $(this).attr('confirm');
        if (confirm_message && confirm(confirm_message)) {
            showLoader();
            loadContent(href);
        }
        return false;
    }

    function sendForm(event)
    {
        showLoader();
        var data = $(this).formSerialize();
        var target = $(this).attr('action');
        $.ajax({
           type: "POST",
           url: target,
           data: data,
           cache: false,
           success: setContent
         });
         return false;
    }

    function setEvents()
    {
        $('a', elFloater.content).click(getContent);
        $('form', elFloater.content).submit(sendForm);
        $('*[tooltip]', elFloater.content).tooltip({showURL:false});
        $("select[dropdown]").dropdown();
        //$('a.floater', elFloater.content).floater();
    }

    // show loader
    function showLoader() {

        if (window.pageXOffset != null) {
               offset_left = window.pageXOffset;
               offset_top  = window.pageYOffset;
        } else {
                offset_left = document.documentElement.scrollLeft;
                offset_top = document.documentElement.scrollTop;
        }

        if (IE) {
            $(document.body).css('height','100%');
            document.documentElement.style.overflow = "hidden";
        }

        var offsetLeftContent = offset_left + ($(window).width() * 0.05);
        var offsetTopContent = offset_top + ($(window).height() * 0.20);
        //elFloater.bg.css('top', offset_top + 'px');
        //elFloater.bg.css('left', offset_left + 'px');
        elLoader.parent.css('top', offsetTopContent + 'px');
        elLoader.parent.css('left', offsetLeftContent  + 'px');

        if ((!IE || !$.fn.bgiframe) && loader_fade_time) {
            if (elLoader.parent.is(":animated")) {
                elLoader.parent.stop().show().fadeTo(loader_fade_time, this.tOpacity);
            }
            else {
                elLoader.parent.is(':visible') ? elLoader.parent.fadeTo(loader_fade_time, this.tOpacity) : elLoader.parent.fadeIn(loader_fade_time);
            }
        }
        else {
            elLoader.parent.show();
        }
        // apply bgiframe if available
        if ( $.fn.bgiframe ) {
            elLoader.parent.bgiframe();
        }
    }

    // hide loader
    function hideLoader(event) {
        $(this).attr('href', this.url);
        function complete() {
            elLoader.parent.hide().css("opacity", "");
        }
        if ((!IE || !$.fn.bgiframe) && loader_fade_time) {
            if (elLoader.parent.is(':animated'))  {
                elLoader.parent.stop().fadeTo(loader_fade_time, 0, complete);
            }
            else {
                elLoader.parent.stop().fadeOut(loader_fade_time, complete);
            }
        }
        else {
            complete();
        }
    }

    // show floater
    function show() {

        if (window.pageXOffset != null) {
               offset_left = window.pageXOffset;
               offset_top  = window.pageYOffset;
        } else {
                offset_left = document.documentElement.scrollLeft;
                offset_top = document.documentElement.scrollTop;
        }

        if (IE) {
            $(document.body).css('height','100%');
            document.documentElement.style.overflow = "hidden";
        }

        var offsetLeftContent = offset_left + ($(window).width() * 0.05);
        var offsetTopContent = offset_top + ($(window).height() * 0.20);
        elFloater.bg.css('top', offset_top + 'px');
        elFloater.bg.css('left', offset_left + 'px');
        elFloater.container.css('top', offsetTopContent + 'px');
        elFloater.container.css('left', offsetLeftContent  + 'px');

        if ((!IE || !$.fn.bgiframe) && fade_time) {
            if (elFloater.parent.is(":animated")) {
                elFloater.parent.stop().show().fadeTo(fade_time, this.tOpacity);
            }
            else {
                elFloater.parent.is(':visible') ? elFloater.parent.fadeTo(fade_time, this.tOpacity) : elFloater.parent.fadeIn(fade_time);
            }
        }
        else {
            elFloater.parent.show();
        }
        // apply bgiframe if available
        if ( $.fn.bgiframe ) {
            elFloater.parent.bgiframe();
        }
        $(document.body).css('overflow','hidden');
        if (IE) {
            document.documentElement.style.overflow = "hidden";
            $('html,body').animate({scrollTop: offset_top}, 1, false);
        }
        //elFloater.parent.click(hide);
    }

    // hide floater
    function hide(event) {
        $(this).attr('href', this.url);
        function complete() {
            elFloater.parent.hide().css("opacity", "");
        }
        if ((!IE || !$.fn.bgiframe) && fade_time) {
            if (elFloater.parent.is(':animated'))  {
                elFloater.parent.stop().fadeTo(fade_time, 0, complete);
            }
            else {
                elFloater.parent.stop().fadeOut(fade_time, complete);
            }
        }
        else {
            complete();
        }
        if (IE) {
            $(document.body).css('height','auto');
        }
        $(document.body).css('overflow','auto');
        document.documentElement.style.overflow = "auto";
    }

})(jQuery);

;(function($) {
    $.fn.fieldValue = function(successful) {
        for (var val=[], i=0, max=this.length; i < max; i++) {
            var el = this[i];
            var v = $.fieldValue(el, successful);
            if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length))
                continue;
            v.constructor == Array ? $.merge(val, v) : val.push(v);
        }
        return val;
    };

    /**
     * Returns the value of the field element.
     */
    $.fieldValue = function(el, successful) {
        var n = el.name, t = el.type, tag = el.tagName.toLowerCase();
        if (typeof successful == 'undefined') successful = true;

        if (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||
            (t == 'checkbox' || t == 'radio') && !el.checked ||
            (t == 'submit' || t == 'image') && el.form && el.form.clk != el ||
            tag == 'select' && el.selectedIndex == -1))
                return null;

        if (tag == 'select') {
            var index = el.selectedIndex;
            if (index < 0) return null;
            var a = [], ops = el.options;
            var one = (t == 'select-one');
            var max = (one ? index+1 : ops.length);
            for(var i=(one ? index : 0); i < max; i++) {
                var op = ops[i];
                if (op.selected) {
                    // extra pain for IE...
                    var v = $.browser.msie && !(op.attributes['value'].specified) ? op.text : op.value;
                    if (one) return v;
                    a.push(v);
                }
            }
            return a;
        }
        return el.value;
    };

    $.fn.formToArray = function(semantic) {
        var a = [];
        if (this.length == 0) return a;

        var form = this[0];
        var els = semantic ? form.getElementsByTagName('*') : form.elements;
        if (!els) return a;
        for(var i=0, max=els.length; i < max; i++) {
            var el = els[i];
            var n = el.name;
            if (!n) continue;

            if (semantic && form.clk && el.type == "image") {
                // handle image inputs on the fly when semantic == true
                if(!el.disabled && form.clk == el)
                    a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
                continue;
            }

            var v = $.fieldValue(el, true);
            if (v && v.constructor == Array) {
                for(var j=0, jmax=v.length; j < jmax; j++)
                    a.push({name: n, value: v[j]});
            }
            else if (v !== null && typeof v != 'undefined')
                a.push({name: n, value: v});
        }

        if (!semantic && form.clk) {
            // input type=='image' are not found in elements array! handle them here
            var inputs = form.getElementsByTagName("input");
            for(var i=0, max=inputs.length; i < max; i++) {
                var input = inputs[i];
                var n = input.name;
                if(n && !input.disabled && input.type == "image" && form.clk == input)
                    a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
            }
        }
        return a;
    };

    /**
     * Serializes form data into a 'submittable' string. This method will return a string
     * in the format: name1=value1&amp;name2=value2
     */
    $.fn.formSerialize = function(semantic) {
        //hand off to jQuery.param for proper encoding
        return $.param(this.formToArray(semantic));
    };

})(jQuery);
