var communitiesWithIssueTypes = {} ;

function jasperBootstrap()
{
    AddListener(window, "load", function() { AddClickListeners(); PrepareIssueTypesForCommunities(); } );  
}

function PrepareIssueTypesForCommunities()
{
    var xmlhttp = false;
    try 
    {
        xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    } 
    catch (e) 
    {
        try 
        {
            xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        } 
        catch (E) 
        {
            xmlhttp = false;
        }
    }
    
    if (!xmlhttp && typeof XMLHttpRequest != 'undefined') 
    {
	try 
        {
	    xmlhttp = new XMLHttpRequest();
	} 
        catch (e) 
        {
	    xmlhttp = false;
	}
    }
 
    if (!xmlhttp && window.createRequest) 
    {
	try 
        {
	    xmlhttp = window.createRequest();
	} 
        catch (e) 
        {
	    xmlhttp = false;
	}
    }
    
    if ( xmlhttp )
    {
        xmlhttp.open("GET", "/?samo-sadrzaj", true);
 	xmlhttp.onreadystatechange = function() 
	    {
                if ( xmlhttp.readyState == 4 ) 
                {
		    ImportIssueTypesFromXML(xmlhttp.responseXML);                    
                }
             }
        xmlhttp.send(null);
    }
}

function ImportIssueTypesFromXML(xml)
{
    var foundCommunityNodes = FindCommunityNodes(xml);

    for(var i=0; i < foundCommunityNodes.length; i++) 
    {
        var allowedTypeNodes = foundCommunityNodes[i].getElementsByTagName('issue-type');
        var allowedTypes = [];
        
        for(var j=0; j < allowedTypeNodes.length; j++)
        {
            allowedTypes.push({ "label": allowedTypeNodes[j].getAttribute('label'), 
                                "value": allowedTypeNodes[j].getAttribute('option-value') 
                              } );
        }
	
        communitiesWithIssueTypes[foundCommunityNodes[i].getAttribute('id')] = allowedTypes;
    }
}

function FindCommunityNodes( xml )
{
    var communities = [];
    if (xml && xml != null)
    {
        var components = xml.getElementsByTagName('representation-component');

        for(var i=0; i < components.length; i++)
        {
            if(components[i].getAttribute('name') == 'com.ingemark.trex.community.CommunityListSC')
            {
                communities = components[i].getElementsByTagName('community'); 
                break;
            }
        }
    }
    
    return communities;
}

function AddClickListeners()
{
    var elements = document.getElementsByName("idz");
    if (elements && elements.length > 0 )
    {
        if ( elements[0].type == "checkbox" )
        {
            for(i = 0; i < elements.length; i++)
            {
	        AddListener(elements[i], 'click', function() { ManageIssueTypes() } );
            }  
        }
        else if ( elements[0].type == "select-multiple" )
	{
            AddListener(elements[0], 'change', function() { ManageIssueTypes() } );
	}
    }
} 

function ManageIssueTypes()
{
    var uniqueIssueTypes = UniqueIssueTypesForSelectedCommunities();
    var issueTypes = document.getElementsByName("vrsta");
   
    if ( issueTypes && issueTypes.length > 0 )
    {
        if ( issueTypes[0].type == "checkbox" )
        {
            if ( uniqueIssueTypes.length == 0 )
            {
		for(var i = 0; i < issueTypes.length; i++)
                {
                    issueTypes[i].parentNode.parentNode.style.display = 'block';
                }
            }
            else
            {
                var displayedIssueTypes = [];
                for(var i = 0; i < issueTypes.length; i++)
                {
                    if ( issueTypes[i].value in oc( uniqueIssueTypes, 'value' ) && 
                         ! ( issueTypes[i].value in oc(displayedIssueTypes, 'value' ) ) )
                    {
                       displayedIssueTypes.push( issueTypes[i].value );
                       issueTypes[i].parentNode.parentNode.style.display = 'block';
                    }
                    else
                    {
                       issueTypes[i].parentNode.parentNode.style.display = 'none';
                    }
                }

                if ( displayedIssueTypes.length == 0 )
                {
                    for(var i = 0; i < issueTypes.length; i++)
                    {
                        issueTypes[i].parentNode.parentNode.style.display = 'block';
                    }
                }
            }
        }
        else if ( issueTypes[0].type == "select-multiple" )
        {
            for(var i = issueTypes[0].options.length - 1; i >= 0; i--)
            {
		issueTypes[0].remove(i);
            }
            
           for(var i = 0; i < uniqueIssueTypes.length; i++ )
           {
               var issueType = document.createElement("OPTION");
	       issueType.text = uniqueIssueTypes[i].label;
	       issueType.value = uniqueIssueTypes[i].value;
               issueTypes[0].options.add(issueType);
           }
        }            
    }
}

function UniqueIssueTypesForSelectedCommunities()
{
    var communities = document.getElementsByName("idz");
    var issueTypes = []
    if (communities && communities.length > 0 )
    {
        communityList = false;
         
        if ( communities[0].type == "checkbox" )
        {
	    communityList = communities;
        }
        else if (communities[0].type == "select-multiple")
        {
            communityList = communities[0].childNodes;
        }    
        
        if ( communityList )
        {
            for(var i=0; i < communityList.length; i++ )
            {
               if ( communityList[i].checked == 1 || communityList[i].selected )
               {
                    issueTypes = issueTypes.concat( communitiesWithIssueTypes[communityList[i].value] );
               }
            }
            
            if ( issueTypes.length == 0 )
            {
                for(var i=0; i < communityList.length; i++ )
                {
                    issueTypes = issueTypes.concat( communitiesWithIssueTypes[communityList[i].value] );
                }
            }
        }
    }

    return unique(issueTypes);
}

function AddEvent(obj, functionName, functionCode) 
{
     eval("var oldEvent = obj.on" + functionName + ";");
    
     if (oldEvent != null) 
     {
         var additionalEvents = "obj.on" + functionName + " = function(e) { oldEvent(e); functionCode(); };"
         eval(additionalEvents);
     } 
     else 
     {
         eval("obj.on" + functionName + " = functionCode;");
     }
}

function AddListener(obj, functionName, functionCode) 
{
     if (obj.addEventListener) 
     {
         obj.addEventListener (functionName, functionCode, false );
     } 
     else if (obj.attachEvent) 
     {
         obj.attachEvent( "on" + functionName, functionCode);
     } 
     else 
     {
         AddEvent(obj, functionName, functionCode);
     }
     return true;
}

function unique(a)
{
   var r = new Array();
   o:for(var i = 0, n = a.length; i < n; i++)
   {
      for(var x = 0, y = r.length; x < y; x++)
      {
         if( r[x].value == a[i].value ) continue o;
      }
      r[r.length] = a[i];
   }
   return r;
}

function oc( a, functionName )
{
    var o = {};
    for(var i=0; i< a.length; i++)
    {
        eval("o[a[i]." + functionName + "]=''");
    }
    return o;
}
