dojo.require("dijit.form.TextBox");
dojo.require("dijit.form.FilteringSelect");
dojo.require("dijit.form.ValidationTextBox");
dojo.require("dijit.form.Form");
dojo.require("dojox.validate");
dojo.require("dojox.validate.web");
dojo.require("dijit.form.Button");
dojo.require("dijit.form.Textarea");
dojo.require("dijit.form.RadioButton");
dojo.require("dijit.form.Select");
dojo.require("dijit.TooltipDialog");
dojo.require("dijit.form.DropDownButton");

dojo.require("dojo.parser");

var receiverTemplate = 0,
    numReceivers = 0,
    receiversCreated = 0,
	dia = 0;


dojo.ready(function()
{
    dojo.declare("fssn.DynValTextBox", dijit.form.ValidationTextBox, {      
		_setConstraintsAttr: function(/*Object*/ constraints){
            this.inherited(arguments);
            this.constraints['widget'] = this;
        }
    });

    dojo.query(".fssnDependentField").forEach(function(el)
    {
		dojo.attr(el, "disabled", true);
    });

    var receivers = dojo.query("div.fssnReceiverBox");

	
	dia = new dijit.TooltipDialog({style: "width: 300px;", id: "ttDialog"});

    receiverTemplate = dojo.clone(receivers[0]);
    numReceivers     = receivers.length;
    receiversCreated = numReceivers;
    
    dojo.query(".fssnNonJsVizHack").forEach(dojo.destroy);

    dojo.parser.parse();
        
    // Call home too..
	//console.warn("Hard coded baseUrl in recregister.js!");
	var url = baseUrl + "/index/poke";
/*    var url = window.location.toString().indexOf("/recregister") != -1 ?
        "/recregister/index/poke" : "/index/poke";*/
    var visitor = dojo.byId("visitorHash").value;
    dojo.xhrGet({url: url, handleAs: "text", content: {visitor: visitor},
            load: function(data) { console.debug("Called home.", data) }});


	dojo.connect(dojo.body(), "click", function(event)
	{
		if(dia && !dojo.hasClass(event.target, "dijitTooltipContents"))
		         dijit.popup.close(dia);
	});
	
});


function addReceiver()
{
    var i = ++receiversCreated,
        clone = dojo.clone(receiverTemplate);
    
    numReceivers++;
    dojo.query("label, select, input, a.fssnTooltipLink", clone).forEach(function(el)
    {
		var name = "";
		if(dojo.attr(el, "name")) name = dojo.attr(el, "name");
		else if(dojo.attr(el, "for")) name = dojo.attr(el, "for");
		else name = dojo.attr(el, "id");

		name = name.split("-")[1];
		/*
        var hasName = dojo.attr(el, "name");
        var name = dojo.attr(el, hasName ? "name" : "for").split("-")[1];
		*/
        name = "r" + i + "-" + name;

        dojo.forEach(["name", "id", "for"], function(attr)
        {
            var hasAttr = dojo.attr(el, attr);
            if(hasAttr) dojo.attr(el, attr, name);
        });
    });
    
    dojo.query(".fssnReceiverNumericName", clone)[0].innerHTML = "Receiver " + i;
    
    dojo.attr(clone, "id", "r" + i + "-box");
    
    dojo.place(clone, "receivers", "last");
    dojo.parser.parse(clone);

    var typeThing = dijit.byId("r" + i + "-type"),
		snHelp    = dijit.byId("r" + i + "-snhelp"),
		fwHelp    = dijit.byId("r" + i + "-fwhelp"),
		chanHelp  = dijit.byId("r" + i + "-chanhelp");

	dojo.connect(snHelp, "onClick", function(evt) {
		showHowTo(snHelp.domNode, "serial");
		dojo.stopEvent(evt);
	});
	dojo.connect(fwHelp, "onClick", function(evt) {
		showHowTo(fwHelp.domNode, "firmware");
		dojo.stopEvent(evt);
	});

	dojo.connect(chanHelp, "onClick", function(evt) {
		showHowTo(chanHelp.domNode, "channel");
		dojo.stopEvent(evt);
	});


    var conn = dojo.connect(typeThing, "onChange", function(value) {
        typeChanged(value, typeThing);
    });
	typeThing.set("value", 0);
    dijit.byId("vesselForm").connectChildren();
	
    fixReceiverHeaders();
}

function delReceiver(evt)
{
    var receivers = dojo.query("div.fssnReceiverBox");

    if(!receivers.length) return;

    for(var i = 0, node = evt.parentNode; 
            i < 3 && !dojo.hasClass(node, "fssnReceiverBox");
            i++);
    
    if(node.id == "r1-box") 
    {
    }
    else
    {
        dojo.destroy(node);
        numReceivers--;
        fixReceiverHeaders();
    }
}


/** Called whenever a receiver type dropdown is changed.
  * If the receiver's other fields have values, they're
  * validated.
  */
function typeChanged(value, select)
{
    var name = select.get("name").split("-")[0],
        fwInput = dijit.byId(name + "-fw"),
        snInput = dijit.byId(name + "-sn"),
        chInput = dijit.byId(name + "-chan"),
        box  = dojo.byId(name + "-box"),
        img  = dojo.query("img.fssnReceiverImg", box)[0];
    
    if( value == 0 )
    {
        // The user has selected first option ("Select one..")
        // So we disable the other fields and show dummy image.
        fwInput.set("disabled", true);
        snInput.set("disabled", true);
        chInput.set("disabled", true);
        img.setAttribute("src", baseUrl + "/img/select_receiver.png");
    }
    else
    {
        var data = getData(value);

        snInput.set("disabled", false);
        fwInput.set("disabled", false);
        chInput.set("disabled", false);

        if( snInput.get("value") != "" ) snInput.validate();
        if( fwInput.get("value") != "" ) fwInput.validate();
        if( chInput.get("value") != "" ) chInput.validate();

        img.setAttribute("src", data.image);
    }
}

function getData(name)
{
    for(var i = 0, l = receiverTypes.length; i < l; i++)
    {
        if(receiverTypes[i].name == name) return receiverTypes[i];
    }
    console.error("Receiver data for '" + name + "' not found!", receiverTypes);
    return null;
}

function validateSerial(serial, foo)
{
    var name = foo.widget.get("id").split("-")[0],
        type = dijit.byId(name + "-type").get("value"),
        rule = getData(type).serialRule,
        regx = new RegExp("^" + rule + "$");

    return regx.test(serial);
}

function validateFirmware(firmware, foo)
{
    var name = foo.widget.get("id").split("-")[0],
        type = dijit.byId(name + "-type").get("value"),
        data = getData(type),
        rule = data.firmwareRule;

    // It may not have a serial rule.
    if(rule)
    {
        var regx = new RegExp("^" + rule + "$");
        foo.widget.set("invalidMessage", data.firmwareInvalidMsg);
        return regx.test(firmware);
    }
    else
    {
        foo.widget.set("invalidMessage", "This value is required.");
        return firmware != "";
    }
}

/** The header in each receiver box should be updated whenever a box is added
  * or removed. */
function fixReceiverHeaders()
{
    var rcv = dojo.query(".fssnReceiverBox"),
        num = rcv.length;

    dojo.query(".fssnReceiverHeader .fssnReceiverNumericName").forEach(function(el, i)
    {
        el.innerHTML = "Receiver " + (i + 1) + " of " + num;
    });

}

function showHowTo(target, foo)
{
    for(var i = 0, node = target;
            i < 9 && !dojo.hasClass(node, "fssnReceiverBox");
            i++, node = node.parentNode);

    var name = node.getAttribute("id").split("-")[0],
        type = dijit.byId(name + "-type").get("value"),
        dia  = dijit.byId("ttDialog"),
        text = "Select a receiver type first.";

    if( type != "0" )
    {
        for(var i = 0, l = receiverTypes.length; i < l; i++)
        {
            if(receiverTypes[i].name == type)
            {
                text = receiverTypes[i][foo + "Info"];
                break;
            }
        }
    }
    dia.set("content", text);
	setTimeout(function() {
		var pos = dojo.position(target);
		dijit.popup.open({popup: dia, around: target}); //x: pos.x + pos.w / 2, y: pos.y + pos.h / 2});
	}, 50);

            
}

function formSubmit(evt)
{
    console.debug(evt);
}

