It is because the xtype for your dialog is "tabpanel" and tabpanel doesn't have beforesubmit event.
Change the xtype to "dialog" and return false within your beforesubmit handler if your validation fails. This would prevent the dialog from getting submitted.
<?xml version="1.0" encoding="UTF-8"?>
<jcr:root xmlns:cq="http://www.day.com/jcr/cq/1.0"
xmlns:jcr="http://www.jcp.orgjcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0"
jcr:primaryType="cq:Dialog"
title="" xtype="dialog">
<items jcr:primaryType="cq:WidgetCollection"></items>
<listeners jcr:primaryType="nt:unstructured"
beforesubmit="function(dialog){
if(<<!valid>>){
return false;
}
}" />
</jcr:root>