/* Map of all search fields based on thier search type. */
var _searchFields = {
    basic: ["web_category", "Height", "Collar", "Leg", "Chest", "Bust", "Waist", "Shoe", "Suit", "Dress", "Hip", "Hair", "Eye", "web_years_old"],
    skills: ["model_skill_photographic", "model_skill_promotion", "model_skill_fitting", "model_skill_runway", "model_skill_language", "model_skill_fitness", "model_skill_television", "model_skill_stylist", "model_skill_performance"],
    name: ["web_full_name"]
};
/* Maps the basic fields to display for a specific model type, def defines the default. */
var _catToBasicMap = {    
    male: ["web_category", "Height", "Collar", "Leg", "Chest", "Shoe", "Suit", "Hair", "Eye", "web_years_old"],
    female: ["web_category", "Height", "Bust", "Waist", "Shoe", "Dress", "Hip", "Hair", "Eye", "web_years_old"],
    plusmodelswomen: ["web_category", "Height", "Bust", "Waist", "Shoe", "Dress", "Hip", "Hair", "Eye", "web_years_old"],
    realwomen: ["web_category", "Height", "Bust", "Waist", "Shoe", "Dress", "Hip", "Hair", "Eye", "web_years_old"],
    juniorschildren: ["web_category", "Height", "Shoe", "Hair", "Eye", "web_years_old"],
    def: ["web_category", "Height", "Leg", "Waist", "Shoe", "Hair", "Eye", "web_years_old"]
};
function onHistoryChanged(newLocation, historyData) {    
	deserialiseForm(newLocation);
	var criteriaHash = String(newLocation.sdbmHash());
	if(historyStorage.hasKey(criteriaHash)) {
	    updateSearchResults(historyStorage.get(criteriaHash));
	} else {
	    search();
	}
};
function onSearchWindowLoad() {    
	dhtmlHistory.initialize();
	dhtmlHistory.addListener(onHistoryChanged);
	var criteria = dhtmlHistory.getCurrentLocation();
	if(criteria && criteria !== "") {
		deserialiseForm(criteria);
		var criteriaHash = String(criteria.sdbmHash());
	    if(historyStorage.hasKey(criteriaHash)) {
	        updateSearchResults(historyStorage.get(criteriaHash));
        } else {
			search();
        }
	}
	updateDisplay();
	subscribeListners();
};
function subscribeListners() {
	Event.observe("web_full_name", "keypress", function(event) {
		if(event.keyCode == Event.KEY_RETURN) {
			nameSearch();
			Event.stop(event);
		}
	});	
};
function onBasicHeaderClick() {
    var ele = $("basic-criteria-content");
    if(ele.visible()) {
        ele.hide();
    } else {
        ele.show();
        $("name-criteria-content").hide();
    }
};
function onAdvancedHeaderClick() {
    var ele = $("adv-criteria-content");
    if(ele.visible()) {
        ele.hide();
    } else {
        ele.show();
        $("name-criteria-content").hide();
    }	
};
function onNameHeaderClick() {
    var ele = $("name-criteria-content");
    if(ele.visible()) {
        ele.hide();
    } else {
        ele.show();
        $("basic-criteria-content").hide();
        $("adv-criteria-content").hide();
    }	
};
function deserialiseForm(data) {
	if(data != null && data != "") {
		var params = data.toQueryParams();
		for(name in params) {
			if(name != "" && params.hasOwnProperty(name) && $(name)) {
				$(name).setValue(params[name]);
			}			
		}
	}
};
function updateDisplay() {
    // Show the appropiate basic fields dependent on the current model category.
    var catFields = _catToBasicMap[$("web_category").getValue()] || _catToBasicMap["def"];    
    _searchFields["basic"].each(function(id) {        
        if(catFields.indexOf(id) == -1) {
            $(id).hide().setValue("");
            $("row_" + id).hide();
        } else {
            $(id).show();
            $("row_" + id).show();
        }
    });    
    if(!$("web_full_name").getValue().blank()) {
        $("name-criteria-content").show();
        $("basic-criteria-content").hide();
        $("adv-criteria-content").hide();
    }    
};
function resetBasicFields() {
    _searchFields["basic"].each(function(id) { $(id).setValue(""); });
    updateDisplay();
}
function resetSkillFields() {
    _searchFields["skills"].each(function(id) { $(id).setValue([-1]); });
}
function resetNameFields() {
    _searchFields["name"].each(function(id) { $(id).setValue(""); });    
}
function categoryChanged() {
    updateDisplay();
    criteriaChanged();
}
function criteriaChanged() {
    resetNameFields();        
    $("start").setValue(1);
    search(); 
};
function movePage(start, count, rowsize) {
	$("start").setValue(start);
	$("count").setValue(count);
	$("rowsize").setValue(rowsize);
	search();
};
function nameSearch() {
	resetBasicFields();
	resetSkillFields();
	$("start").setValue(1);
	search();
};
function search() {
    var criteria = $("search-criteria").serialize();
    var criteriaHash = String(criteria.sdbmHash());
    if(!historyStorage.hasKey(criteriaHash)) {        
	    new Ajax.Request(g_db_url + "/(webModelSearch)?OpenAgent&" + criteria,
		    {
			    method: "get",
			    onSuccess: searchCallback,
			    onFailure: searchFailureCallback
  		    });
        onSearching();
  	} else {
  	    updateSearchResults(historyStorage.get(criteriaHash));
  	}
};
function searchCallback(transport) {
	updateSearchResults(transport.responseText);
	if(transport.responseText != null && transport.responseText != "") {
	    var criteria = $("search-criteria").serialize();
        var criteriaHash = criteria.sdbmHash();
        dhtmlHistory.add(criteria, null);
        historyStorage.put(criteriaHash, transport.responseText);
    }
    onSearched();
};
function searchFailureCallback() {
	alert("Something went wrong...");
	onSearched();
};
function updateSearchResults(html) {
	$("searchlist").innerHTML = html;
	if(html) {
		html.evalScripts();
	}
};
function setCountText(resultCount) {
	var message = "";
	var matches = parseInt(resultCount) || 0;	
	if(matches == 0) {
		message = "No models match your criteria";
	} else if(matches == 1) {
		message = "Only one model matches your criteria!";
	} else {
		message = matches + " models match your criteria";
	}
	$("counter").innerHTML = message;
};
function onSearching() {
    $("loading").show();
}
function onSearched() {
    $("loading").hide();
}
