var optionsBusy = false;
var carTypeId;
var url;
var isSelect;
var optionsChosen;
var added;
var removed;
var dialogdiv;
var shortlistDisabled = false;
var packRuleUrl;
var packRuleId;

function optionsInitialize(id, selIds, dialogId, evaluateOptionsUrl, disableShortlist, evaluatePackRuleOptionsUrl) {
	carTypeId = id;
    isSelect = true;
    added = new Array();    
    removed = new Array();
    url = evaluateOptionsUrl;
    if (disableShortlist)
    	shortlistDisabled = true;
    packRuleUrl = evaluatePackRuleOptionsUrl;
	dialogdiv = $(dialogId);
    doOptionRequest();
}

function optionSelectSwitch(optionId, carTypeId, optionSelector, dialogId){
    if (optionsBusy) {
    	setOptionSelected(optionId, optionSelector.checked);
        showBusyError();
        return false;
    }
	setBusy();
	dialogdiv = $(dialogId);
//	if (!dialogdiv)
//		alert('error: no room for dialog');
	isSelect = optionSelector.checked;
	added = new Array();
	removed = new Array();
	if (isSelect) 
		added.push(optionId);
	else
		removed.push(optionId);
	doOptionRequest();
	return false;
}

function doOptionRequest() {
	var pars = 'carType=' + carTypeId;
	pars += '&select=' + isSelect;
	for (var i = 0; i < added.length; i++) 
		pars += '&added=' + added[i];
	for (var i = 0; i < removed.length; i++) {
		pars += '&removed=' + removed[i];
	}
	pars += '&modus=ajax';
	new Ajax.Request(url, {
		method: 'get', 
		parameters: pars, 
		onSuccess: showResponse,
		onFailure: optionsErrFunc
	});
}

function clearAllOptions() {
	var options = document.getElementsByName('selectedOptionIds');
	for (var i = 0; i < options.length; i++)
		options[i].checked = false;
}

function selectAllOptions(ids) {
	for (var i = 0; i < ids.length; i++)
		setOptionSelected(ids[i], true);
}

function setOptionSelected(optionId, checked) {
    var optionSelector = $('optionSelector_'+optionId);
    if (optionSelector)
		optionSelector.checked = checked;
}

function clearAllPackRuleOptions() {
	var options = document.getElementsByName('selectedSchemePackId');
	for (var i = 0; i < options.length; i++)
		options[i].checked = false;
}

function selectAllPackRuleOptions(ids) {
	for (var i = 0; i < ids.length; i++)
		setPackRuleOptionSelected(ids[i], true);
}

function setPackRuleOptionSelected(optionId, checked) {
    var optionSelector = $('schemePack_'+optionId);
    if (optionSelector)
    	optionSelector.checked = checked;
}

function setBusy(){
	optionsBusy = true;
	document.body.style.cursor = 'wait';
	$('detail_options').style.cursor = 'wait';
	var popup = $('option_popup');
	if (popup)
		popup.style.cursor = 'default';
}

function clearBusy() {
	optionsBusy = false;
	document.body.style.cursor = 'default';
	$('detail_options').style.cursor = 'default';
}

function optionsErrFunc(){
	clearBusy();
	var l = window.location.href;
	window.location.href = l + (l.indexOf('?') >= 0 ? '&' : '?') + 't=' + new Date().getTime();
//	alert('error evaluating options');
}

function parseOptionIds(optionIdTags) {
	var result = new Array();
	if (!optionIdTags)
		return result;
	for (var i = 0; i < optionIdTags.length; i++)
		result.push(optionIdTags[i].firstChild.nodeValue);
	return result;
}

function showResponse(originalRequest) {
	var responseXML = originalRequest.responseXML;
	var dialogs = responseXML.getElementsByTagName('dialog');
	var dialog = dialogs[0];
	var length = dialog.childNodes.length;
	if (length > 0) {
		var addedTags = responseXML.getElementsByTagName('added');
		var removedTags = responseXML.getElementsByTagName('removed');
		var addedOptions = parseOptionIds(addedTags);
		var removedOptions = parseOptionIds(removedTags);
		for (var i = 0; i < addedOptions.length; i++)
			added.push(addedOptions[i]);
		for (var i = 0; i < removedOptions.length; i++)
			removed.push(removedOptions[i]);
		optionsChosen = new Array();

		if (dialogdiv)
			dialogdiv.update(getXMLAsString(dialog));
//		else
//			alert('cannot show dialog')
	} else {
		var selectedTags = responseXML.getElementsByTagName('selected');
		var includedTags = responseXML.getElementsByTagName('included');
		var packRuleTags = responseXML.getElementsByTagName('packRule');
		var selectedOptions = parseOptionIds(selectedTags);
		var includedOptions = parseOptionIds(includedTags);
		var packRuleOptions = parseOptionIds(packRuleTags);
		clearAllOptions();
		selectAllOptions(selectedOptions);
		selectAllOptions(includedOptions);
		clearAllPackRuleOptions();

		selectAllPackRuleOptions(packRuleOptions);

        var replaceList = responseXML.getElementsByTagName('replace');
 		for (var i = 0; i < replaceList.length; i++) {
  			var replacedAjaxElem = replaceList[i];
	        var replacedHtmlElem = $(replacedAjaxElem.getAttribute('id'));
	        if (replacedHtmlElem)
	        	replacedHtmlElem.update(getXMLAsString(replacedAjaxElem));
//			else
//				alert(replacedAjaxElem.getAttribute('id')+' not found')
   	    }
		if (shortlistDisabled)
			disableShortlist(selectedOptions);

	    clearBusy();
	}
}

function disableShortlist(ids) {
	for (i = 0; i < ids.length; i++) {
		var shortlistSelector = $('shortlist_'+ids[i]);
		if (shortlistSelector)
			shortlistSelector.disabled = true;
	}
}

function dialogOptionsChosen(options) {
	optionsChosen = options;
	return true;
}

function doReverseOptionRequest() {
	var pars = 'carType=' + carTypeId;
	pars += '&select=' + isSelect;
	for (var i = 0; i < added.length; i++) 
		pars += '&removed=' + added[i];
	for (var i = 0; i < removed.length; i++) {
		pars += '&added=' + removed[i];
	}
	pars += '&modus=ajax';
	new Ajax.Request(url, {
		method: 'get', 
		parameters: pars, 
		onSuccess: showResponse,
		onFailure: optionsErrFunc
	});
}
function dialogCanceled(id) {
	for (var i = 0; i < optionsChosen.length; i++)
		added.push(optionsChosen[i]);
	doReverseOptionRequest();
	added = new Array();
	removed = new Array();
	dialogdiv.innerHTML = '';
	return false;
}

function dialogAccepted(id) {
	for (var i = 0; i < optionsChosen.length; i++)
		added.push(optionsChosen[i]);
	dialogdiv.innerHTML = '';
	doOptionRequest();
	return false;
}

function packRuleSelectSwitch(optionId, optionSelector){
	if (optionsBusy) {
    	showBusyError();
        return false;
    }
	setBusy();
    isSelect = optionSelector.checked;
	packRuleId = optionId;
	doPackRuleRequest();
	return false;
}

function doPackRuleRequest() {
	var pars = 'selectedPackRuleId='+packRuleId;
	pars += '&select=' + isSelect;
	pars += '&modus=ajax';
	pars += '&t=' + new Date().getTime()

	new Ajax.Request(packRuleUrl, {
		method: 'get', 
		parameters: pars, 
		onSuccess: showResponse,
		onFailure: optionsErrFunc
	});
}
