        
    // GLOBAL VARIABLES
    
    var isIE = document.all;
    var default_box_width = 400;
    var default_box_height = 130;
    var default_loading_width = 800;
    var default_loading_height = 100;
    var drag_enabled = false;
    var drag_layer = null;  
    var offsetX = 0;
    var offsetY = 0;
    var loading_id = -1;
    var _select_pivot = new Array();
    var _ajax_request = new Array();
    var _request_index = 0;
    
    // DOCUMENT INIT
           
    document.onkeydown = function(e) 
                         { 
                             var kc = (window.event) ? event.keyCode : e.keyCode;
                             var esc = (window.event) ? 27 : e.DOM_VK_ESCAPE;
                              
                             if (kc == esc) 
                             {
                                 if (document.getElementById('popupbox') != null)
                                     return _dialog_close();
                                      
                                 if (parent.document.getElementById('popupframe') != null)
                                     return _popup_close_from();
                             }     
                              
                             return true;
                         };
    
    // AJAX
    
    // IE 5.0 does not support the apply() method of the function object, we resort to this eval-based solution that sucks 
    // because it is not capable of preserving 'this' and is ugly as hell, but it works for us.
    function _my_apply(funcname, args) 
    {
        var e = "funcname(";
        
        for (var i = 0; i < args.length; i++) 
        {
            e += "args["+i+"]";
            
            if (i+1 != args.length)
                e += ",";
        }
        
        e += ");"
        return eval(e);
    }
        
    function get_XMLHttpRequest()
    {
        var obj = null;
        
        if (window.XMLHttpRequest)
        {
            obj = new XMLHttpRequest();
        }
        else if (window.ActiveXObject)
             {
                 obj = new ActiveXObject("Msxml2.XMLHTTP");
                 
                 if (!obj)
                     obj = new ActiveXObject("Microsoft.XMLHTTP");
             }
             
        return obj;          
    }
        
    function _my_response_handler(index, resp_status, resp_text, output_id)
    {
        return true;
    }
    
    function _ajax_check_status(obj)
    {
        if (obj.readyState == 4 && obj.status == 200) 
            return obj.responseText;
        else    
            return false;
    }
        
    function ajax_request(method, url, params, handler, output_id, force_new)
    {
        if (force_new == null)
            force_new = false;
        
        if (handler == null)
            handler = _my_response_handler;
        
        if (force_new && _ajax_request.length > _request_index)
            _request_index++;    
        
        _ajax_request[_request_index] = get_XMLHttpRequest();
        
        if (!_ajax_request[_request_index])
        {
            message_box('System', 'Sorry, but your browser does not support AJAX.');
            return -1;
        }
        
        var status_handler = function() 
                             {
                                  var resp_text = _ajax_check_status(_ajax_request[_request_index]);
                                  
                                  if (resp_text !== false) 
                                  {
                                      var handler_args = new Array();
                                      handler_args[0] = _request_index;   
                                      handler_args[1] = _ajax_request[_request_index].status;
                                      handler_args[2] = resp_text;      
                                      handler_args[3] = output_id;                          
                                      //my_ajax.getAllResponseHeaders();           
                                      
                                      try 
                                      {
                                          return handler.apply(this, handler_args);
                                      }    
                                      catch(e)
                                      {
                                          return _my_apply(handler, handler_args);
                                      }    
                                  }       
                             }    
        
        _ajax_request[_request_index].onreadystatechange = status_handler;
        _ajax_request[_request_index].open(method, url, true);
        
        if (method == 'POST')
        {
            _ajax_request[_request_index].setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            _ajax_request[_request_index].setRequestHeader("Content-length", params.length);
            _ajax_request[_request_index].setRequestHeader("Accept-Charset", "utf-8");
            _ajax_request[_request_index].setRequestHeader("User-Agent", "GlowAjaxClient/1.2.0 beta");
            _ajax_request[_request_index].setRequestHeader("X-Requested-With", "XMLHttpRequest");
            _ajax_request[_request_index].setRequestHeader("Connection", "close");
            _ajax_request[_request_index].send(params);
        }
        else 
            _ajax_request[_request_index].send(null);
      
        return _request_index;
    }
    
    function ajax_get(url, handler, output_id, force_new)
    {
        return ajax_request("GET", url, null, handler, output_id, force_new);
    }
    
    function ajax_post(url, params, handler, output_id, force_new)
    {
        return ajax_request("POST", url, params, handler, output_id, force_new);
    }
    
    function ajax_abort(index)
    {
        if (_ajax_request.length > index)
            _ajax_request[index].abort();
    }
    
    // UTILITIES
    
    function html_entity_decode(str)
    {
        var result = str;
        result = result.replace('&amp;', '&');
        
        var encoded_entities = new Array(/&amp;/gi, /&lt;/gi, /&gt;/gi, /&agrave;/gi, /&aacute;/gi, /&#269;/gi, /&eacute;/gi, /&#283;/gi, /&iacute;/gi, /&ograve;/gi, /&oacute;/gi, /&#367;/gi, /&uacute;/gi); //&#328;
        var decoded_entities = new Array( '&', '<', '>', 'à', 'á', 'è', 'é', 'ì', 'í', 'ò', 'ó', 'ù', 'ú');
        
        for (var i = 0; i < encoded_entities.length; i++)
            result = result.replace(encoded_entities[i], decoded_entities[i]);
            
        return result;   
    }
    
    // POP-UP
    
    function layer_drag_init(e, id)
    {
        if (id == '')
        {
            drag_layer = parent.document.getElementById('metapopupframe');
            
            if (!drag_layer)
                drag_layer = parent.document.getElementById('popupframe');
                
            if (!drag_layer)
                return false;    
        }
        else
            drag_layer = document.getElementById(id);
        
        var left = parseInt(drag_layer.style.left);
        var top = parseInt(drag_layer.style.top);
      
        offsetX = isIE ? event.clientX - left : e.clientX - left; 
        offsetY = isIE ? event.clientY - top : e.clientY - top;
      
        drag_enabled = true;
        document.onmousemove = layer_drag;
        document.onmouseup = layer_drag_release;
        return true;
    }
    
    function layer_drag(e)
    {
        if (!drag_enabled) 
            return false;
     
        var x = isIE ? event.clientX - offsetX : e.clientX - offsetX; 
        var y = isIE ? event.clientY - offsetY : e.clientY - offsetY;
            
        drag_layer.style.left = x + "px";
        drag_layer.style.top = y + "px";
        return false;  
    }
    
    function layer_drag_release()
    {
        drag_enabled = false;
    }
    
    function get_window_size()
    {
        var win_width = 0;
        var win_height = 0;
        
        if (typeof(window.innerWidth) == 'number') 
        {
            //Non-IE
            win_width = window.innerWidth;
            win_height = window.innerHeight;
        } 
        else if (document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight)) 
        {
            //IE 6+ in 'standards compliant mode'
            win_width = document.documentElement.clientWidth;
            win_height = document.documentElement.clientHeight;
        } 
        else if (document.body && (document.body.clientWidth || document.body.clientHeight)) 
        {
            //IE 4 compatible
            win_width = document.body.clientWidth;
            win_height = document.body.clientHeight;
        }
        
        return [win_width, win_height];
    }
    
    function get_window_scroll()
    {
        var scroll_x = 0;
        var scroll_y = 0;
        
        if (typeof(window.pageYOffset) == 'number') 
        {
            // Netscape compliant
            scroll_y = window.pageYOffset;
            scroll_x = window.pageXOffset;
        } 
        else if (document.body && (document.body.scrollLeft || document.body.scrollTop)) 
        {
            // DOM compliant
            scroll_y = document.body.scrollTop;
            scroll_x = document.body.scrollLeft;
        } 
        else if (document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop))
        {
            // IE6 standards compliant mode
            scroll_y = document.documentElement.scrollTop;
            scroll_x = document.documentElement.scrollLeft;
        }
        
        return [scroll_x, scroll_y];
    }
    
    function get_popup_position(popup_width, popup_height)
    {
        // WINDOW SIZE
        
        var win_size = get_window_size();
                
        // WINDOW SCROLL
        
        var win_scroll = get_window_scroll();
        
        // CALCULATE POSITION
        
        var top = parseInt((win_size[1] - popup_height) / 2) + win_scroll[1];
        var left = parseInt((win_size[0] - popup_width) / 2) + win_scroll[0];
        
        return [top, left];
    }
    
    function _dialog_close()
    {
        document.getElementsByTagName('body')[0].removeChild(document.getElementById('popupbox'));
        return true;
    }
    
    function _dialog_get_value()
    {
        var prompt = document.getElementById('dialogprompt');
        
        if (!prompt)
            return ''; 
        
        return prompt.value;
    }
    
    function _dialog_box(title, message, dlgtype, value, options, callback) 
    { 
        if (document.getElementById('popupbox') != null)
            return false;
               
        var box_w = default_box_width;
        var box_h = default_box_height;      
               
        var close = 'document.getElementsByTagName(\'body\')[0].removeChild(document.getElementById(\'popupbox\'))';
        
        switch (dlgtype)
        {
            case 'prompt': 
                message += '<input id="dialogprompt" value="' + value + '" onKeyPress="if (event && event.keyCode == 13) ' + callback + ';">';
                break;
                
            case 'text':
                message += '<br><textarea id="dialogprompt">' + value + '</textarea>';
                box_h += 60; 
                
                if (options)
                {
                    message += '<br><input type="checkbox" value="1" id="dialogcheck"> ' + options;
                    box_h += 35;
                }
                
                break;    
                
            case 'select':
                var select_input = '<select id="dialogprompt">';
                
                for (var opt_val in options) 
                    if (typeof(options[opt_val]) == 'object')
                    {
                        select_input += '<optgroup label="' + opt_val + '">';
                        
                        for (var opt_item in options[opt_val])
                            select_input += '<option value="' + opt_item + '" ' + ((opt_item == value) ? 'selected' : '') + '>' + options[opt_val][opt_item] + '</option>';
                        
                        select_input += '</optgroup>';
                    }    
                    else
                        select_input += '<option value="' + opt_val + '" ' + ((opt_val == value) ? 'selected' : '') + '>' + options[opt_val] + '</option>';
                
                select_input += '</select>';
                message += select_input;
                break;    
                
            default:;    
        }
       
        var html = '<table cellspacing=0 cellpadding=0 id="dialogheader"><tr>'
                 + '<td><a id="dialogbar" onMouseDown="layer_drag_init(event, \'popupbox\');">' + title + '</a></td>'
                 + '<td width="16"><a class="dialogclose" href="javascript:void(0);" onClick="' + close + '"></a></td>'
                 + '</tr></table>'
                 + '<table class="dialogmessage"><tr><td class="' + dlgtype + '"></td><td>' + message + '</td></tr></table>'
                 + '<table cellspacing=0 cellpadding=0 align="center" id="popupfooter"><tr>';
                 
        var set_input_focus = false;         
                 
        switch (dlgtype)
        {
            case 'confirm':
                html += '<td><a href="javascript:void(0);" class="button" onClick="' + callback + '"><u>Y</u>ES</a></td>' 
                      + '<td><a href="javascript:void(0);" class="button" onClick="' + close + '"><u>N</u>O</a></td>';                      
                break;
                
            case 'prompt':
            case 'text':
                set_input_focus = true;
                
            case 'select':
                html += '<td><a href="javascript:void(0);" class="button" onClick="' + callback + '"><u>O</u>K</a></td>'
                      + '<td><a href="javascript:void(0);" class="button" onClick="' + close + '"><u>C</u>ancel</a></td>';
                break;    
            
            case 'message':
            default:
                html += '<td><a href="javascript:void(0);" class="button" onClick="' + close + '"><u>O</u>K</a></td>';                
        }         
                          
        html += '</tr></table>';          
                
        var dbox = document.createElement('div');    
        dbox.setAttribute('id' , 'popupbox'); 
        document.getElementsByTagName('body')[0].appendChild(dbox);
     
        var dbox_style = eval("document.getElementById('popupbox').style"); 
        
        dbox_style.position = 'absolute';
        dbox_style.width = box_w + "px";
        dbox_style.height = box_h + "px";
      
        var pp = get_popup_position(box_w, box_h);
        
        dbox_style.top = pp[0] + "px";
        dbox_style.left = pp[1] + "px";
                                                                      
        document.getElementById('popupbox').innerHTML = html;
        document.getElementById('popupbox').focus();
        
        var theprompt = document.getElementById('dialogprompt');
        
        if (theprompt && set_input_focus)
            theprompt.focus();
          
        return true;
    }
    
    function message_box(title, message)
    {
        return _dialog_box(title, message, 'message', '', null, '');
    }
        
    function confirm_box(title, message, callback)
    {
        return _dialog_box(title, message, 'confirm', '', null, callback);
    }
    
    function prompt_box(title, message, value, callback)
    {
        return _dialog_box(title, message, 'prompt', value, null, callback);
    }
    
    function text_box(title, message, value, chkopt, callback)
    {
        return _dialog_box(title, message, 'text', value, chkopt, callback);
    }
    
    function select_box(title, message, value, options, callback)
    {
        return _dialog_box(title, message, 'select', value, options, callback);
    }
    
    // ASYNC LOADER
    
    function _set_loading_small(id)
    {
        var element = document.getElementById(id);
        
        if (!element)
            element = parent.document.getElementById(id);
        
        element.innerHTML = '<img id="loadingsmallimg" style="margin:auto;" src="images/loadingsmall.gif">';
        return true;
    }
    
    function _set_loading_error(id, message)
    {
        var element = document.getElementById(id);
        
        if (!element)
            element = parent.document.getElementById(id);
        
        element.innerHTML = '<img id="loadingsmallimg" style="margin:auto;" src="images/warning.png" title="' + message + '">';
        return true;
    }
    
    function _loading_cancel()
    {
        _cancel_show_modal();
        ajax_abort(0);
        return true;
    }
    
    function _loading_complete(request_id, resp_status, resp_text, output_id)
    {        
        document.open("text/html", "replace");     
        document.write(resp_text);
        document.close();
    }
    
    function _loading_start(method, url, form_name, message, cancel)
    {
        method = method.toUpperCase();
        
        if (method == 'POST')
        {
            var params = new Array();
            var theform = document.forms[form_name]; 
                                                
            for (i = 0; i < theform.elements.length; i++)
            {
                if (theform.elements[i].type == 'checkbox' || theform.elements[i].type == 'radio')
                    if (!theform.elements[i].checked)
                        continue;
                
                params[i] = theform.elements[i].name + '=' + encodeURI(theform.elements[i].value);           
            }
                        
            var param_string = params.join('&');               
                        
            loading_id = ajax_post(url, param_string, _loading_complete);
        }
        else
        {
            loading_id = ajax_get(url, _loading_complete);
        }
        
        if (loading_id < 0)
            return false;
                
        var canc = (cancel) ? '_loading_cancel()' : '';
        _set_show_modal(message, canc, false);
        return true;
    }
    
    // MODAL DIALOG BOX
       
    function _cancel_show_modal()
    {
        document.body.removeChild(document.getElementById('popupback'));
        document.body.style.overflow = 'visible';
        return true;
    }
    
    function _wait_over_show_modal()
    {
        document.getElementById('popupback').innerHTML = '';
        return true;
    }
    
    function _set_show_modal(message, cancel, is_meta)
    {
        var popback = document.createElement('div');
        
        if (is_meta)
            popback.id = 'metapopupback';
        else  
            popback.id = 'popupback';
               
        var win_scroll = get_window_scroll();     
               
        popback.style.display = 'block';
        popback.style.width = "100%";
        popback.style.height = "100%";
        popback.style.position = 'absolute';
        popback.style.top = win_scroll[1] + "px";
        popback.style.left = win_scroll[0] + "px";
        popback.style.background = 'url(images/black-70.png) repeat 0 0 transparent'; 
        popback.onclick = function (e) { _popup_close_from(); }        
                
        var lp = get_popup_position(default_loading_width, default_loading_height);        
        
        var msg = '';
        var canc = '';
        
        if (message != '')
            msg = '<span class="loading">' + message + '</span>';
            
        if (cancel != '')
            canc = '<span class="loading_cancel"><a href="javascript:void(0)" onClick="' + cancel + '">Cancel</a></span>';
        
        popback.innerHTML = '<div style="width:'+default_loading_width+'px; height:'+default_loading_height+'px; position:absolute; top:'+lp[0]+'px; left:'+lp[1]+'px; text-align:center;">' 
                          + msg + '<img id="popupbackimg" style="margin:auto;" src="images/loading.gif">' + canc + '</div>';
        
        document.body.appendChild(popback);
        
        document.body.style.overflow = 'hidden';
        return true;
    }
    
    function _popup_open(url, width, height)
    {
        var frm = document.createElement('iframe');
         
        if (frm)
        {
            // check whether a pop-up frame already exists or not
            var existing_popup = parent.document.getElementById('popupframe');
            
            if (existing_popup)
            {
                _set_show_modal('', false, true);
            
                frm.id = 'metapopupframe';
                frm.scrolling = "no";
                frm.style.display = 'block';
                frm.style.width = width + "px";
                frm.style.height = height + "px";
                frm.style.position = 'absolute';
                frm.style.border = 'none';
                             
                var pp_top = parseInt(existing_popup.style.top) - 50;
                var pp_left = parseInt(existing_popup.style.left) + 50;
                
                frm.style.top = String(pp_top) + "px";
                frm.style.left = String(pp_left) + "px";
               
                //frm.onload = _wait_over_show_modal;
                frm.src = url;
                
    			      parent.document.body.appendChild(frm);
            }
            else
            {
                _set_show_modal('', false, false);
            
                frm.id = 'popupframe';
                frm.scrolling = "no";
                frm.style.display = 'block';
                frm.style.width = width + "px";
                frm.style.height = height + "px";
                frm.style.position = 'absolute';
                frm.style.border = 'none';
                            
                var pp = get_popup_position(width, height);
                
                frm.style.top = pp[0] + "px";
                frm.style.left = pp[1] + "px"; 
                
                frm.onload = _wait_over_show_modal;
                frm.src = url;
                
    			      document.body.appendChild(frm);
            }
        }
        else
        {
            var features = 'scrollbars=yes,resizable=yes,status=no,width='+ width +',height=' + height;
            window.open(url, '', features);
        }
        
        return ;
    }
    
    function _popup_close_from()
    {
        // check whether a meta-pop-up frame already exists or not
        var existing_meta = parent.document.getElementById('metapopupframe');
        
        if (existing_meta)
        {
            if (typeof _popup_close_callback == 'function')
            {
                if (!_popup_close_callback())
                    return false;
            }
            else if (typeof existing_meta.contentWindow._popup_close_callback == 'function')
                 {
                     if (!existing_meta.contentWindow._popup_close_callback())
                         return false;
                 }        
            
            //parent.document.body.style.overflow = 'visible';
            
            var body = parent.document.getElementsByTagName('body')[0];
            var frm = parent.document.getElementById('metapopupframe');
            
            var frame_obj = parent.document.getElementById('popupframe');
            var back = frame_obj.contentWindow.document.getElementById('metapopupback');
            var frame_body = frame_obj.contentWindow.document.getElementsByTagName('body')[0];
            
            body.removeChild(frm);
            
            frame_body.removeChild(back);
        }
        else
        {
            var frame_obj = parent.document.getElementById('popupframe');
            
            if (!frame_obj)
            {
                window.close();
                return false;
            }
            
            if (typeof _popup_close_callback == 'function')
            {
                if (!_popup_close_callback())
                    return false;
            }
            else if (typeof frame_obj.contentWindow._popup_close_callback == 'function')
                 {
                     if (!frame_obj.contentWindow._popup_close_callback())
                         return false;
                 }        
            
            parent.document.body.style.overflow = 'visible';
            
            var body = parent.document.getElementsByTagName('body')[0];
            var back = parent.document.getElementById('popupback');
            var frm = parent.document.getElementById('popupframe');
            
            body.removeChild(frm);
            body.removeChild(back);
        }
            
        return true;
    }
    
    function _popup_select_from(callback, close)
    {
        // check whether a meta-pop-up frame already exists or not
        var existing_meta = parent.document.getElementById('metapopupframe');
        
        if (existing_meta)
        {
            var existing_popup = parent.document.getElementById('popupframe');            
            callback = 'existing_popup.contentWindow.' + callback;
        }
        else
        {
            if (parent.document.getElementById('popupframe'))
                callback = 'parent.' + callback;
            else    
                callback = 'window.opener.' + callback;
        }
        
        eval(callback);
        
        if (close)
            _popup_close_from();
        
        return true;    
    }
    
    function _popup_reload_from(url)
    {
        // check whether a meta-pop-up frame already exists or not
        var existing_meta = parent.document.getElementById('metapopupframe');
        
        if (existing_meta)
        {
            var frame_obj = parent.document.getElementById('popupframe');
            
            if (url == '')
                frame_obj.contentWindow.location.reload();
            else    
                frame_obj.contentWindow.document.location.href = url; //frame_obj.src = url;
            
            _popup_close_from();            
        }
        else
        {
            if (url == '')
            {
                parent.window.location.reload();
                return true;
            }
            
            parent.document.location.href = url;
        }
        
        return true;
    }
    
    function _load_image(image_id, url)
    {
        var img = document.getElementById(image_id);
        img.src = url;
        
        return true;    
    }
    
    function iecompattest()
    {
        return (document.compatMode && document.compatMode.indexOf("CSS") != -1) ? document.documentElement : document.body;
    }
    
    function _show_menu(e, menu_items, wstr, x_offset)
    {
        clearhidemenu();
        
        var menuobj = document.getElementById("popitmenu");
        
        if (!menuobj)
        {
            menuobj = document.createElement('div');    
            menuobj.id = "popitmenu";
            menuobj.style.position = "absolute";
            menuobj.style.width = wstr + "px";
            menuobj.onmouseover = clearhidemenu;
            menuobj.onmouseout = delayhidemenu;             
            document.getElementsByTagName('body')[0].appendChild(menuobj);
        }
        
        menuobj.innerHTML = menu_items;
        
        menuobj.contentwidth = menuobj.offsetWidth;
        menuobj.contentheight = menuobj.offsetHeight;
        
        // retrieve event position
        eventX = isIE ? event.clientX : e.clientX;
        eventY = isIE ? event.clientY : e.clientY;
        
        // horizontal position offset
        eventX += x_offset;
        
        // find out how close the mouse is to the corner of the window
        var rightedge = isIE ? iecompattest().clientWidth - eventX : window.innerWidth - eventX;
        var bottomedge = isIE ? iecompattest().clientHeight - eventY : window.innerHeight - eventY;
                   
        // if the horizontal distance isn't enough to accomodate the width of the context menu
        if (rightedge < menuobj.contentwidth)
        {
            if (eventX < menuobj.contentwidth)
                menuobj.style.left = (iecompattest().scrollLeft + 10) + "px";
            else    
                // move the horizontal position of the menu to the left by its width
                menuobj.style.left = isIE ? iecompattest().scrollLeft + eventX - menuobj.contentwidth + "px" : window.pageXOffset + eventX - menuobj.contentwidth + "px";
        }   
        else
        {
            // position the horizontal position of the menu where the mouse was clicked
            menuobj.style.left = isIE ? iecompattest().scrollLeft + eventX + "px" : window.pageXOffset + eventX + "px";
        }
        
        // same concept with the vertical position
        
        if (bottomedge < menuobj.contentheight)
        {
            if (eventY < menuobj.contentheight)
                menuobj.style.top = (iecompattest().scrollTop + 10) + "px";
            else
                menuobj.style.top = isIE ? iecompattest().scrollTop + eventY - menuobj.contentheight + "px" : window.pageYOffset + eventY - menuobj.contentheight + "px";
        }
        else
        {
            menuobj.style.top = isIE ? iecompattest().scrollTop + event.clientY + "px" : window.pageYOffset + eventY + "px";
        }
                    
        menuobj.style.visibility = "visible";
        return false;
    }
    
    function hidemenu()
    {
        var menuobj = document.getElementById("popitmenu");
        
        if (menuobj)
            menuobj.style.visibility = "hidden";
    }
   
    function delayhidemenu()
    {
        delayhide = setTimeout("hidemenu()", 500);
    }
    
    function clearhidemenu()
    {
        if (window.delayhide)
            clearTimeout(delayhide);
    }
