/********************************************************************************
AJAX FUNCTIONALITY CLASS
********************************************************************************/

var AJAX = {

    // Show Debug on AJAX => (0,1)
    Debug: 0,
    
    add_option: null,
    add_logging: null,
    add_command: null,
    add_revert: null,   
    id: null,
    perform: null,
    rand: null,
    request: null,
    request_in_action: null,
    request_timer: 0,
    response: null,
    timeout: 30,
    xmlhttp: null,
    user_token_id: null,
    
    //Define styles
    titlebar_colour: "#e3e7df",
    result_border_style: "2px #CCC solid",

    /****************************************
    *                                       *
    *     HTTP Object                       *
    *                                       *
    ****************************************/
    getHTTPObject: function () {            

        // MOZILLA / SAFARI
        if (window.XMLHttpRequest) {
            AJAX.xmlhttp = new XMLHttpRequest();
        }
        // IE
        else if (window.ActiveXObject) {
            AJAX.xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        } return AJAX.xmlhttp;

    },

    
    /****************************************
    *                                       *
    *     REQUEST DATA                      *
    *                                       *
    ****************************************/
    request_object: function (url, target, func, type) {
    
        if (typeof(type) == "undefined") {
            type = 'GET';
        }
    
        AJAX.request = AJAX.getHTTPObject();

        if (AJAX.request) {
            AJAX.request.onreadystatechange = function() {
              if (AJAX.request && AJAX.request.readyState == 4) {       
                try {
                    var status = AJAX.request.status;
                }
                catch(e) {
                    //setTimeout(function() { AJAX.request_object(url, func); }, 1000);
                } 
    
                if (AJAX.request && typeof(status) == "number") {   
                    switch (status) {                       
                        case 200 :          
                            // If there is a fucntion defined, run once status is fulfilled
                            if (typeof(func) != "undefined") {                          
                                //alert('Function: '+func+'\n URL: '+url);
                                func(AJAX.request);
                            } 
                            if (target != "") {
                                var obj = document.getElementById(target);
                                obj.innerHTML = AJAX.request.responseText;
                                AJAX.end_request();
                            } else {
                                AJAX.end_request();
                                return;
                            }
                            
                        break;
                        
                        case 404 : 
                            AJAX.response = "File not found: " + url;
                            AJAX.end_request();
                        break;
                        
                        case 0 : break;
    
                        default : AJAX.response = "There was a problem sourcing the request<br>The error code returned was : " + AJAX.request.status;
    
                    }                       
                }               
              } 
             AJAX.request_in_action = true;

             AJAX.request_timer = setTimeout(
                function() {
                    if (AJAX.request_in_action) {
                       AJAX.request.abort();
                       AJAX.request_object(url, target, func, type);
                    }
                },
                AJAX.timeout * 1000
            ); 
            }
        
        AJAX.request.open(type, url, true);
        AJAX.request.send(null);
        
        }
    },
    
    end_request: function() {
        AJAX.request_in_action = false;
        clearTimeout(AJAX.request_timer);
    },

    

    
    /****************************************
    *                                       *
    *               LOGGING                 *
    *                                       *
    ****************************************/
    
    log_rating: function () {
        AJAX.rand = Math.random();          
        url = '/account/ajax_log_rating.html?r='+AJAX.rand;
        AJAX.request_object(url, '', AJAX.log_rating_response, 'GET'); 
    },
    
    log_rating_response: function () {
        if(AJAX.request.readyState == 4) {
            results = AJAX.request.responseText.split("|");
            if (results[0] == AJAX.rand) {
                if (AJAX.Debug)getRef('xmlid').value = results[1];
            }
        }
    },
    
    
    /*********************************************************************************
    *                                                                                *
    *     LISTINGS: ADD, REMOVE, UPDATE                                              *
    *    -------------------------------                                             *
    *                                                                                *
    *       ajaxMode = (                                                             *
    *           1 => 'quick',           2 => 'slim detail',  3 => 'full detail',     *
    *           10 => 'prioritise',     4 => 'only button'   5 => 'bonus disc',      *
    *       )                                                                        *
    *                                                                                *
    *       perform = mandatory_options('Load', 'Add', 'Reserve', 'Remove')          *
    *                                                                                *
    *********************************************************************************/
    check_in_rent_list: function (action, id, ajaxMode, perform, media, logging) {
        AJAX.rand = Math.random();
        AJAX.id = id;
        if ((media == 'DVD') || !media || (media == "")) {
            AJAX.add_title(action, id, ajaxMode, perform, logging);
        } else {
            AJAX.add_command = action;
            AJAX.add_option = ajaxMode;
            AJAX.perform = perform;             
            AJAX.add_logging = logging;
            
            AJAX.load_area_update(id, perform);
            url = '/account/ajax_checkInRentList.html?r='+AJAX.rand+'&product_id='+id;
            AJAX.request_object(url, '', AJAX.check_in_rent_list_response, 'GET');    
        }
    },
        
    check_in_rent_list_response: function () {
        if(AJAX.request.readyState == 4) {
            results = AJAX.request.responseText.split("|");
            if (AJAX.add_option != 10) {
                if (results[0] == AJAX.rand) {
                    var media = results[1];
                    var catalog = results[2];
                    if (results[3] <= 0) {
                        if (confirm("Are you sure you want to add this "+media+" title?\n("+media+" titles are not currently in your list)")) {
                            AJAX.add_title(AJAX.add_command, AJAX.id, AJAX.add_option, AJAX.perform, AJAX.add_logging);
                        } else {
                            getRef('buttons'+AJAX.id).innerHTML = AJAX.add_revert;
                        }
                    } else {                    
                        AJAX.add_title(AJAX.add_command, AJAX.id, AJAX.add_option, AJAX.perform, AJAX.add_logging);
                    }
                }
            } else {
                AJAX.add_title(AJAX.add_command, AJAX.id, AJAX.add_option, AJAX.perform, AJAX.add_logging);
            }
        }
                
    },

    
    /****************************************
    *           ADD TITLE                   *
    ****************************************/   
    add_title: function (action, id, ajaxMode, perform, logging) {
        AJAX.rand = Math.random();
        AJAX.add_command = action;
        AJAX.add_option = ajaxMode;
                  
        AJAX.load_area_update(id, perform);         
              
        var add_url = '/account/ajax_add_title.html?r='+AJAX.rand+'&'+action+'='+id+'&ajax_add_option='+AJAX.add_option+'&user_token_id='+AJAX.user_token_id;
        
        if (logging) add_url += '&logging=1';
              
        if (ajaxMode != '4') {
            AJAX.request_object(add_url, '', AJAX.add_title_response, 'GET');
        } else {
            AJAX.request_object(add_url, '', AJAX.add_title_response_button, 'GET');
        }
    },
    
    add_title_response_button: function () {
        perform = AJAX.perform;
        if(AJAX.request.readyState == 4) {
            results = AJAX.request.responseText.split("|");
            if (results[0] == AJAX.rand) {
                if (AJAX.Debug) getRef('xmlid').value = results[1];
                //if (results[2]>0) {
                //    getRef('rentalListCount').innerHTML = parseInt(getRef('rentalListCount').innerHTML) + parseInt(results[2]);
                //} else {
                    getRef('rentalListCount').innerHTML = parseInt(getRef('rentalListCount').innerHTML)+1;
                //}
                if (AJAX.add_option != 10) {
                    //alert('ID: '+AJAX.id+'\n Result[1]: '+results[1]);
                    AJAX.load_area_done(results[1], perform);   
                }
            }
        }
    },
    
    add_title_response: function () {
        perform = AJAX.perform;
        if(AJAX.request.readyState == 4) {
            results = AJAX.request.responseText.split("|");
            var discs = ''; 
            if (results[0] == AJAX.rand) {
                var media = results[3];
                if (AJAX.Debug) getRef('xmlid').value = results[1];
                if (results[2]>=0 && perform != 'Reserv') { // dot do this is is a reserved title
                    if (results[2]>0) {
                        discs = " "+ results[2] +" discs";
                 //       getRef('rentalListCount').innerHTML = parseInt(getRef('rentalListCount').innerHTML) + parseInt(results[2]);
                        getRef('rentalListCount').innerHTML = (parseInt(getRef('rentalListCount').innerHTML)+1)+' titles';
                    } else {
                        discs = "";
                        getRef('rentalListCount').innerHTML = (parseInt(getRef('rentalListCount').innerHTML)+1)+' titles';
                    }
                }
                var ajax_add_menu = "<a href=\"/account/selection.html\">Rental list</a>";
                if (media.toLowerCase() == 'dvd') ajax_add_menu +=  "| <a href=\"#\" onclick=\"AJAX.update_priority("+results[1]+",'product_id'); return false;\" >Similar titles...</a>";
                if (AJAX.add_option != 3 && AJAX.add_option != 10) ajax_add_menu +=  " | <a href=\"#\" onclick=\"AJAX.add_title('"+AJAX.add_command+"',"+results[1]+",10, 'Load'); return false;\">Prioritise delivery</a>";
                if ((AJAX.add_option != 10) && (AJAX.add_option != 1)) getRef('inlineT'+results[1]).innerHTML = perform+"ed"+ discs +"! <span>" +ajax_add_menu+ "</span>";
                else getRef('inlineT'+results[1]).innerHTML = " <span>" +ajax_add_menu+ "</span>";
                
                if (AJAX.add_option != 10) {                
                    AJAX.load_area_done(results[1], perform);   
                    getRef('inlineB'+results[1]).style.background = AJAX.titlebar_colour;
                    //getRef('ajaxItemRow'+results[1]).style.border = AJAX.result_border_style;
                }
                
                if (AJAX.add_option == 2) {
                    AJAX.show_content('activate'+results[1],25,400);
                } else {
                    if (AJAX.add_option == 3) {                 
                        // Full detail                      
                        //getRef('rowThumbImg'+results[1]).style.display = "none";
                        getRef('inlineC'+results[1]).innerHTML = results[4];                        
                        AJAX.show_content('activate'+results[1],120,400);
                        
                        
                    } else {
                        if (AJAX.add_option == 10) {
                            // Title to be prioritised
                            //getRef('rowThumbImg'+results[1]).style.display = "none";
                            getRef('inlineC'+results[1]).innerHTML = results[4];
                            getRef('inlineB'+results[1]).style.background = AJAX.titlebar_colour;
                            AJAX.show_content('activate'+results[1],120,400);
                        }
                    }
                }
            }
        }  
    },    

    
    
    /****************************************
    *           UPDATE TITLE                *
    ****************************************/   
    update_priority: function (id, action, priority, parent_id) {
    
        if (!parent_id) parent_id = false;
        AJAX.rand = Math.random();
        var priority;
        var multi;
        
        var url = '/account/ajax_update_title.html?r='+AJAX.rand+'&'+action+'='+id;
        
        if (action == 'update_priority') {
            if (!priority) priority = false;
            eval("multi = document.f_"+id+".m_"+id+".value;");
            url += "&priority="+priority+"&series_order="+multi;
        }
        if (parent_id) {
            url += "&parent_id="+parent_id;
            id = parent_id;
        }       
        if (AJAX.Debug) getRef('xmlname').value = url;
        
        var loadingText = 'Loading...';     
        if (action == 'remove_from_rental_list') loadingText = 'Removing...';
        
        getRef('inlineT'+id).innerHTML = "<span class=\"ajaxloading\">"+loadingText+"</span>";
        
        AJAX.request_object(url, '', AJAX.update_priority_response, 'GET');
    },
    
    update_priority_response: function () {
        if(AJAX.request.readyState == 4) {
            results = AJAX.request.responseText.split("|");
            if (results[0] == AJAX.rand) {              
                if (AJAX.Debug) {
                    getRef('xmlid').value = results[1];
                    getRef('xmlpriority').value = results[2];
                }               
                //getRef('rowThumbImg'+results[1]).style.display = "none";
                getRef('inlineT'+results[1]).innerHTML = results[3];
                getRef('inlineB'+results[1]).style.background = AJAX.titlebar_colour;
                if (results[4] == 'Y') {
                    getRef('inlineC'+results[1]).innerHTML = results[5];
                    AJAX.show_content('activate'+results[1],164,400);
                }
            }
        }
    },
    
    
    /****************************************
    *           HIDE TITLE                  *
    ****************************************/   
    hide_item: function (id,action) {
        AJAX.rand = Math.random();
        
        getRef('allbuttons'+id).innerHTML = "<div class=\"ajaxloading\" style=\"float: right\">Hiding...</div>";
        
        url = '/account/ajax_hide_item.html?r='+AJAX.rand+'&'+action+'='+id+'&user_token_id='+AJAX.user_token_id;
        
        AJAX.request_object(url, '', AJAX.hide_item_response, 'GET');
    },
    hide_item_response: function () {
        if(AJAX.request.readyState == 4) {
            results = AJAX.request.responseText.split("|");
            if (results[0] == AJAX.rand) {              
                if (AJAX.Debug)getRef('xmlid').value = results[1];              
                //getRef('ajaxItemRow'+results[1]).style.display = 'none';
                AJAX.show_content('ajaxItemRow'+results[1],0,400);
            }
        }
    },  
    

    /****************************************
    *           REMOVE TITLE                *
    ****************************************/
    
    remove_title: function (action,id,ajaxMode,perform,media) {
        AJAX.rand = Math.random();
        AJAX.add_option = ajaxMode;
        AJAX.load_area_update(id, perform);
        
        url = '/account/ajax_remove_item.html?r='+AJAX.rand+'&'+action+'='+id+'&user_token_id='+AJAX.user_token_id;
        
        AJAX.request_object(url, '', AJAX.remove_title_response, 'GET');    
                    
    },
    
    remove_title_response: function () {
        //alert(AJAX.perform); // if ajax perform is remove, i can get rid of the 'perform'
        //perform = AJAX.perform;
        if(AJAX.request.readyState == 4) {
            results = AJAX.request.responseText.split("|");
            if (results[0] == AJAX.rand) {
                
                var media = results[2];
                if (AJAX.Debug) getRef('xmlid').value = results[1];
                getRef('rentalListCount').innerHTML = (parseInt(getRef('rentalListCount').innerHTML)-1)+' titles';
                
                if (AJAX.add_option != 5) {             
                    if (AJAX.add_option != 4) {
                        var ajax_add_menu = "<a href=\"/account/selection.html\">Rental list</a>";
                        if (media.toLowerCase() == 'dvd') ajax_add_menu +=  " | <a href=\"#\" onclick=\"AJAX.update_priority("+results[1]+",'product_id'); return false;\" >Similar titles..</a>";
                        if (AJAX.add_option != 1) getRef('inlineT'+results[1]).innerHTML = AJAX.perform+"ed! <span>" +ajax_add_menu+ "</span>";
                        else getRef('inlineT'+results[1]).innerHTML = " <span>" +ajax_add_menu+ "</span>";
                    }
                    
                    AJAX.load_area_done(results[1], AJAX.perform);              
                    
                    if ( (AJAX.add_option != 1) && (AJAX.add_option != 4) ) {
                        getRef('inlineB'+results[1]).style.background = AJAX.titlebar_colour;
                        getRef('inlineC'+results[1]).style.display = "none"; // there should be no data in this DIV
                        AJAX.show_content('activate'+results[1],25,400);
    
                    }               
                } else {
                    getRef('bonusDisc'+results[1]).innerHTML = "<span style=\"color:red;\">The bonus disc has been removed</span>";
                }
                
                
            }
        }
    },
    
    
    /****************************************
    *                                       *
    *           LOADING BUTTONS             *
    *                                       *
    ****************************************/   
    load_area_update: function (id, perform) {
        if (perform == 'reserve') perform = 'Reserv';
        if (perform == 'add') perform = 'Add';
        if (perform == 'remove') perform = 'Remov';
        AJAX.perform = perform;
        var imgSrc = '/'+BRAND.name;
        var loadingArea = 'buttons';
        var loadingText = '<img src=\"'+imgSrc+'/images/buttons/'+perform+'ing.gif\" alt=\"'+perform+'ing...\" border=\"0\"  align=\"right\" />';

        if (AJAX.add_option == 10) {
            loadingArea = 'inlineT';
            loadingText = '<span class=\"ajaxloading\" >'+perform+'ing...</span>';
        } else if (AJAX.add_option == 5) {
            loadingArea = 'bonusDisc';
            loadingText = '<span class=\"ajaxloading\" >'+perform+'ing...</span>';
        } else {
            AJAX.add_revert = getRef(loadingArea+id).innerHTML;
        }
        getRef(loadingArea+id).innerHTML = loadingText;
    },

    
    load_area_done: function (result_id, perform) {
        //alert('added');
        var imgSrc = '/'+BRAND.name;
        getRef('buttons'+result_id).innerHTML = "<img src=\""+imgSrc+"/images/buttons/"+perform+"ed.gif\" alt=\""+perform+"ed\" border=\"0\" align=\"right\" />";
    },
    
    
      
    /****************************************
    *                                       *
    *     SCROLL EFFECT                     *
    *                                       *
    ****************************************/   
    show_content: function (target, length, speedfactor) {
    
        getRef(target).style.display = 'block';
        var currentLength = parseInt(getRef(target).style.height);
        var containerHeight;
    
        if (currentLength != length && length != 0) {
            //containerHeight = new fx.Height(target, {duration: speedfactor});
            //containerHeight.hide();
            //containerHeight.toggle();                   
        
        } else if (length == 0) {
            //Hide the box once the toggle is complete
            //containerHeight = new fx.Height( target , { 
                //duration: speedfactor, onComplete: function() {
                   //containerHeight.hide();
                   //getRef(target).style.display = 'none';
                //}
            //});
            getRef(target).style.display = 'none';
            //containerHeight.toggle();
        } else {
            length = currentLength;
        }
        
        if (AJAX.Debug) getRef('currentLength').value = currentLength;
    }
}



