var LightboxForm=new Class({
	initialize:function (name,properties,lightboxProperties) {
		this.name=name;
		this.properties=properties;
		this.lightboxProperties=$merge(LightboxForm.lightboxProperties,lightboxProperties);
	},
	show:function (name,callback) {
		Mantis.FormGenerator.FormGeneratorService.GetFormSource(this.name,this.properties || null,function (source) {
			var form=Element.fromMarkup(source,{ callback:function () {
				new Lightbox(form,this.lightboxProperties).show();
				if (callback) callback();
			}.bind(this) });
		}.bind(this));
	}
});
$extend(LightboxForm,{
	show:function (name,properties,lightboxProperties) { new LightboxForm(name,properties,lightboxProperties).show(); }
});

LightboxForm.lightboxProperties={ };

var Work = {
    isLowlight: false,
    currentFade: null,
    currentPage: 1,
    init: function() {
        var h = location.hash.substr(2);
        if (h.length) {
            var params = h.split("/");
            Work.currentPage = params[0];
            Work.requstedWork = params[1];
        }
        
        Config.siteUrl = 'http://' + window.location.hostname + "/";

        Work.scroller = new Fx.Scroll(document.body);
        Work.initPlayer();
    },

    loadList: function(byTag) {
        Mantis.Rhino.UI.Services.WorkLobby.GetWorkSourceByTag(Tag.currentTagId, Work.currentPage,
			function(source) {
			    if (source.length == 0) {
			        $("preloader").hide();
			        return;
			    }
			    var list = new Element('div').setHTML(source);
			    $waitUntil(
					function() {
					    return !!list.getElement('.border');
					},
					function() {
					    Work.initList(list);
					    Work.initPageing(byTag, list);
					}
				);
			}
		);
    },

    initList: function(list) {
        var c = new Chain();
        var length = list.getElements("li.item").length;

        $("preloader").hide();

        list.getElements("li.item").each(function(li, i) {
            if (i == 0) Work.currentOpenedElement = li;
            else if (!li.hasClass("empty") && Work.requstedWork == li.getElement("img").get("workurlname")) Work.currentOpenedElement = li;
            li.setStyle("opacity", "0");
            $("work-list").adopt(li);
            $("tool-tip").setStyle("opacity", "0");

            var lowlight = new Element("span", { "class": "lowlight" }).setStyle("opacity", "0");
            li.adopt(lowlight);

            var fx = new Fx.Morph(li.getElement(".border"), { duration: 150, transition: Fx.Transitions.Sine.easeOut });
            lowlight.fx = li.getElement(".lowlight").get('tween', { property: 'opacity', duration: 400 });
            li.fx = new Fx.Tween(li);

            c.chain(function() {
                reveal(li, i);
            });

            //Work.playEffect(fx,0,0,70,54);
            if (!li.hasClass("empty")) {
                fx.element.addEvents({
                    "mouseover": function() {
                        Work.showTooltip(li, true);
                        if (Work.last && Work.last == li) return;
                        if (!Work.isLowlight) Work.lowlightOtherWorks(li);
                        fx.cancel();
                        Work.playEffect(fx, -6, -6, 76, 60);
                    },
                    "mouseout": function(e) {
                        Work.showTooltip(li, false);
                        if (Work.last && Work.last == li) return;
                        Work.lightWorks();
                        fx.cancel();
                        Work.playEffect(fx, 0, 0, 64, 48);
                    }
                });
            }
        });

        var runChain = function() {
            c.callChain();
            if (c.$chain.length == 0) {
                runChain = $clear(timer);
            }
        };

        var timer = runChain.periodical(50);

        function reveal(li, i) {
            li.fx.start("opacity", 1);
            var workId = Work.getWorkId(li);
            if (workId == Work.currentWorkId) {
                Work.open(li);
            }
            else if (i == length - 1) {
                Work.open(Work.currentOpenedElement);
            }
        };

        var workList = $("work-list");

        if (workList) {
            workList.delegateEvent("click", "li", function(e) {
                if (!this.hasClass("empty")) Work.open(this);
            }, true, true);
        };

        $(document.documentElement).addEvent("mouseover", function(e) {
            if (e.target != $("work-list") && e.target != $("work") && e.target != $("content") && e.target != $("content-body") && e.target != $("side-menu") && e.target != $("player") && e.target != $("wrapper")) return;
            if (Work.isLowlight) Work.lightWorks();
        });
    },

    open: function(relative) {
        location.hash = "/" + Work.currentPage + "/" + relative.getElement("img").get("workurlname");
        Work.pauseVideo();
        var workId = Work.getWorkId(relative);
        Tracker.track("/WorkOpen?workId=" + workId);
        Work.fireEvent("onOpening", [workId]);

        if (Work.currentOpenedWorkId == workId) return;
        if (Work.isLowlight) Work.lightWorks();
        Work.isOpened = true;

        //relative.addClass("current");		

        var fx = new Fx.Morph(relative.getFirst(), { duration: 50, transition: Fx.Transitions.Sine.easeOut });
        Work.playEffect(fx, 0, 0, 64, 48);

        var playEffect = function() {
            if (!relative.getElement(".current-border")) {
                var curr = new Element("div", { "class": "current-border" });
                relative.adopt(curr);
            } else {
                relative.getElement(".current-border").show();
            }
            Work.removeEvent("onWorkPlayEffectComplete", playEffect);
        };

        Work.addEvent("onWorkPlayEffectComplete", playEffect);

        Work.currentOpenedElement = relative;
        Work.currentOpenedWorkId = workId;

        if (Work.last) {
            Work.last.getElement(".current-border").hide();
        }

        Work.last = relative;
        var videoFileUrl = relative.getElement("img").get("workvideofile");
        Work.initMoreInfo(workId);

        var playVideo = function() {
            var title = relative.getElement("img").get("worktitle");
            var imageUrl = relative.getElement("img").get("workfirstimage");
            Work.playVideo(videoFileUrl, title, imageUrl);
            Work.removeEvent("onMoreInfoComplete", playVideo);
        };

        Work.addEvent("onMoreInfoComplete", playVideo);
    },

    next: function() {
        var next = Work.currentOpenedElement.getNext();
        if (next == null) {
            Work.nextPage();
            return;
        }
        Work.open(next);
    },

    previous: function() {
        var prev = Work.currentOpenedElement.getPrevious();
        if (prev == null) {
            Work.previousPage();
            return;
        }
        Work.open(prev);
    },

    initMoreInfo: function(workId) {
        Mantis.Rhino.UI.Services.WorkLobby.GetWorkMoreInfoSourceById(workId,
			function(source) {
			    if (source.length == 0) {
			        $("preloader").hide();
			        return;
			    }
			    var el = new Element('div').setHTML(source);
			    $waitUntil(
					function() {
					    return !!el.getElement('.general-info');
					},
					function() {
					    Work.fireEvent("onMoreInfoComplete");
					    Work.setMoreInfo(el);
					}
				);
			}
		);
    },

    showInfo: function() {
        if (!Work.generalInfoIsOpen) {
            Work.fireEvent("onShowInfo");
            //$("more-info").setStyles({"margin-bottom":20});			
        } else {
            var closeInfo = function() {
                Work.scroller.toTop();
                Work.removeEvent("onInfoCloseComplete", closeInfo);
            };
            Work.addEvent("onInfoCloseComplete", closeInfo);
            Work.setPlayerMoreInfo();
            Work.closeInfo();
        }
    },

    setMoreInfo: function(el) {
        var setInfo = function() {
            $("more-info").setStyles({ "height": "auto" });
            $("more-info").empty();
            $("more-info").adopt(el);

            if (el.getElement(".menu")) Work.setMenu(el);
            Work.setGeneralInfo(el);
            Work.setBehind(el);
            Work.setArticles(el);
            Work.scroller.toTop();
            Work.removeEvent("onInfoCloseComplete", setInfo);
        };
        Work.addEvent("onInfoCloseComplete", setInfo);
        Work.closeInfo();
    },

    setMenu: function(el) {
        Work.menu = el.getElement(".menu");
        var behind = el.getElement(".menu").getElement(".behind");
        var articles = el.getElement(".menu").getElement(".articles");

        if (behind) {
            behind.addEvent("click", function(e) {
                e.stop();
                Work.menuUnselect();
                this.addClass("select");
                Work.fireEvent("onShowBehind");
            });
        }

        if (articles) {
            articles.addEvent("click", function(e) {
                e.stop();
                Work.menuUnselect();
                this.addClass("select");
                Work.fireEvent("onShowArticles");
            });
        }
    },

    menuUnselect: function() {
        if (Work.menu && Work.menu.getElement(".articles")) Work.menu.getElement(".articles").removeClass("select");
        if (Work.menu && Work.menu.getElement(".behind")) Work.menu.getElement(".behind").removeClass("select");
    },

    setGeneralInfo: function(el) {
        var generalInfo = el.getElement('.general-info');
        Work.generalInfoIsOpen = false;
        var height = generalInfo.getStyle("height").toInt() + 20;

        Work.generalInfoFx = new Fx.Morph(generalInfo, { duration: 400, transition: Fx.Transitions.Sine.easeOut });
        generalInfo.setStyles({ "height": 0, "overflow": "hidden" });

        Work.removeEvent("onShowInfo", Work.showInfoFun);

        Work.showInfoFun = function() {
            Tracker.track("/MoreInfoOpen?workId=" + Work.currentOpenedWorkId);
            Work.generalInfoFx.start({ "height": [0, height] });
            Work.generalInfoIsOpen = true;
        };

        Work.addEvent("onShowInfo", Work.showInfoFun);

        generalInfo.getElement(".close").addEvent("click", function() {
            Work.setPlayerMoreInfo();
            var closeInfo = function() {
                Work.scroller.toTop();
                Work.removeEvent("onInfoCloseComplete", closeInfo);
            };
            Work.addEvent("onInfoCloseComplete", closeInfo);
            Work.closeInfo();
            Work.menuUnselect();
            Work.generalInfoIsOpen = false;
        });
    },

    setBehind: function(el) {
        el.getElements(".video").each(function(item) {

            var file = item.get("href");
            item.set("href", "#").addEvent("click", function(e) { e.stop() });
            new Swiff(Config.siteUrl + "flash/behindPlayer.swf", {
                width: 332,
                height: 280,
                id: "BehindVideoPlayer",
                params: {
                    allowFullScreen: "true",
                    allowScriptAccess: "always",
                    bgcolor: "#000000",
                    wmode: "window",
                    flashvars: "file=" + file
                },
                container: item
            });
        });

        var behind = el.getElement('.behind-the-scene');
        var height = behind.getStyle("height").toInt() + 20;
        Work.behindFx = new Fx.Morph(behind, { duration: 400, transition: Fx.Transitions.Sine.easeOut });
        behind.setStyles({ "height": 0, "overflow": "hidden" });

        Work.removeEvent("onShowBehind", Work.showBehind);

        Work.showBehind = function() {
            Tracker.track("/ShowWorkBehindTheScene?workId=" + Work.currentOpenedWorkId);
            if (!Work.behindIsOpen) {
                if (Work.articlesIsOpen) {
                    Work.articlesFx.start({ "height": 0 }).chain(function() {
                        Work.behindFx.start({ "height": [0, height] });
                        Work.articlesIsOpen = false;
                    });
                } else {
                    Work.behindFx.start({ "height": [0, height] });
                }
            }
            Work.behindIsOpen = true;
        };

        Work.addEvent("onShowBehind", Work.showBehind);

        behind.getElement(".close").addEvent("click", function() {
            Work.behindFx.start({ "height": [height, 0] }).chain(function() {
                Work.scroller.toTop();
            });
            Work.menuUnselect();
            Work.behindIsOpen = false;
        });
    },

    setArticles: function(el) {
        var articles = el.getElement('.article-list');

        var height = articles.getStyle("height").toInt() + 20;
        Work.articlesFx = new Fx.Morph(articles, { duration: 400, transition: Fx.Transitions.Sine.easeOut });
        articles.setStyles({ "height": 0, "overflow": "hidden" });

        Work.removeEvent("onShowArticles", Work.showArticles);

        Work.showArticles = function() {
            Tracker.track("/ShowWorkArticles?workId=" + Work.currentOpenedWorkId);
            if (!Work.articlesIsOpen) {
                if (Work.behindIsOpen) {
                    Work.behindFx.start({ "height": 0 }).chain(function() {
                        Work.articlesFx.start({ "height": [0, height] });
                        Work.behindIsOpen = false;
                    });
                } else {
                    Work.articlesFx.start({ "height": [0, height] });
                }
            }
            Work.articlesIsOpen = true;
        };

        Work.addEvent("onShowArticles", Work.showArticles);

        articles.getElement(".close").addEvent("click", function() {
            Work.articlesFx.start({ "height": [height, 0] }).chain(function() {
                Work.scroller.toTop();
            });
            Work.menuUnselect();
            Work.articlesIsOpen = false;
        });
    },

    closeInfo: function() {
        Work.setPlayerMoreInfo();
        Work.showTooltip(Work.currentOpenedElement, false);
        if (Work.behindIsOpen) {
            Work.behindFx.start({ "height": 0 }).chain(function() {
                Work.behindIsOpen = false;
                Work.generalInfoFx.start({ "height": 0 }).chain(function() {
                    Work.fireEvent("onInfoCloseComplete");
                });
            });

        }
        else if (Work.articlesIsOpen) {
            Work.articlesFx.start({ "height": 0 }).chain(function() {
                Work.articlesIsOpen = false;
                Work.generalInfoFx.start({ "height": 0 }).chain(function() {
                    Work.fireEvent("onInfoCloseComplete");
                });
            });
        }
        else if (Work.generalInfoIsOpen) {
            Work.generalInfoFx.start({ "height": 0 }).chain(function() {
                Work.generalInfoIsOpen = false;
                Work.fireEvent("onInfoCloseComplete");
            });
        }
        else {
            Work.fireEvent("onInfoCloseComplete");
        }
    },

    clearList: function(byTag) {
        if (!$("work-list")) return;
        Work.closeInfo();
        var c = new Chain();
        var length = $$("#work-list li").length;
        if (length == 0) {
            Work.loadList(byTag);
            return;
        }

        $$("#work-list li").reverse().each(function(li, i) {
            c.chain(function() {
                hide(li, i);
            });
        });

        var runChain = function() {
            c.callChain();
            if (c.$chain.length == 0) {
                runChain = $clear(timer);
            }
        };

        var timer = runChain.periodical(50);

        function hide(li, i) {
            li.fx.start("opacity", 0).chain(function() {
                li.dispose();
                if (i >= length - 1) {
                    //$("preloader").show();
                    (function() {
                        Work.loadList(byTag);
                    }).delay(1000);
                }
            });
        }

        if (byTag) Work.clearPaging();
    },

    initPageing: function(byTag, list) {
        Work.totalPages = list.getElement(".total-pages").get("value");
        if (!byTag || !list || Work.totalPages == 1) return;
        if ($("paging")) $("paging").getParent().dispose();
        var c = new Chain();
        var page = 1;
        list.getElement("ul").getElements("li").each(function(li, i) {
            if (i == Work.currentPage) {
                li.addClass("current");
                Work.lastPage = li;
            }

            li.setStyle("opacity", "0");
            li.fx = new Fx.Tween(li);
            c.chain(function() {
                reveal(li, i);
            });

            if (li.hasClass("next")) {
                li.addEvent("click", function(e) {
                    e.stop();
                    Work.pauseVideo();
                    Work.nextPage();
                });
            } else if (li.hasClass("prev")) {
                li.addEvent("click", function(e) {
                    e.stop();
                    Work.pauseVideo();
                    Work.previousPage();
                });
            } else {
                if (page <= Work.totalPages) {
                    var pageNumber = page < 10 ? "0" + page : page;
                    var a = new Element("a", { "href": "#" }).set("text", pageNumber);
                    li.adopt(a);
                    li.addEvent("click", function(e) {
                        e.stop();
                        Work.pauseVideo();
                        Work.currentPage = i;
                        if (Work.lastPage) Work.lastPage.removeClass("current");
                        li.addClass("current");
                        Work.lastPage = li;
                        Work.clearList(false);
                    });
                    page++;
                }
            }
        });

        $("work").adopt(list);

        var runChain = function() {
            c.callChain();
            if (c.$chain.length == 0) {
                runChain = $clear(timer);
            }
        };

        var timer = runChain.periodical(50);

        function reveal(li, i) {
            li.fx.start("opacity", 1);
        };
    },

    nextPage: function() {
        if (Work.currentPage < Work.totalPages) Work.currentPage++;
        else return;
        Work.pauseVideo();
        Work.lastPage.removeClass("current");
        Work.lastPage.getNext().addClass("current");
        Work.lastPage = Work.lastPage.getNext();
        Work.clearList(false);
    },

    previousPage: function() {
        if (Work.currentPage > 1) Work.currentPage--;
        else return;
        Work.pauseVideo();
        Work.lastPage.removeClass("current");
        Work.lastPage.getPrevious().addClass("current");
        Work.lastPage = Work.lastPage.getPrevious();
        Work.clearList(false);
    },

    clearPaging: function() {
        if (!$("paging")) return;
        var c = new Chain();
        var length = $$("#paging li").length;

        $$("#paging li").reverse().each(function(li, i) {
            c.chain(function() {
                hide(li, i);
            });
        });

        var runChain = function() {
            c.callChain();
            if (c.$chain.length == 0) {
                runChain = $clear(timer);
            }
        };

        var timer = runChain.periodical(50);

        function hide(li, i) {
            li.fx.start("opacity", 0).chain(function() {
                li.dispose();
            });
        }
    },

    lowlightOtherWorks: function(current) {
        Work.isLowlight = true;
        $$("#work-list li").each(function(li) {
            if (li != current && !li.hasClass("current")) li.getElement(".lowlight").fx.start(.5);
        });
    },

    lightWorks: function() {
        Work.isLowlight = false;
        $$("#work-list li").each(function(li) {
            li.getElement(".lowlight").fx.start(0);
        });
    },

    playEffect: function(fx, top, left, width, height) {
        fx.start({
            "top": top,
            "left": left,
            "width": width,
            "height": height
        }).chain(function() {
            Work.fireEvent("onWorkPlayEffectComplete");
        });
    },

    showTooltip: function(li, show) {

        $clear(Work.tooltipTimer);

        var finalStyle = new Hash();
        var position = li.getPosition($("work"));
        var delay = show ? 500 : 0;
        finalStyle.extend({ "left": position.x + 10 });
        finalStyle.extend({ "top": position.y + 50 });
        var fx = function() {
            $E("#tool-tip .content").set("text", li.getElement("img").get("worktitle"));
            if (show) {
                $("tool-tip").show();
                $("tool-tip").setStyles(finalStyle).get('tween', { property: 'opacity', duration: 500 }).start(1);
            }
            else $("tool-tip").setStyles(finalStyle).get('tween', { property: 'opacity', duration: 200 }).start(0);
        };

        Work.tooltipTimer = fx.delay(delay);
    },

    initPlayer: function() {
        //$("preloader").show();		
        Work.player = new Swiff(Config.siteUrl + "flash/player.swf?rnd=" + Math.random() * 10000, {
            width: 728,
            height: 510,
            id: "VideoPlayer",
            params: {
                allowFullScreen: "true",
                allowScriptAccess: "always",
                bgcolor: "#DED8CC",
                wmode: "window",
                flashvars: "version=work&siteUrl=" + Config.siteUrl
            },
            container: $("player")
        });
    },

    flashIsReady: function() {
        (function() {
            Work.loadList(true);
        }).delay(500);
    },

    playVideo: function(videoFileUrl, title, imageUrl) {
        Work.player.object.playVideo(videoFileUrl, title, imageUrl);
    },

    pauseVideo: function() {
        Work.player.object.pause();
    },

    resumeVideo: function() {
        Work.player.object.resume();
    },

    setPlayerMoreInfo: function() {
        Work.player.object.closeInfo();
    },

    getWorkId: function(el) {
        return +el.id.split("-").pop();
    }
};
Events.makeObjectEventable(Work);
$domready(Work.init);

var Tag={
	init:function(){
		
		$$("#work-categories li").each(function(item,i){			
			item.getElement("a").addEvent("click",function(){
				Work.pauseVideo();				
			});
		});
		
		if($E("#work-tags .more")){
			$E("#work-tags .more").addEvent("click",function(){
				if(Tag.moreIsOpen){
					$E("#work-tags .more-tags").hide();
					Tag.moreIsOpen=false;
				}else{
					$E("#work-tags .more-tags").show();
					Tag.moreIsOpen=true;
				}
			});
		}
		
		$$("#work-tags a").each(function(item,i){
			item.addEvent("click",function(){
				Work.pauseVideo();
			});
		});
	}
};
$domready(Tag.init);

var UserManager={
	init:function() {
		if($("footer-client-zone") && !UserManager.isLogIn){
			$("footer-client-zone").addReplacingEvent("click",function (e) {
				UserManager.openLogin();
			});
		}
		if($("user-logout")){
			$("user-logout").addReplacingEvent("click",function (e) {
				UserManager.logout();
			});
		}
	},

	loginLoaded:function() {
		var top=$("footer-client-zone").getTop()-214;
		var lb = new Lightbox(UserManager._loginFormElement,{opacity:0.4,hideOnEnter:false,hideOnEsc:true,fixedTop:top,contentClass:"login-lightbox-content"});
		lb.show();
		UserManager._loginFormElement.getElement(".close").addEvent("click",function(e) {
			Login.clearMessages();
			lb.hide();
		});
	},

	openLogin:function () {
		// if already got source
		if (UserManager._loginFormElement) UserManager.loginLoaded();
		// otherwise fetch source from server
		else Mantis.Web.Services.UserService.GetLoginFormSource(function (source) {
			UserManager._loginFormElement=Element.fromMarkup(source);
			UserManager.loginLoaded();
		});
	},
	openResetPassword:function () {
		UserManager.openLogin();
	},
	logout:function () {
		WebService.AuthenticationService.logout();
	},
	sendPassword:function (userName,callback) {
		Mantis.Web.Services.UserService.SendPassword(userName,function (success) {
			if (callback) callback(success);
		});
	}
};

$domready(UserManager.init);


