var listeners = {onLoad:{},onUnload:{},onTabChange:{}},evDepth = 0;

window.onload=function() {
    callListeners('onLoad',null,true);
}

function getListeners(eventName,target) {
    var l = listeners[eventName];
    if (!l) return alert("Unknown event: "+eventName);
    var t = l[target];
    if (!t) l[target] = t = [];
    return t;
}

function callListeners(eventName,target,args) {
    if (!target) target = undefined;
    var l = getListeners(eventName,target);
    for (var i=0; i<l.length; ++i) l[i](target,args);
}

function listen(eventName,fn,target) {
    var l = getListeners(eventName,target);
    if (l) l.push(fn);
}

function unlisten(eventName,fn,target) {
	if (!target) target = undefined;
    var l = getListeners(eventName,target);
    for (var n = 0; n < l.length; ++n)
        if (l[n] == fn) {
            l.splice(n,1);            
            return;
        }
    alert("Can't unregister " + eventName + " listener:\n" + fn); 
}

function $id(id) {
    return document.getElementById(id);
}

function $f(name) {
    if (name) return document.forms[0][name];
    return document.forms[0];
}

function exists(name) {
    return window[name] != undefined;
}

function unset(name) {
    window[name] = undefined;
}

function go(url,ev) {
	location = url;
	if (ev) stopPropagation(ev);
}

function doAction(name,param) {
    $f('_action').value = name + (param? ':' + param : '');
    $f().action = location.href; //update url (ex. the hash may have changed)
    if (Form_onSubmit())
        $f().submit();
}

function addEvent(e,evName,fn) {
    if (e.addEventListener) {
        e.addEventListener(evName,fn);  
        return true;
    }
    else if (e.attachEvent)
        return e.attachEvent('on' + evName,function() {
            event.target = event.srcElement;
            fn(event);
        });
    else e['on' + evName] = fn;
}

function stopPropagation(ev) {
    if (window.event && window.event.cancelBubble != undefined)
        window.event.cancelBubble = true;
    if (ev && ev.stopPropagation)
        ev.stopPropagation();
}

function preventDefault(ev) {
    if (window.event && window.event.returnValue != undefined)
        window.event.returnValue = false;
    if (e && e.preventDefault)
        e.preventDefault();
}

function focusField(name) {
    setTimeout(function(){
        var e=document.forms[0].elements[name];
        if(e){
            if(e.length) e=e[1];
            try {
                e.focus();
            }
            catch(x){}
        }
    },1);
}

function Form_onSubmit(ev)
{
    if (window.onSubmit) return window.onSubmit($f());
    return $f('_action').value != '';
}

function $form(e) {
    if(e.form) return e.form;
    while(e=e.parentNode)
      if (e.nodeName=='FORM') return e;
    return null;
}

function ImageField_blank(uid,className) {
    var i=$id(uid);
    var e=document.createElement('DIV');
    e.className='emptyImg'+(className?' '+className:'');
    i.replaceChild(e,i.childNodes[1]);
    return e;
}

function ImageField_clear(uid)
{
    ImageField_blank(uid);
    $id(uid+'Field').value='';
    e=$id(uid+'File');
    if (e.outerHTML) e.outerHTML=e.outerHTML;
    else e.value='';
    Button_disable(uid+'Clear');
}

function ImageField_onChange(uid)
{
    var e=ImageField_blank(uid,'upload');
    var src=$id(uid+'File').value;
    if (!src.match(/.jpg$|.jpeg$/i)) alert("Atenção!\n\nVerifique se o ficheiro seleccionado\nse encontra no formato JPEG!");
    src=src.match(/(?:\\|\/|^)([^\\\/]*)$/);
    e.innerHTML='<div class="label">'+src[1]+'</div>';
    Button_enable(uid+'Clear');
}

function ImageField_onOver(e)
{
    e.previousSibling.className+=" over";
}

function ImageField_onOut(e)
{
    e=e.previousSibling;
    e.className=e.className.replace(/over/,'');
}

function Button_onDelete(what,param)
{
    if (confirm("Tem a certeza de que deseja apagar "+what+"?"))
        doAction('delete',param);
}

function Button_enable(id) {
    var button=$id(id);
    if (!Button_isEnabled(id)) {
        button.disabled=false;
        button.firstChild.className=button.firstChild.className.replace(/ ?disabled/,"");
    }
}

function Button_disable(id) {
    var button=$id(id);
    if (Button_isEnabled(id)) {
        button.disabled=true;
        button.firstChild.className=button.firstChild.className+=" disabled";
    }
}

function Button_isEnabled(id) {
    return !$id(id).disabled;
}

function saveScrollPos(form) {
    form.elements.scroll.value=document.getElementsByTagName("HTML")[0].scrollTop;    
}

function scroll(y) {
    if (y==undefined) y=9999;
    setTimeout(function(){document.getElementsByTagName("HTML")[0].scrollTop=y},1);
}

function ActiveElement_init() {
    this.onmousedown=Active_down;
    this.onmouseup=Active_up;
}

function Active_down() {
    this.className=this.className+=" active";
    this.setCapture();
}

function Active_up() {
    this.releaseCapture();
    this.className=this.className.replace(/ ?active/,"");
}

function Button_init() {
    this.hideFocus=true;
    this.onmousedown=Button_down;
    this.onmouseup=Button_up;
    this.onkeydown=Button_keyDown;
    this.onkeyup=Button_keyUp;
    this.onblur=Button_blur;
    this.onfocus=Button_focus;
}

function Button_down() {
    this.firstChild.className=this.firstChild.className+=" active";
    this.setCapture();
}

function Button_up() {
    this.releaseCapture();
    this.firstChild.className=this.firstChild.className.replace(/ ?active/,"");
}

function Button_keyDown() {
    if(event.keyCode==13||event.keyCode==32) Button_down.call(this);
}

function Button_keyUp() {
    if(event.keyCode==13||event.keyCode==32) {
        Button_up.call(this);
        this.click();
    }
}

function Button_focus() {
    this.firstChild.className=this.firstChild.className+=" focus";
}

function Button_blur() {
    this.firstChild.className=this.firstChild.className.replace(/ ?focus/,"");
}

function Tab_init() {
    this.onmouseover=Tab_over;
    this.onmouseout=Tab_out;
}

function Tab_over() {
    if (this.className.indexOf("selected")<0)
      this.className+=" hover";
}

function Tab_out() {
    this.className=this.className.replace(" hover","");
}

function Tab_change(tabFld,tabsId,url) {
    var hasPages = false;
    Tabs_enumerate(tabsId,function(i,tab,tabFld,page) {
        tab.className=tab.className.replace(/ ?selected| ?hover/g,"");
        if (page) hasPages = true;
    });
    addClass(tabFld.parentNode,'selected');
    if (url) go(url);
    else if (hasPages) //page display may take some time
        setTimeout(function() {
            Tabs_enumerate(tabsId,function(i,tab,tabFld,page) {
                if (!tabFld.checked) Tab_hidePage(page);
            });
            Tabs_enumerate(tabsId,function(i,tab,tabFld,page) {
                if (tabFld.checked) { 
                    if (Tab_showPage(page) && tabsId) callListeners('onTabChange',tabsId);
                    return 1;
                }
            });
        },1);
}

function Tab_showPage(page) {
    if (page && page.className.indexOf('TabPage_selected') < 0) {
        addClass(page,'TabPage_selected');
        if (!page.firstChild) {
            ++evDepth;
            var html = window[page.id + 'Content'];
            page.innerHTML = html;
            var match,r = new RegExp('<script.*?>([\\s\\S]*?)<\\/script>','g'),f=false;
            while (match = r.exec(html)) eval(match[1]);
            if (evDepth == 1) callListeners('onLoad',null,false);
            --evDepth;
        }
        return true;
    }
    return false;
}

function Tab_hidePage(page) {
    if (page && page.className.indexOf('TabPage_selected') >= 0) {
        //callListeners('onUnload',null,false);
        removeClass(page,'TabPage_selected');
        //page.innerHTML = '';
    }
}

function Tabs_getSelectedIndex(tabsId) {
    return Tabs_enumerate(tabsId,function(idx,tab,tabFld) {
        if (tabFld.checked) return parseInt(tabFld.value);
    });
}

function Tabs_setSelectedIndex(tabsId,i) {
    return Tabs_enumerate(tabsId,function(idx,tab,tabFld) {
        if (i == idx) {
            tabFld.checked = true;
            Tab_change(tabFld,tabsId);
            return;
        }
    });
}

function Tabs_enumerate(tabsId,fn) {
    for (var i = 0;;++i) {
        tab = $id(tabsId + 'Tab' + i + "Field");
        if (!tab) break;
        else {
            var r = fn(i,tab.parentNode,tab,NthChild($id(tabsId + 'Pages'),i));
            if (r != undefined) return r;
        }
    }
    return null;
}

function NthChild(e,n) {
	if (e) {
	    var c = e.firstChild;
	    while (c) {
	        if (c.nodeType == 1 && n-- == 0) return c;
	        c = c.nextSibling;
	    }
	}
}

function fixImgPng() {
  this.runtimeStyle.behavior="none";
  if (this.nodeName=="IMG"&&this.src.match(/\.png/i)) {
      this.runtimeStyle.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+this.src+"')";
      this.src="/WTO/web/themes/framework/assets/images/empty.gif";
  }
}

function fixBkPng() {
  this.runtimeStyle.behavior="none";
  var url=this.currentStyle.backgroundImage;
  if (url.match(/\.png/i)) {
    url=url.match(/\(['"]?(.*?)['"]?\)/)[1];
    this.runtimeStyle.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+url+"',sizingMethod='crop')";
    this.runtimeStyle.backgroundImage="none";
  }
}

function FCKeditor_OnComplete(fck) {
    fck.EditorWindow.parent.document.body.style.visibility = '';
   
}

function number(n,defaultValue) {
    n = parseFloat(n);
    if (isNaN(n)) return defaultValue;
    return n;
}

function addClass(e,className) {
    removeClass(e,className);
    e.className += ' ' + className;
}

function removeClass(e,className) {
    e.className=e.className.replace(new RegExp(' ?' + className),'');
}
