gallerynavControl=function(eid,list)
{
    if($(arguments).size()<1)
        throw new Error("Incorrect number of minimum parameters supplied when creating a Gallery Navigator Control.");
    if($("#"+eid)==undefined)
        throw new Error("Could not find anything with id="+eid+" when creating a Gallery Navigator Control.");

    this.target=$("#"+eid); // container of photo gallery
    /* spiral order
    00 - 01 - 02 - 03 - 04
                        |
    05 - 06 - 07 - 08   09
    |              |    |
    10   11 - 12   13   14
    |    |         |    |
    15   16 - 17 - 18   19
    |                   |
    20 - 21 - 22 - 23 - 24
    */
    this.mylist=list || [12, 11, 16, 17, 18, 13, 8, 7, 6, 5, 10, 15, 20, 21, 22, 23, 24, 19, 14, 9, 4, 3, 2, 1, 0]; // a possibility to change order of photos
    // this.mylist=list||[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24];

    this.Data=[];

    this.imagesToHide=[];

    var me = this;


    this.Init=function()
    {
        if($("#"+this.target.id+" a"))
        {
            me.ParseDataIn();
            me.Decorate();
            me.firstLoaded=true;
            me.MouseOverLink({target:$("div.linksWrapper a:first-child")},true);
        }
    }


    /*
    * Gathers data to array Data from dl,dt and dd nodes
    */
    this.ParseDataIn=function() {
        $("dl dt a").each(function (loop) {
            me.Data[loop]={
                'loop':loop,
                'name':$(this).attr('title'),
                'href':$(this).attr('href'),
                'title':$(this).attr('title')
            };
        });

        $("dl dd img:first-child").each(function (loop) {
            me.Data[loop].imagealt=$(this).attr('alt');
            me.Data[loop].imagesrc=$(this).attr('src');
        });
    };

    /*
    * Makes links and images bloks in list order
    */
    this.Decorate=function() {
        var imagesWrapper = jQuery.create('div', {'class':'imagesWrapper'});
        var linksWrapper = jQuery.create('div', {'class':'linksWrapper'});
/*
var alertstr="";
for(var key in me.Data){
    for(var key2 in me.Data[key]){
        alertstr+=[key2," = ",me.Data[key][key2],"\n"].join("");
    }
    alertstr += "\n";
}
alert(alertstr);
*/
        for(var idx = 0; idx < me.Data.length; idx++) {
            var imlink = jQuery.create('a', {
                'href':me.Data[me.FindRelatedLink(idx)].href,
                'title':me.Data[me.FindRelatedLink(idx)].title
            });
            $(imlink).bind("click",function(){$(this).blur();});

            var image = jQuery.create('img', {
                'src':me.Data[me.FindRelatedLink(idx)].imagesrc,
                'alt':'',
                'dtIdx':me.FindRelatedLink(idx),
                'imgPos':idx
                });
            $(image).bind("mouseover",me.MouseOverImage);
            $(image).bind("mouseout",me.MouseOutImage);
            $(imlink).append(image);
            $(imagesWrapper).append(imlink);

            var link = jQuery.create('a', {
                'href':me.Data[idx].href,
                // 'title':me.Data[idx].title,
                'dtIdx':idx,
                'imgPos':me.GetOrderedIndex(idx),
                'innerHTML':me.Data[idx].name
                });
            $(linksWrapper).append(link);
            $(link).bind("mouseover",me.MouseOverLink);
            $(link).bind("mouseout",me.MouseOutLink);
        }

        $('.gallerynavControl').html('').append(imagesWrapper);
        $('.gallerynavControl').append(linksWrapper);

        me.imagesWrapper=imagesWrapper;
        me.linksWrapper=linksWrapper;
    };


    /*
    * Means to order photos
    */
    this.GetOrderedIndex=function(index)
    {
        var orderedIndex=this.mylist[index];
        if(orderedIndex==undefined||orderedIndex==null)
            orderedIndex=index;
        return orderedIndex;
    };


    this.FindRelatedLink=function(pos)
    {
        for(var loop in this.mylist)
        {
            if(me.mylist[loop]==pos)
                break;
        }
        return loop;
    };


    /*
    * Events handlers
    */
    this.MouseOverLink=function(eventData,userTriggered)
    {
        if(userTriggered===true)
            var node=eventData.target;
        else
            var node = $(this);

        $('div.linksWrapper a').removeClass('hilite');
        $(node).addClass('hilite');

        if(!me.firstLoaded)
            me.HideImage();
        me.firstLoaded=false;

        me.lastSelectedElement=node;    // ??? нужна эта строчка?

        var pos=$(node).attr('imgPos');

        $(".imagesWrapper img").each(function(loop,e) {
            if(loop==pos)
                me.RevealImage(e);
        });
    };


    this.MouseOverImage=function()
    {
        var node = $(this);
        var pos=$(node).attr('dtIdx');
        $('div.linksWrapper a').removeClass('hilite');

        if(!me.firstLoaded)
            me.HideImage();
        me.firstLoaded=false;

        $(".linksWrapper a").each(function(loop,e) {
            if(loop==pos)
                $(e).addClass('hilite');
        });
        me.RevealImage(node);
    };


    this.MouseOutLink=function(eventData){};

    this.MouseOutImage=function(eventData){};

    /*
    * Switches highlight on
    */
    this.RevealImage=function(node)
    {
        $(node).addClass('hilite');
        var index = parseInt($(node).attr('imgPos'));

        var nCols=(me.Data.length==25)?5:(me.Data.length==16)?4:(me.Data.length==9)?3:(me.Data.length==4)?2:1;
        me.imagesToHide=[index];

        var immediate=[index-nCols,index+nCols];

        if(index%nCols>0)
        {
            immediate[immediate.length]=index-nCols-1;
            immediate[immediate.length]=index-1;
            immediate[immediate.length]=index+nCols-1;
        }

        if(index%nCols<nCols-1)
        {
            immediate[immediate.length]=index-nCols+1;
            immediate[immediate.length]=index+1;
            immediate[immediate.length]=index+nCols+1;
        }

        for(var loop=0,max=immediate.length;loop<max;loop++)
        {
            if(immediate[loop]>-1&&immediate[loop]<me.Data.length)
            {
                $(".imagesWrapper img").each(function(i,e) {
                    if(i==immediate[loop])
                        $(e).addClass('immediateNeighbour');
                });
                me.imagesToHide[me.imagesToHide.length]=immediate[loop];
            }
        }

        if(nCols>3)
        {
            var distant=[index-nCols-nCols,index+nCols+nCols];
            if(index%nCols>0)
            {
                distant[distant.length]=index-nCols-nCols-1;
                distant[distant.length]=index+nCols+nCols-1;
            }
            if(index%nCols>1)
            {
                distant[distant.length]=index-nCols-nCols-2;
                distant[distant.length]=index-nCols-2;
                distant[distant.length]=index-2;
                distant[distant.length]=index+nCols-2;
                distant[distant.length]=index+nCols+nCols-2;
            }
            if(index%nCols<nCols-1)
            {
                distant[distant.length]=index-nCols-nCols+1;
                distant[distant.length]=index+nCols+nCols+1;
            }
            if(index%nCols<nCols-2)
            {
                distant[distant.length]=index-nCols-nCols+2;
                distant[distant.length]=index-nCols+2;
                distant[distant.length]=index+2;
                distant[distant.length]=index+nCols+2;
                distant[distant.length]=index+nCols+nCols+2;
            }

            for(var loop=0,max=distant.length;loop<max;loop++)
            {

                if(distant[loop]>-1&&distant[loop]<me.Data.length)
                {
                    $(".imagesWrapper img").each(function(i,e) {
                        if(i==distant[loop])
                            $(e).addClass('distantNeighbour');
                    });
                    me.imagesToHide[me.imagesToHide.length]=distant[loop];
                }
            }
        }
    };


    /*
    * Switches highlight off
    */
    this.HideImage=function()
    {
        for(var loop=0,max=me.imagesToHide.length;loop<max;loop++)
        {
            $(".imagesWrapper img").each(function(i,e) {
                if(i==me.imagesToHide[loop])
                {
                    $(e).removeClass('immediateNeighbour');
                    $(e).removeClass('distantNeighbour');
                    $(e).removeClass('hilite');
                }
            });
        }
        me.imagesToHide=null;
        delete me.imagesToHide;
    };

    me.Init();

};
