function CameraSelector(camFld, lensFld)
{
    this.cameraField = $(camFld);
    this.lensField = $(lensFld);
    this.makeSel = null;
    this.modelSel = null;
    this.lensMakeSel = null;
    this.lensSel = null;
    if (document.location.host == "localhost") {
	    this.requestURL = "request.php";
	} else {
	    this.requestURL = "/cameradb/request.php";
	}
};
CameraSelector.makeForElement = function(element) {
    var inputs = $(":input",$(element));
    var cameraField = $(inputs[0]);
    var lensField = $(inputs[1]);

    var camSelector = new CameraSelector(cameraField, lensField);

    if ($("select.camSelMake", $(element)).length == 0) {
        $(element).append($("<select/>").attr("class","camSelMake"))
                  .append($("<select/>").attr("class","camSelModel"))
                  .append($("<select/>").attr("class","camSelLensMake"))
                  .append($("<select/>").attr("class","camSelLens"));
    }
    camSelector.findSelectsInDOM(element);
    camSelector.initialize();

    return camSelector;
};
CameraSelector.prototype = {
    setSelects : function(makeSel, modelSel, lensMakeSel, lensSel, lensLabel) {
        var _self = this;
        this.makeSel = $(makeSel).change(function(el) { _self.changedMake($(el.target).val()); });
        this.modelSel = $(modelSel).change(function(el) { _self.changedModel($(el.target).val()); });
        this.lensMakeSel = $(lensMakeSel).change(function(el) { _self.changedLensMake($(el.target).val()); });
        this.lensSel = $(lensSel).change(function(el) { _self.changedLens($(el.target).val()); });
		this.lensLabel = $(lensLabel);
    },
    
    findSelectsInDOM : function(parentEl) {
        var makeSel = $(".camSelMake",$(parentEl));
        var modelSel = $(".camSelModel",$(parentEl));
        var lensMakeSel = $(".camSelLensMake", $(parentEl));
        var lensSel = $(".camSelLens",$(parentEl));
		var lensLabel = $(".camLabelLens", $(parentEl));
        this.setSelects(makeSel, modelSel, lensMakeSel, lensSel, lensLabel);
    },
    
    fillMakes : function() {
        var makeSel = this.makeSel;
        var makeVal = this.cameraField.attr("make");
        $.getJSON(this.requestURL, {t:"m",f:"j"},
            function(data){
                makeSel.empty().append($("<option disabled>- Make -</option>"));
                $.each(data.items, function(i,item){
                    makeSel.append($("<option/>").attr("value",item.Make).text(item.Make));
                });
                makeSel.val(makeVal);
            });
    },
    
    fillModels : function(make, camId) {
        var modelSel = this.modelSel;
        $.getJSON(this.requestURL, {t:"c",d:"l",f:"j","weq[camera.make]":make},
            function(data){
                modelSel.empty().append($("<option disabled>- Model -</option>"));
                $.each(data.items, function(i,item){
                    modelSel.append($("<option/>").attr("value",item.CameraId)
                                                  .attr("reqlens",item.RequiresLens)
                                                  .text(item.Model));
                });
                if (camId) modelSel.val(camId);
            });
    },
    
    fillLensMakes : function(camId) {
        var lensMakeSel = this.lensMakeSel;
        lensMakeSel.show();
        this.lensSel.empty().show();
        this.lensLabel.show();
        $.getJSON(this.requestURL,{t:'lmake',d:'l',f:'j',c:camId},
            function(data){
                lensMakeSel.empty().append($("<option disabled>- Lens Make -</option>"))
                                   .append($("<option selected>All Lenses</option>").attr("value",''));
                $.each(data.items, function(i,item){
                    lensMakeSel.append($("<option/>").attr("value",item.Make).text(item.Make));
                });
            });
    },
    
    fillLenses : function(camId, lensMake, lensId) {
        var opticId = 1;
        var lensSel = this.lensSel;
        lensSel.empty().show();
		this.lensLabel.show();
		var reqParams = {t:"l",d:"l",f:"j","c":camId,"o":opticId};
		if (lensMake) reqParams["weq[lens.make]"] = lensMake;
        $.getJSON(this.requestURL, reqParams,
            function(data){
                lensSel.append($("<option disabled>- Lens -</option>"));
                lensSel.append($("<option value=\"0\">Show All</option>"));
                $.each(data.items, function(i,item){
                    lensSel.append(
                        $("<option/>").attr("value",item.LensId).text(item.Make + ' ' + item.Model)
                    );
                });
                if (lensId) lensSel.val(lensId);
            });
    },
    
    prefill : function() {
        var _self = this;
        var cameraId = this.cameraField.val();
        var lensId = this.lensField.val();
        // Get info on the selected camera
        $.getJSON(this.requestURL,{t:"c",d:"l",f:"j","weq[camera.camera_id]":cameraId},
            function(data){
                $.each(data.items, function(i,cam){
                    _self.cameraField.attr("make",cam.Make);
                    _self.makeSel.val(cam.Make);
                    // Pre-fill model selector
                    _self.modelSel.empty()
                                  .append($("<option/>").attr("value",cameraId)
                                                        .attr("reqlens",cam.RequiresLens)
                                                        .text(cam.Model))
                                  .append($("<option disabled>loading cameras...</option>"))
                                  .val(cameraId);
                    _self.fillModels(cam.Make, cameraId);
                    if (cam.RequiresLens) {
                        _self.fillLensMakes(cameraId);
                        _self.fillLenses(cameraId, null, lensId);
                    }
                });
            });
    },
    
    changedMake : function(makeValue) {
        this.modelSel.empty()
                     .append($("<option disabled>- Model -</option>"));
        this.fillModels(makeValue, 0);
        this.lensSel.hide();
		this.lensLabel.hide();
        this.cameraField.val('');
    },
    
    changedModel : function(cameraId) {
        this.lensSel.empty()
                    .append($("<option disabled>- Lens -</option>"));
        this.cameraField.val(cameraId);
        this.lensField.val('');
        
        reqLens = $("option[value="+cameraId+"]",this.modelSel).attr("reqlens");
        if (reqLens == "1") {
            this.fillLensMakes(cameraId);
            this.fillLenses(cameraId, null, 0);
        } else {
            this.cameraField.change();
            this.lensMakeSel.hide();
            this.lensSel.hide();
			this.lensLabel.hide();
        }
    },
    
    changedLensMake : function(makeValue) {
        this.lensSel.empty().append($("<option disabled>- Lens -</option>"));
        this.lensField.val('');
        this.fillLenses(this.cameraField.val(), makeValue, 0);
    },
    
    changedLens : function(lensId) {
        this.lensField.val(lensId).change();
    },

    initialize : function() {
        this.makeSel.empty().append($("<option disabled>- Make -</option>"));
        this.lensMakeSel.hide();
        this.lensSel.hide();
		this.lensLabel.hide();
        this.fillMakes();
        if (this.cameraField.val() > 0) {
            this.prefill();
        }
    }
};

$(document).ready( function() {
	$.each($(".cameraSelector"),function (i,el) { CameraSelector.makeForElement(el); });
});
