/*
 *   JS used to execute AJAX requests
 */

function ElementMM(tag, attrs) {
	var obj = document.createElement(tag);
	if (attrs != null) {
		for (var i in attrs) {
			obj.setAttribute(i, attrs[i]);
		}
	}

	obj.update = function(t) {
		this.innerHTML = t;
	}

	return obj;
}

    var mmrPriceCache = {};
    
    function getMMRPrices( elementId, mmrMid, mmrVin, mmrMileage ) {
        var mmrKey = 'mid=' + mmrMid + '|vin=' + mmrVin + '|mileage=' + mmrMileage;
        if ( !mmrPriceCache[mmrKey] ) {
            var ajaxUrl = 'getMMRPrices.do';
            new Ajax.Request(ajaxUrl,
            {
                method: 'post',
                evalJSON: true,
                parameters: {mid: mmrMid, vin: mmrVin, mileage: mmrMileage},
                onSuccess: function(transport) {
                    mmrPriceCache[mmrKey] = transport.responseJSON;
                    showMMRPrices( elementId, mmrPriceCache[mmrKey] );
                },
                onFailure: function(){}, 
                onException: function(request, ex){}
            });
        } else {
            showMMRPrices( elementId, mmrPriceCache[mmrKey] )
        }
    }
    
    function showMMRPrices( elementId, mmrPrices ) {
        var mmrTip = '<b>' + mmrPrices.aboveAverageLabel + ':</b> ' + mmrPrices.aboveAverage + '<br/>';
        mmrTip += '<b>' + mmrPrices.averageLabel + ':</b> ' + mmrPrices.average + '<br/>';
        mmrTip += '<b>' + mmrPrices.belowAverageLabel + ':</b> ' + mmrPrices.belowAverage + '';
        
        var mmrHover = new Control.Modal(elementId, { hover: true, position: 'relative', offsetLeft: 60, contents: mmrTip });
        mmrHover.open();
    }

    function reloadToYears(elementId) {
        var fromYear = document.getElementById('year_begin').value;
        if ( fromYear == 'ALL' ) {
            fromYear = 1950;
        }
        var toYear = new Date().getFullYear() + 1;
        
        var options = new Array();
        for ( var i = toYear; i >= fromYear; i-- ) {
            options[options.length] = {'option' : i, 'value' : i};
        }
        updateFormOptions(elementId, options);
    }
    
    function updateFormOptions( elementId, options ) {
    	var optionElement = document.getElementById(elementId);
        if ( optionElement != null ) {
            optionElement.options.length = 0;
            for ( var i = 0; i < options.length; i++ ) {
                optionElement.options.add(new ElementMM('option', { 'value' : options[i].value }));
                optionElement.options[i].update(options[i].option);
            }
        }
    }
    
    function splitArrayValues( values, delim ) {
        var newValues = new Array();
        if ( values != null && values.length > 0 ) {
            for (var i = 0; i < values.length; i++) {
                var tempArray = values[i].split(delim);
                for ( var j = 0; j < tempArray.length; j++ ) {
                    newValues[newValues.length] = tempArray[j];
                }
            }
        }
        return newValues;
    }
    
    function reloadMakes(vehicleTypes, modelObjId)
    {
		var ajaxUrl = '/manheim/get_data.php?mode=makes&vehicleType=' + vehicleTypes;
		var r = sendAJAXRequest(ajaxUrl, '');
		buildSelectParams2(r, modelObjId, null);
    }
    
function buildSelectParams2(a, modelObjId, modelObjVal) {

	try {
		eval('var a=' + a);
	}
	catch (e) {
		return;
	}
	
	var i;
	var c;
	var obj = document.getElementById( ((modelObjId!=null)?(modelObjId):('modelSelector')) );
	c  = obj.options.length;
	for (i = 0; i < c; i++)
	{
		obj.options[0] = null;
	}
	obj.options[obj.options.length] = new Option('ALL', '', false);

	c = a['makes'].length;
	for (i = 0; i < c; i++) {

		var tmpObj = new Option(a['makes'][i]['label'], a['makes'][i]['value'], false);
		if (modelObjVal == a['makes'][i]['value'])
			tmpObj.selected = true;
		obj.options[obj.options.length] = tmpObj;
	}
}

    function updateMakeList( makes, preSelectedMakes ) {
    	var makeListElement = document.getElementById('makeList');
        if ( makeListElement != null ) {
            var isSelectList = (makeListElement.nodeName.toUpperCase() == 'SELECT');
            if ( isSelectList ) {
                makeListElement.options.length = 0;
            } else {
                makeListElement.update('');
            }
            for ( var i = 0; i < makes.length; i++ ) {
                if ( isSelectList ) {
                	makeListElement.options.add(new ElementMM('option', { 'value': makes[i].value }));
                    makeListElement.options[i].update(makes[i].label);
                } else {
                    makeListElement.appendChild(createMakeCheck(makes[i].label, makes[i].value));
                }
            }
            
            if ( !isSelectList ) {
                setAllChecked('makeList', true, preSelectedMakes, false);
            }
            
            var modelDefaults = null;
            if ( initForm ) {
                modelDefaults = getCookieValueAsArray('manheim.powersearch.model', '|');
            }
        
            reloadAllModels(getAllSelections('makeList'), modelDefaults, '')
        }
    }
    
    function createMakeCheck( label, value ) {
    	var itemElement = new ElementMM('li');
    	var labelElement = new ElementMM('label');
    	var checkbox = new ElementMM('input', { 'type': 'checkbox', 'name': 'make', 'className': 'checkbox', 'value': value });
        checkbox.onclick = function() {
            toggleAllCheckbox(this, 'makeList');
            reloadAllModels(getAllSelections('makeList'), null, '');
        };
            
        labelElement.appendChild(checkbox);
        labelElement.appendChild(document.createTextNode(unescape(label)));
        itemElement.appendChild(labelElement);
        
        return itemElement;
    }
    
    function reloadSellers( sellerTypes, defaults ) {
        sellerTypes = splitArrayValues( sellerTypes, '+' );
        if (sellerTypes.length == 0 || sellerTypes[0] == 'ALL' ) {
            updateSellerList( new Array({'label': allLabel, 'value': 'ALL'}), null, true );
        } else {
            var ajaxUrlParams = '';
            for (var i = 0; i < sellerTypes.length; i++) {
                ajaxUrlParams += (i == 0 ? '?' : '&');
                ajaxUrlParams += 'sellerType=' + sellerTypes[i];
            }
    
            var preSelectedSellers = concatArrays( defaults, getAllSelections('sellerList') );
            new Ajax.Request('getSellers.do',
            {
                method: 'post',
                evalJSON: true,
                parameters: ajaxUrlParams,
                onSuccess: function(transport) {
                    updateSellerList( transport.responseJSON.sellers, preSelectedSellers, false );
                },
                onFailure: function(){}, 
                onException: function(request, ex){}
            });
        }
    }
    
    function updateSellerList( sellers, preSelectedSellers, disabled ) {
    	var sellerListElement = document.getElementById('sellerList');
        if ( sellerListElement != null ) {
            sellerListElement.update('');
            for ( var i = 0; i < sellers.length; i++ ) {
                sellerListElement.appendChild(createSellerCheck(sellers[i].label, sellers[i].value, disabled));
            }
            
            setAllChecked('sellerList', true, preSelectedSellers, false);
        }
    }
    
    function createSellerCheck( label, value, disabled ) {
    	var itemElement = new ElementMM('li');
    	var labelElement = new ElementMM('label');
    	var checkbox = new ElementMM('input', { 'type': 'checkbox', 'name': 'sellers', 'className': 'checkbox', 'value': value });
        checkbox.disabled = disabled;
        
        checkbox.onclick = function() {
            toggleAllCheckbox(this, 'sellerList');
        };
            
        labelElement.appendChild(checkbox);
        labelElement.appendChild(document.createTextNode(unescape(label)));
        itemElement.appendChild(labelElement);
        
        return itemElement;
    }
    
    function updatePrice( key, priceVin ) {
        var ajaxUrl = 'getPrices.do';
        new Ajax.Request(ajaxUrl,
        {
            method: 'post',
            evalJSON: true,
            parameters: {vin: priceVin},
            onSuccess: function(transport) {
                // Update page with new bid and buy now prices
            },
            onFailure: function(){}, 
            onException: function(request, ex){}
        });
   }
    
    function addToWorkbook( key, wbVin, wbChannel, wbSaleDate ) {
        // perform Ajax function to save to workbook
        // if complete, perform classname change
        var ajaxUrl = 'addWorkitem.do';
        new Ajax.Request(ajaxUrl,
        {
            method: 'post',
            evalJSON: true,
            parameters: {vin: wbVin, channel: wbChannel, saleDate: wbSaleDate},
            onSuccess: function(transport) {
                checkWorkbook( transport.responseJSON, key );
            },
            onFailure: function(){}, 
            onException: function(request, ex){}
        });
    }
   
    function checkWorkbook( workbook, key ) {
        if ( workbook.status == 'saved' ) {
        	var saveElement = document.getElementById(key);
            if ( saveElement != null ) {
                saveElement.removeClassName('save');
                saveElement.update(workbook.message);
            }
        } else if ( workbook.status == 'overflow' )  {
            alert(workbook.message);
        }
    }
    
    function buildUrl( url ) {
        var newLink = document.createElement('a');
        newLink.href = url;
        return newLink.href;
    }
    
    function updateSavedSearches( key ) {
        GB_hide();
        // Still don't know why this fails without buildUrl wrapper
        var ajaxUrl = buildUrl('refreshSavedSearches.do');
        new Ajax.Request(ajaxUrl,
        {
            method: 'post',
            onSuccess: function(transport) {
                refreshSavedSearches( transport.responseText );
            },
            onFailure: function(){}, 
            onException: function(request, ex){}
        });
    }
    
    function refreshSavedSearches( content ) {
    	var savedSearches = document.getElementById('savedSearches');
        savedSearches.update(content);
        
        var searchCount = 0;
        var elements = savedSearches.getElementsByTagName('li');
        if ( elements != null ) {
            searchCount = elements.length;
        }

        document.getElementById('savedSearchesCount1').update(searchCount);
        document.getElementById('savedSearchesCount2').update(searchCount);
    }
    