﻿var Menu = new Class({
    Implements : [Options, Events],
    options : {
			showvisited: false,
			menuitemTag : "li",
			openatstartup : ''
    },
    initialize: function(contentObject, options){
        this.setOptions(options);
        this.initVars();
		this.history.register("lbl",[""], this.getElementByLabel.bind(this),function(values) {
						return ["lbl", '(', values[0], ')'].join('');
					}.bind(this),"lbl" + '\\((\[^)]+)\\)');
	    this.prevDiv = new Element("div",{"class":"prevDiv", "styles": {"display" : "none"}}).inject($(document.body));
		this.contentObject = contentObject;
		this.populateMenu(this.rootElt);
		this.history.start();
		this.fixIELinksHome(null);
		
    },
    fixIELinksHome : function (rootElt){
         $$("a[href=/], a[href=../], a[href=/default.aspx]", rootElt).set({"href" : "javascript:void(0)",
            "events" : {"click" : this.getElementByLabel.pass([["startpage"]], this)}
         });
    },
    initVars:function(){
        this.numOfChanged = 0;
		this.allObjects = new Hash();
		this.hasStartUp = !(this.options.openatstartup == '');
		this.rootElt = $("myMenu");
		this.history = new HistoryManager();
		this.Preloader = new Preloader();
    },
    getElementByLabel : function (label) {
        if(label[0] == "") return false;
        var isInallObjects = $chk(this.allObjects.get(label[0]))
        this.contentObject.getcontent(isInallObjects ? this.allObjects.get(label[0]) : {"label" : label[0]});
        var updateElt = isInallObjects ? this.allObjects.get(label[0]) : this.rootElt;
        if(!isInallObjects){
            this.contentObject.cO.each(function(obj){if($chk(obj.inc)) {if(obj.inc.indexOf(label[0]) >= 0) updateElt = this.allObjects.get(obj.label);}},this);
        }
        this.update(updateElt);
    },
     populateMenu: function(element){
        element.getElements("li.menuitem").each(function(el) {
            if($chk(el.get("id"))){
                $extend($(el), {"label" : this.getLabel(el)});
                this.createMenuPreview(el);
                var linkElt = el.getElement("a");
                if($chk(linkElt) && !el.hasClass("link")){
                    linkElt.href = "javascript:void(0)";
                    linkElt.addEvent('click', this.menuclicked.pass(el,this));
                    if($(el).label != ""){
                        linkElt.addEvents({'click' : this.contentObject.getcontent.pass(el,this.contentObject)});
                        if(this.contentObject.cO.get(el.get('id')) && this.contentObject.cO.get(el.get('id')).p && this.contentObject.cO.get(el.get('id')).p.length > 0) 
                            linkElt.addEvents({'mouseover' : this.showPreview.pass([el,true],this),'mouseout' : this.showPreview.pass([el,false],this)});
                        this.allObjects.set($(el).label,el);
                    }
                }
            }
        },this);
        if(this.hasStartUp) this.getElementByLabel([this.options.openatstartup]);
    },
    getLabel : function (elt) {
        var curObj = this.contentObject.cO.get(elt.get('id'))
        var label = "";
        if($chk(curObj) && $chk(curObj.label)) label = curObj.label;
        return label;
    },
    showPreview : function(elt, bool){
    
        if(!$(elt.get('id') + "_p")) return;
        
        if (Browser.Engine.trident && Browser.Engine.version < 5) return;
        if(this.currentElement == elt) bool = false;
        this.createMenuPreview(elt).setStyle("display",bool ? "block" : "none");        
        this.prevDiv.setStyle("display",bool ? "block" : "none");
    },
    loadNextPreview : function(){
        if(this.prevToLoad[0] && this.shouldLoad) {
            var nextItem = this.prevToLoad[0];
            new Asset.image(nextItem[0], {onload: function(ev){
                                                    ev.inject(nextItem[1]); 
                                                    this.loadNextPreview()
                                                  }.bindWithEvent(this)});
        }
    },
    createMenuPreview : function(elt) {
        if(!this.contentObject.cO.get(elt.get('id'))) return;
        if (Browser.Engine.trident && Browser.Engine.version < 5) return;
        var previewObj = this.contentObject.cO.get(elt.get('id')).p
        if(!$(elt.get('id') + "_p")) {
            var newpreviewObj = []
            var newElt = new Element("div",
                                        {"id" : elt.get('id') + "_p",
                                         "class" : "prev", 
                                         "styles" : {"display" : "none"}}).inject(this.prevDiv);
            //var toPreload = [];
            previewObj.each(function(imgsrc){
                                var aelt = new Element("a",
                                                {"class" : "t",
                                                 "href" : "javascript:void(0)"}).inject(newElt);
                                newpreviewObj.push([imgsrc,aelt]);
                                //if(toPreload.length <= 2) toPreload.include(imgsrc);
                            }, this);
            var cO = this.contentObject.cO.get(elt.get('id'));
            cO.p = newpreviewObj;
            this.contentObject.cO.set(elt.get('id'),cO);
        } else {
            previewObj.each(function(prevElt){this.Preloader.pushImage(prevElt[0],prevElt[1]);}, this);
            return $(elt.get('id') + "_p");
        }
    },
    menuclicked: function(elt){
        elt.addClass("visited");
        this.showPreview(elt,false);
        this.update(elt);
        this.rootElt.fireEvent('onPageChange');
        this.numOfChanged +=1;
        this.history.setValue("lbl",0, elt.label);
        if(elt.hasClass("menuitem")) this.fireEvent('onMenuClicked');
    },
    update: function(elt) {
        if(elt != this.currentElement && !elt.hasClass('active')) {            
            while($chk(this.currentElement) && this.currentElement != this.rootElt){
                this.setInactive(this.currentElement);
                if(this.currentElement.hasClass("activeParent")) this.currentElement.removeClass("activeParent");
                this.currentElement = this.currentElement.getParent()
            }
            elt = $(elt);
            this.currentElement = elt;
            while($chk(elt) && elt != this.rootElt){
                this.setActive(elt);
                elt = elt.getParent();
            }
        } else if(this.options.closeonreclick && elt.hasClass('active')) {
            while($chk(this.currentElement) && this.currentElement != this.rootElt && this.currentElement != elt){
                this.setInactive(this.currentElement);
                this.currentElement = this.currentElement.getParent();
            }
            this.currentElement = elt;
        }
    },
    setActive: function(elt) {
        elt.addClass('active');
    },
    setInactive: function(elt) {
        elt.removeClass('active');
    }
});
var Content = new Class({
    Implements : [Options,Events],
    options : {
			defaultclass : "contentpage",
			transition : "none",
			cO : false
		},
    initialize: function(options){
        this.setOptions(options);
        if(!$chk(this.options.cO)) return false;
		this.cO = $H(this.options.cO);
		this.fireEvent('oninit');
		this.mainpanel = $("contentContainer");
		this.currentelement = $("startpage").addClass('active');
		this.mainTitle = document.title;
		this.loadingDiv = new Element('div',{'id' : 'loadingIcon', 'class' : 'contentpage'}).inject(this.mainpanel);
		this.hideLoading();
		new Element('img',{'alt': 'loading page', 'src': "/assets/ajax-loader.gif"}).inject(this.loadingDiv);
		this.currentRequest = new Request.HTML({url:'/ajax/ReturnPage.aspx', 
		                                        onSuccess:function() { 
		                                                                Content.Transitions[this.options.transition](this.currentelement);
		                                                                this.hideLoading();
		                                                                this.fireEvent("onContentChanged",this.currentelement);}.bind(this),
		                                        onFailure : this.hideLoading.bind(this)});
		if (Browser.Engine.trident && Browser.Engine.version < 7) this.addEvent("onContentChanged", this.fixObjectIE7.bind(this));
    },
    fixObjectIE7:function(elt) {
		$(elt).getElements("hr").each(function (hrElt) {
		    var container = new Element("div",{"class":"separator"}).inject(hrElt,"before");
		    container.set("html","<!-- IE -->");
		    hrElt.destroy();
		});
    },
    getcontent: function(elt){
        if($chk(this.currentelement) && this.currentelement.hasClass('active')) this.currentelement.setStyle('display','none').removeClass('active');
        if($chk($(elt.label)) && $(elt.label).get("html") != ""){
           this.currentelement =  $(elt.label);
           this.currentelement.setStyle('display','none');
           this.currentelement.addClass('active');
           
           window.fireEvent('onRevisit', elt.label);
           Content.Transitions[this.options.transition](this.currentelement);
           if($chk(elt.getElement) && $chk(elt.getElement("a"))) document.title = this.mainTitle + " - " + elt.getElement("a").get("text");
        } else {
           var newDiv = $chk($(elt.label)) ? 
                            $(elt.label).addClass('active') : 
                            new Element('div',{"id" : elt.label,
                                               "class" : "contentpage active",
                                               "styles" : {"display" : "none"}}).inject(this.mainpanel);
           
           this.currentelement = newDiv;
           
           this.currentRequest.cancel();
           this.currentRequest.setOptions("load", {'update' : newDiv}).post({'label' : elt.label});
           if($chk(elt.getElement)) document.title = this.mainTitle + " - " + elt.getElement("a").get("text");
           this.showLoading();
        }
        window.fireEvent("hideAll", elt.label);
    },
    showLoading : function (){
        this.loadingDiv.setStyle('display','block');
    },
    hideLoading : function (){
        this.loadingDiv.setStyle('display','none');
    }
});
Content.Transitions = new Hash ({
	fade: function(newDiv){
	    if(newDiv.getStyle('opacity') != 1) newDiv.fade('in');
	},
	none: function(newDiv) {
	    newDiv.setStyles({"display":"block"});
	}
});
var CategoryPage = new Class({
    initialize: function(fullPanelid, objCats){
        
        var objCats = new Hash(objCats);
        this.container = $(fullPanelid);
        this.catTitles = new Hash();
        this.loadingDiv = new Element('div',{'id' : 'loadingIconCat'}).inject(this.container);
        this.hideLoading();
        this.catDivs = new Element('div',{'class' : 'catDivs'}).inject(this.container);
        this.curkey = null; 
        this.curCat = "none";
        if($chk(this.container.getElement(".ctrls"))) this.container.getElement(".ctrls").setStyle("display","none");
        if($chk(this.container.getElement(".ctrlP"))) this.container.getElement(".ctrlP").addEvent("click", this.getPrevious.bind(this)).set("href",'javascript:void(0)');
        if($chk(this.container.getElement(".ctrlN"))) this.container.getElement(".ctrlN").addEvent("click", this.getNext.bind(this)).set("href",'javascript:void(0)');
        this.catRequest = new Request.HTML({url:'/ajax/ReturnPage.aspx', 
		                                        onSuccess: this.initCat.bindWithEvent(this),
		                                        onFailure : this.hideLoading.bind(this)});
        objCats.each(function (thumb){
            var myObj2 = {"click" : this.requestCat.pass(thumb.link,this)};
            $(thumb.l).addEvents(myObj2).set("href","javascript:void(0)");
            this.catTitles.set(thumb.link,$(thumb.l));
        },this);
        window.addEvent("onRevisit", this.reset.bind(this));
    },
    reset : function (label) {
        if(this.container.get("id") != label) return;
        this.curkey = null;
        this.imagePanelId.empty();
        //this.obj.each(function (thumb,objkey){this.changeImg(objkey,false);},this);
        this.container.getElement(".ctrls").setStyle("display","none");
    },
    requestCat : function(catLabel) {
        myMenu.history.setValue.pass(["lbl",0,catLabel],myMenu.history)
        this.catRequest.cancel();
        if(this.curCat == catLabel) return;
        if($chk(this.container.getElement("div#"+catLabel))) {
            this.setCat(catLabel);
        } else
            this.catRequest.post({'label' : catLabel});
    },
    initCat : function (a,b,c,d) {
        var newC = new Element("div",{"html" : c});
        var newDiv = newC.getElement(".thumbP");
        newDiv.inject(this.catDivs);
        var lbl = newDiv.get("id");
        new ImagesPage(newDiv);
        this.setCat(lbl);
    },
    setCat : function(catLabel) {
        this.container.getElements("div.thumbP").each(function(elt){
                    if(elt.get("id") == catLabel)
                        elt.addClass("active");
                    else 
                        elt.removeClass("active");
                }, this);
        this.curCat = catLabel;
        this.catTitles.each(function(obj) {obj.removeClass("active");});
        this.catTitles.get(catLabel).addClass("active");
    },
    showLoading : function (){
        this.loadingDiv.setStyle('display','block');
    },
    hideLoading : function (){
        this.loadingDiv.setStyle('display','none');
    }
});
var ImagesPage = new Class({
    initialize: function(elt){
        this.obj = new Hash();
        this.container = elt;
        this.container.getElements("a.t, a.v").each(function (thumbLink,ind){
            var key = "i_" + ind;
            var obj = {"elt" : thumbLink, "t" : thumbLink.hasClass("t") ? "i" : "v"}
            thumbLink.addEvents({"click" : this.getImage.pass(key,this)}).set("href","javascript:void(0)");
            this.obj.set(key,obj);
            
        },this);
        this.imagePanel = new Element("div").inject(elt);
        this.container.getElement(".ctrlP").addEvents({"click" : this.getPrevious.bind(this)}).set("href","javascript:void(0)");
        this.container.getElement(".ctrlN").addEvents({"click" : this.getNext.bind(this)}).set("href","javascript:void(0)");
        this.imagePanel.addEvents({"click" : this.getNext.bind(this)});
        this.getImage(this.obj.getKeys()[0]);
    },
    getImage : function (key) {
        var eltObj = this.obj.get(key);
        var elt = eltObj.elt;
        var type = eltObj.t;
        this.imagePanel.empty();
        this.container.getElement(".ctrolstitle").set("html"," " + ($chk(elt.get("title")) ? elt.get("title") : ""));
        switch(type) {
            case "i" : 
                new Element("img",{"src" : elt.get("rel"), "class" : "fullimg"}).inject(this.imagePanel);    
                this.imagePanel.removeEvents("click");
                this.imagePanel.addEvents({"click" : this.getNext.bind(this)});
            break;
            case "v" :
                this._returnVideoElt(elt.get("rel"),this.imagePanel);
                this.imagePanel.removeEvents("click");
            break;
        }
        this.obj.each(function (thumb,objkey){if(objkey==key) thumb.elt.addClass("active"); else thumb.elt.removeClass("active");},this);
        this.curkey = key
    },
    getNext : function (){
       this.getImage(this.obj.getKeys()[(Math.max(0,this.obj.getKeys().indexOf(this.curkey)) + 1) % this.obj.getKeys().length]);
    },
    getPrevious : function (){
       this.getImage(this.obj.getKeys()[(Math.max(0,this.obj.getKeys().indexOf(this.curkey)) - 1 + this.obj.getKeys().length) % this.obj.getKeys().length]);
    },
    _returnVideoElt : function (src, container) {
        new Swiff('/video.swf', {"width": 550,
                                                        "height": 400, 
                                                         vars : {'urlVideo' : src, 
                                                                 'autoPlay' : 'true',
                                                                 'w' : 550,
                                                                 'h' : 400},
                                                         params : {'scale' : 'showall',
                                                                   'bgcolor' : '#000000',
                                                                   'wmode' : 'opaque', 
                                                                   'allowFullScreen' : 'true',
                                                                   'allowScriptAccess' :'sameDomain'}
                                                  }).inject(container);
        
    }
});
var StartPage = new Class({
    initialize: function(imgArr, obj){
        imgArr = imgArr.filter(function(elt) {return $chk(elt);});
        var divElt = new Slideshow($("startpage"),imgArr, obj);
        window.addEvent("hideAll", function(ev){if(ev != 'startpage') divElt.pause(1)});
        window.addEvent("onRevisit", function(ev){if(ev == 'startpage') divElt.pause(0);});
    }
});
var Preloader = new Class({
    initialize: function(){
        this.toDo = [];
        this.toDoId = [];
        this.doneId = [];
        this.isLoading = false;
        this.timeOut = null;
        this.idList = 0;
        this._loadNext.periodical(1000,this);
    },
    pushElement:function(url,container){
         var obj = {"url" : url, "c" : container, "t" : "t", "id" : url};
         this._incudeObj(obj);
    },
    pushImage:function(src,container){
         var obj = {"src" : src, "c" : container, "t" : "i", "id" : src};
         if(this._incudeObj(obj)) this._showWaiter(container);
    },
    _showWaiter:function(container) {
        new Element('div',{'class': "loading"}).inject(container)
    },
    _incudeObj : function(obj){
        this._loadNext();
        if(this.toDoId.contains(obj.id)) {
            this.toDo.erase(obj);
            this.toDo.push(obj);
            return false;
        } else if(this.doneId.contains(obj.id)){
            return false;
        } else {
            this.toDoId.push(obj.id);
            this.toDo.push(obj);
            return true;
        }
        
    },
    _loadNext : function(){
        if(this.isLoading) return false;
        var obj = this.toDo.getLast();
        if(!$chk(obj)) return false;
        switch(obj.t){
            case "i" : 
                this._loadImage(obj);
                break;
            case "t" :
                this._loadText(obj);
                break;
        };
        return true;
    },
    _loadImage : function(obj){
        new Asset.image(obj.src,{onload: function(imgLoaded){
                                                        this.toDo.erase(obj);
                                                        this.toDoId.erase(obj.id);
                                                        this.doneId.push(obj.id);
                                                        imgLoaded.inject(obj.c.empty());
                                                        this.isLoading = false;
                                                        this._loadNext();
                                                        }.bindWithEvent(this),
                                 onerror : function (){this.toDo.erase(obj);
                                                       this.toDoId.erase(obj.id);
                                                       this.toDo.push(obj);
                                                       this.toDoId.push(obj.id);
                                                       this.isLoading = false;
                                                       this._loadNext();}.bind(this),
                                onabort : function (){this.toDo.erase(obj);
                                                       this.toDoId.erase(obj.id);
                                                       this.toDo.push(obj);
                                                       this.toDoId.push(obj.id);
                                                       this.isLoading = false;
                                                       this._loadNext();}.bind(this)});
       this.isLoading = true;
       this._timeOut();
    },
    _loadText : function(obj){
        
    },
    _timeOut : function() {
        $clear(this.timeOut);
        this.timeOut = (function(){this.isLoading = false;}).delay(3000,this);
    },
    _returnId : function(){
        return this.idList++;
    }
});