//Object that contains a instance of StageControl & Object that contains a instance of Model
var stageControl;
var model;
var logWriter;


// First function to call by window.onload only called on entire page refresh
function initStage(stage){
	var url = getURLData();
	makeSelected(parseInt(url.section, 10));
	model = new Model(stage, url.section, url.id, url.cid);
	stageControl = new StageControl();
	stageControl.buildUpStage();
	document.onkeyup = stageControl.receivedKeyPress;
}


//Gives al urlData back
function getURLData(){
	var urlObj = new Object();
	
	var hash = location.hash.split("=");
	
	if(hash != "")
	{
			var hashS = hash[1].split("-");	
			
			(hashS[1] == null ? hashS[1]=0 : hashS[1]=hashS[1]);
			if(hashS[1] != "0" )			
			{
				urlObj.section = hash[1].substr(0, 2);
				urlObj.id =  hashS[0];
				urlObj.cid = hashS[1];
				window.location = "#id=" + urlObj.id + "-" + urlObj.cid;
			}
			else
			{
				if((hash[0] == "#id") && (hash[1]) /*&& (hash[1].length >= 4) && (hash[1].length <= 5)*/){					
					urlObj.section = hash[1].substr(0, 2);
					urlObj.id =  hashS[0];		
					urlObj.cid = "0";
					window.location = "#id=" + urlObj.id + "-" + urlObj.cid;
				} else {
					urlObj.section = "01";
					urlObj.id = "0101";
					urlObj.cid = "0";
					window.location = "#id=" + urlObj.id + "-" + urlObj.cid;
				}				
			}
			
	}
	else
	{
			urlObj.section = "01";
			urlObj.id = "0101";
			urlObj.cid = "0";
			window.location = "#id=" + urlObj.id + "-" + urlObj.cid;
	}
		
	
	return urlObj;
}


//Container with Data
function Model(stage, section, pageId, catID)
{
	this.pageWidth = 899;
	this.pageHeight = 440;
	this.pageSpace = 15;
	this.containerWidth = (3*this.pageWidth)+(2*this.pageSpace);
	this.containerHeight = (3*this.pageHeight)+(2*this.pageSpace);
	this.offSetHeight = 137;
	this.mainWidthMin = 919;
	this.mainHeightMin = 491;
	this.homePage = "0101";
	this.main = document.getElementById("main");
	this.content = document.getElementById("contentcontainer");
	this.stage = document.getElementById(stage);
	this.fader = document.getElementById("fader");
	this.stageDisabled = false;
	this.keyPressDisabled = false;
	this.section = (section) ? section : "01";
	this.pageId = (pageId) ? pageId : null;
	this.cid = (catID) ? catID : null;
	this.gridPos = new Array();
	this.gridId = new Array();
	this.activePages = new Array();
	this.historyModule = "id";
	this.startup = true;
	this.ie6 = parseFloat(navigator.appVersion.split("MSIE")[1]) >= 5.5 && parseFloat(navigator.appVersion.split("MSIE")[1]) < 7;
	this.notIE = false;
	this.gridControl = new GridControl();
	this.contentControl = new ContentControl();
	this.containerClass = new ContainerClass();
	this.pageControl = new PageControl();
	this.tweenEngine = new TweenEngine();
}


//The Main stage controls
function StageControl()
{
	//Builds Stage
	function buildUpStage(){
		var dataGrid = new CreateDataGrid();
		dataGrid.init();
	}

	//Tweens first animation
	function startUpStage(){
		//if page id doesn't exists, goto page with x=00 y=00 z=00
		if(!model.gridId[model.pageId]){
			model.pageId = undefined;
			stageControl.gotoLink(model.gridPos["000000"].id);
		} else {
			model.contentControl.mainPageRequest(model.pageId);
		}
	}

	//Cleans Stage
	function buildDownStage(id){
		model.pageId = id;
		model.gridControl.enableFader();
		model.tweenEngine.fadeSectionOut(model.fader, 1, stageControl.resetStage);
	}

	//Determines if mouseover tween is allowed
	function ghostButtonOver(element, id){
		model.tweenEngine.fadeGhostIn(element);
	}

	//Determines if mouseout tween is allowed
	function ghostButtonOut(element, id){
		model.tweenEngine.fadeGhostOut(element);
	}

	//Goes to provided Link
	function gotoLink(id){
		var ids = id.split("-");
		if( (!model.stageDisabled) && ( (model.pageId != ids[0]) || (model.cid != ids[1]) ) ){
			if(id){
				YAHOO.util.History.navigate("id", id);				
			}
		}

		return false;
	}

	//Gets called on keyPress
	function receivedKeyPress(key){
		if(!model.keyPressDisabled){
			model.gridControl.calculatePage(key);
		}
	}

	//Resets old Stage
	function resetStage(id){
		model.stage.innerHTML = "";
		initStage("movingcontainer");
	}

	//Resizes containers to display dimensions
	function resizeContainers(el){
		model.containerClass.resizeContainers(el);
	}

	//Sets title of document
	function setTitle(){
		var title = html_entity_decode(model.gridId[model.pageId].title);
		document.title = (title != "null") ? "Bobo Funn Co - " + title : "Bobo Funn Co";
	}

	function html_entity_decode(str) {
		var ta=document.createElement("textarea");
		ta.innerHTML=str.replace(/</g,"&lt;").replace(/>/g,"&gt;");
		return ta.value;
	}

	//public functions
	this.buildUpStage = buildUpStage;
	this.startUpStage = startUpStage;
	this.buildDownStage = buildDownStage;
	this.ghostButtonOver = ghostButtonOver;
	this.ghostButtonOut = ghostButtonOut
	this.gotoLink = gotoLink;
	this.resetStage = resetStage;
	this.receivedKeyPress = receivedKeyPress;
	this.setTitle = setTitle;
}


//Controls the grid
function GridControl()
{
	//Starts the entire visual application
	function startStage(){
		var sectionSlide = ((model.gridId[model.pageId].x == "00") && (model.gridId[model.pageId].y == "00")) ? true : false;
		setStartingXY(sectionSlide);
		stageControl.setTitle();
		if(sectionSlide){
			model.stage.style.display = "block";
			setOpacity(model.fader, 0);
			disableFader();
			var stageLeftRaw = String(model.stage.style.left);
			var stageLeft = parseInt(stageLeftRaw.substr(0, stageLeftRaw.indexOf("px")));
			var stageTopRaw = String(model.stage.style.top);
			var stageTop = parseInt(stageTopRaw.substr(0, stageTopRaw.indexOf("px")));
			var pageX = (model.pageWidth + model.pageSpace) - stageLeft;
			var pageY = (model.pageHeight + model.pageSpace) - stageTop;
			model.tweenEngine.tweenPage(model.stage, pageX, pageY, 1.5);
		} else {
			model.stage.style.display = "block";
			model.tweenEngine.fadeSectionIn(model.fader, 1, model.gridControl.disableFader);
		}
		model.startup = false;
	}

	//Calculates startup X & Y position
	function setStartingXY(sectionSlide){
		var pageTotX = model.pageWidth + model.pageSpace;
		var pageTotY = model.pageHeight + model.pageSpace;
		if(sectionSlide){
			var displayWidth = getDisplayWidth();
			model.stage.style.left = (pageTotX + displayWidth) + "px";
		} else {
			var pageTopRaw = String(document.getElementById("page" + model.pageId).style.left);
			var pageTop = parseInt(pageTopRaw.substr(0, pageTopRaw.indexOf("px")));
			var pageX = -(pageTop - pageTotX);
			model.stage.style.left = pageX + "px";
		}
		if(sectionSlide){
			model.stage.style.top = pageTotY + "px";
		} else {
			var pageLeftRaw = String(document.getElementById("page" + model.pageId).style.top);
			var pageLeft = parseInt(pageLeftRaw.substr(0, pageLeftRaw.indexOf("px")));
			var pageY = pageTotY - pageLeft;
			model.stage.style.top = pageY + "px";
		}
	}

	//Starts procedures to tween to another page
	function gotoPage(id){
		var splitID = id.split("-");
		var currid = splitID[0];		
		var section =  currid.substr(0, 2);
		
		//alert(splitID[1] +" - "+model.cid);
		
		if((splitID[1] != model.cid) || (model.section != section) ){
			makeSelected(parseInt(section, 10));
			stageControl.buildDownStage(currid);
			return null;
		} else if(!model.gridId[currid]){
			currid = model.gridPos["000000"].id;
		}
		if(model.gridId[currid]){
			if(!model.gridId[currid].loaded){
				model.contentControl.setLoader(currid);
			}
		}
		var xPos = parseInt(model.gridId[currid].x, 10);
		var yPos = parseInt(model.gridId[currid].y, 10);
		var xPosPx = calculateX(xPos);
		var yPosPx = calculateY(yPos);
		var duration = calculateDuration(xPosPx, yPosPx);
		model.tweenEngine.tweenPage(model.stage, xPosPx, yPosPx, duration, model.contentControl.init);
		if(model.pageId){
			enableGhost(model.pageId);
		}
		disableGhost(currid);
		//setGoogleAnalytics(model.gridId[id].url);
		model.pageId = currid;
		stageControl.setTitle();
	}

	//Calculates X position
	function calculateX(xPos){
		var stageLeftRaw = String(model.stage.style.left);
		var stageLeft = parseInt(stageLeftRaw.substr(0, stageLeftRaw.indexOf("px")));
		var pageTotWidth = model.pageWidth + model.pageSpace;
		var realX = (xPos == 0) ? pageTotWidth: -((xPos - 1) * pageTotWidth);
		if(stageLeft < realX){
			return Math.abs(stageLeft - realX);
		} else if(stageLeft > realX){
			return -(Math.abs(stageLeft - realX));
		}
		return 0;
	}

	//Calculates Y position
	function calculateY(yPos){
		var stageTopRaw = String(model.stage.style.top);
		var stageTop = parseInt(stageTopRaw.substr(0, stageTopRaw.indexOf("px")));
		var pageTotHeight = model.pageHeight + model.pageSpace;
		var realY = (yPos == 0) ? pageTotHeight: -(yPos - 1) * pageTotHeight;
		if(stageTop < realY){
			return Math.abs(stageTop - realY);
		} else if(stageTop > realY){
			return -(Math.abs(stageTop - realY));
		}
		return 0;
	}

	//Calculates duration
	function calculateDuration(x, y){
		var t = 0.4 + (Math.sqrt(Math.pow(Math.abs(x), 2) + Math.pow(Math.abs(y), 2)) / 1000);
		if(t > 2.5){
			return 2.5;
		}
		return t;
	}

	//Gets called on keypress event
	function calculatePage(e){
		var keyString = getCharCode(e);
		if(model.gridId[model.pageId]){
			var curX = model.gridId[model.pageId].x;
			var curY = model.gridId[model.pageId].y;
			var curZ = model.gridId[model.pageId].z;
		} else {
			return;
		}
		switch(keyString){
			case "&":
				var newY = doTransform(curY, "-");
				if(!newY){ return; }
				if(model.gridPos[curX + newY + curZ]){
					stageControl.gotoLink(model.gridPos[curX + newY + curZ].id);
				}break;
			case "'":
				var newX = doTransform(curX, "+");
				if(!newX){ return; }
				if(model.gridPos[newX + curY + curZ]){
					stageControl.gotoLink(model.gridPos[newX + curY + curZ].id);
				}break;
			case "(":
				var newY = doTransform(curY, "+");
				if(!newY){ return; }
				if(model.gridPos[curX + newY + curZ]){
					stageControl.gotoLink(model.gridPos[curX + newY + curZ].id);
				}break;
			case "%":
				var newX = doTransform(curX, "-");
				if(!newX){ return; }
				if(model.gridPos[newX + curY + curZ]){
					stageControl.gotoLink(model.gridPos[newX + curY + curZ].id);
				}break;
			default:
				break;
		}
	}

	//Transforms string
	function doTransform(oldChar, math){
		if(math == "+"){
			var newChar = String(parseInt(oldChar, 10) + 1);
		} else {
			var newChar = String(parseInt(oldChar,10) - 1);
		}
		if(newChar.substr(0, 1) == "-"){
			return false;
		}
		if(newChar.length <= 1){
			newChar = "0" + newChar;
		}
		return newChar;
	}

	//Returns string from keyPress
	function getCharCode(e){
		if(!e) {
			if( window.event ) {
				e = window.event;
			} else {
				return;
			}
		}
		if( typeof( e.keyCode ) == 'number'  ) {
			e = e.keyCode;
		} else if( typeof( e.which ) == 'number' ) {
			e = e.which;
		} else if( typeof( e.charCode ) == 'number'  ) {
			e = e.charCode;
		} else {
			return;
		}
		return String.fromCharCode(e);
	}

	//Calls google analytics
	function setGoogleAnalytics(url, visitorSegment){
		urchinTracker(url);
		/*
		if(visitorSegment){
			alert(visitorSegment);
			__utmSetVar(visitorSegment);
		}
		*/
	}

	//Enables given Ghostbutton
	function enableGhost(id){
		var ghost = document.getElementById("ghost" + id);
		ghost.style.display = "block";
	}

	//Disables given Ghostbutton
	function disableGhost(id){
		var ghost = document.getElementById("ghost" + id);
		ghost.style.display = "none";
	}

	//Enables fader div
	function enableFader(){
		model.fader.style.display = "block";
	}

	//Disables fader div
	function disableFader(){
		model.fader.style.display = "none";
	}

	//Public functions
	this.gotoPage = gotoPage;
	this.enableGhost = enableGhost;
	this.disableGhost = disableGhost;
	this.startStage = startStage;
	this.calculatePage = calculatePage;
	this.enableFader = enableFader;
	this.disableFader = disableFader;
}


//Controls the content of the grid
function ContentControl()
{
	function init(){
		mainPageRequest(model.pageId);
	}

	//Loads the content in the starting page
	function mainPageRequest(id){
		var xmlListener = new Object();
		xmlListener.xmlLoaded = function(){
			pageReceived(xmlRequest.getXML(), id, true);
		};
		xmlListener.xmlError = function(){
			onError(url);

		};
		var xmlRequest = new XMLRequest();
		xmlRequest.addListener(xmlListener);

		var url = createUrl(id+"-"+model.cid);
		xmlRequest.requestXML(url);
	}

	//Loads the content in the starting page
	function pageRequest(id){
		var element = document.getElementById("content" + id);
		if((!model.gridId[id].loaded) && (element.innerHTML == "")){
			setLoader(id);
			var xmlListener = new Object();
			xmlListener.xmlLoaded = function(){
				pageReceived(xmlRequest.getXML(), id, false);
			};
			xmlListener.xmlError = function(){
				onError(url);
			};
			var xmlRequest = new XMLRequest();
			xmlRequest.addListener(xmlListener);
			
			var url = createUrl(id+"-"+model.cid);
			xmlRequest.requestXML(url);
		}
	}

	//Puts a loader in the page
	function setLoader(id){
		var loader = document.getElementById("loader" + id);
		loader.innerHTML = "<img src=\"img/loader.gif\" alt=\"loader\" />";
		loader.style.display = "block";
		setOpacity(loader, 100);
	}

	function unloadLoader(){
		var loader = document.getElementById("loader" + id);
		loader.innerHTML = "";
		loader.style.display = "none";
		setOpacity(loader, 0);
	}

	//Creates the URL that's needed
	function createUrl(id){
		var ids = id.split("-");
		var random = new Date().getTime();	
		if(model.section == "14" && ids[0] != "1468")
		{
			return "xml/gethennight.php?id="+ids[0]+"&cid="+ids[1]+"&random=" + random;
		}		
		else if(model.section == "14" && ids[0] == "1468")
		{
			return "xml/gethennightA.php?id="+ids[0]+"&cid="+ids[1]+"&random=" + random;
		}
		else if(model.section == "02" && ids[0] != "0238")
		{	
			return "xml/getportfolio.php?id="+ids[0]+"&cid="+ids[1]+"&random=" + random;
		}
		else if(model.section == "02" && ids[0] == "0238")
		{	
			return "xml/getportfolioA.php?cid="+model.cid+"&random=" + random;			
		}		
		else
			return "xml/" + ids[0] + ".php?random=" + random;	
	}

	//Gets called when Ajax call succeeds
	function pageReceived(xml, id, loadNeighbours){
		var pageActive = checkPageActive(id);
		if((pageActive) || (id == model.pageId)){
			if((pageActive) && (id != model.pageId) && (loadNeighbours)){
				return;
			}
			var data = readPageXML(xml, id);
			if(!model.gridId[data.section + data.id].loaded){
				insertContent(data);
			}
			if(loadNeighbours){	
				var oldArr = model.activePages;
				var newArr = data.neighbours;
				deleteOldPages(oldArr, newArr, id, model.pageId);
				getNewContent(oldArr, newArr);
				newArr.push(model.pageId);
				model.activePages = newArr;				
				if(model.startup){
					model.gridControl.startStage();
				}
			}
		} else {
			unloadLoader();
		}
	}

	//Checks if the received page is still active
	function checkPageActive(id){
		for(var i=0;i<model.activePages.length;i++)
		{
			if(model.activePages[i] == id){
				return true
			}
		}
		return false;
	}

	//Reads and gives XML data
	function readPageXML(xml){
		var data = new Object();
		var xmlDoc = returnElements(xml, "PAGE")[0];
		data.id = getXmlNodeValue(returnElements(xmlDoc, "ID")[0]);
		data.section = getXmlNodeValue(returnElements(xmlDoc, "SECTION")[0]);
		data.content = getXmlNodeValue(returnElements(xmlDoc, "BODY")[0]);
		var neighboursNode = returnElements(xmlDoc, "NEIGHBOURS")[0];
		var neighbour = returnElements(neighboursNode, "neighbour");
		if(neighbour){
			data.neighbours = new Array();
			for(var i=0;i<neighbour.length;i++)
			{
				data.neighbours.push(getXmlNodeValue(neighbour[i]));
			}
		} else {
			data.neighbours = [];
		}
		return data;
	}

	//Inserts content in the page
	function insertContent(data){
		contentString = replaceHeaders(data.content);
		document.getElementById("content" + data.section + data.id).innerHTML = contentString;
		var loader = document.getElementById("loader" + data.section + data.id);
		model.tweenEngine.tweenLoaderOut(loader, 1);
		model.gridId[data.section + data.id].loaded = true;
		
	}

	//Deletes content of old pages
	function deleteOldPages(oldArr, newArr, id, id2){
		for(var a=0;a<oldArr.length;a++)
		{
			var deleteId = true
			for(var b=0;b<newArr.length;b++)
			{
				if((oldArr[a] == newArr[b]) || (oldArr[a] == model.pageId)){
					deleteId = false;
				}
			}
			if(deleteId){
				//logWriter.log("DELETING: " + oldArr[a] + " id: " + id + " model.pageId: " + id2);
				document.getElementById("content" + oldArr[a]).innerHTML = "";
				model.gridId[oldArr[a]].loaded = false;
			}
		}
	}

	//Checks if content has to be loaded
	function getNewContent(oldArr, newArr){
		for(var a=0;a<newArr.length;a++)
		{
			var getContentId = true
			for(var b=0;b<oldArr.length;b++)
			{
				if(newArr[a] == oldArr[b]){
					getContentId = false;
				}
			}
			if(getContentId){
				//alert(newArr[a]);
				pageRequest(newArr[a]);
			}
		}
	}

	//Gets called when Ajax call fails
	function onError(url){
		alert("Error received: " + url);
	}


	//replaces headertags by images
	
	function replaceHeaders(string) {
		var h1RegExp = /<h1>([^<]*)<\/h1>/gi;
		var h05RegExp = /<h1 class="halfpage">([^<]*)<\/h1>/gi;
		var h2RegExp = /<h2>([^<]*)<\/h2>/gi;
		var h3RegExp = /<h3>([^<]*)<\/h3>/gi;
		string = string.replace(h1RegExp, '<img src="http://evolvenet.co.uk/header1?text=$1" onload="setFilter(this);" style="display:block" alt="$1" />');
		string = string.replace(h05RegExp, '<img src="http://evolvenet.co.uk/header05?text=$1" onload="setFilter(this);" style="display:block" alt="$1" />');
		string = string.replace(h2RegExp, '<img src="http://evolvenet.co.uk/header2?text=$1" onload="setFilter(this);" alt="$1" style="display:block" />');
		string = string.replace(h3RegExp, '<img src="http://evolvenet.co.uk/header3?text=$1" onload="setFilter(this);" alt="$1" style="display:block" />');
		return string;
	}

	//Public functions
	this.pageRequest = pageRequest;
	this.mainPageRequest = mainPageRequest;
	this.setLoader = setLoader;
	this.init = init;
}


//Controls javascript of the pages in the grid
function PageControl()
{
	//Controls homepage
	function HomePage()
	{
		//Start of animation chain
		function startUpHomepage(){
			var element = document.getElementById("content0101");
			if(element){
				element.style.marginTop = "0px";
				element.style.marginRight = "0px";
				element.style.marginLeft = "0px";
				element.style.marginBottom = "0px";
				element = document.getElementById("backgroundHome");
				setTimeout(fadeInChallenge, 1300);
			}
		}

		//Fades in block2 in stage
		function fadeInChallenge(){
			var element = document.getElementById("challengeBowl");
			if(element){
				
				model.tweenEngine.tweenBlocks(element, 0, -610, 10, "");
				//model.pageControl.homePage.showBlock1
			}
		}

		//Fades & Tweens block1 in stage
		function showBlock1(){
			var block = document.getElementById("homeBlock1");
			if(block){
				block.style.display = "block";
				model.tweenEngine.tweenBlocks(block, 0, 310, 1.5);
				showBlock2();
			}
		}

		//Fades & Tweens block2 in stage
		function showBlock2(){
			var block = document.getElementById("homeBlock2");
			if(block){
				block.style.display = "block";
				model.tweenEngine.tweenBlocks(block, 0, 310, 1.5, model.pageControl.homePage.showBlock3);
			}
		}

		//Fades in block3 in stage
		function showBlock3(){
			var block = document.getElementById("homeBlock3");
			if(block){
				block.style.display = "block";
				model.tweenEngine.fadeBlocks(block, 1.5);
			}
		}

		this.startUpHomepage = startUpHomepage;
		this.showBlock1 = showBlock1;
		this.showBlock2 = showBlock2;
		this.showBlock3 = showBlock3;
	}


	//Controls customerpage
	function CustomerPage()
	{
		var timer;

		//Activates a group
		function setGroupActive(id){
			clearTimer();
			var i = 0;
			while(document.getElementById("groupOn_" + i)){
				var element = document.getElementById("groupOn_" + i);
				if(i == id){
					model.tweenEngine.fadeInGroup(element, 0.5);
					i++
					continue;
				}
				model.tweenEngine.fadeOutGroup(element, 0.5);
				i++;
			}
		}

		function setTimerGroupDeactive(id){
			timer = setTimeout(setGroupDeactive, 100);
		}

		function clearTimer(){
			clearTimeout(timer);
		}

		//Deactivates a group
		function setGroupDeactive(){
			var i = 0;
			while(document.getElementById("groupOn_" + i)){
				var element = document.getElementById("groupOn_" + i);
				model.tweenEngine.fadeInGroup(element, 0.5);
				i++;
			}
		}

		//public functions
		this.setGroupActive = setGroupActive;
		this.setGroupDeactive = setGroupDeactive;
		this.clearTimer = clearTimer;
		this.setTimerGroupDeactive = setTimerGroupDeactive;
	}

	//Controls portfolio page - the firs page where there is sliding of content
	function PortfolioPage()
	{
		var slider;
		var container;
		var maxBlocks;
		var movingElement;
		var stageEnabled = true;
		var scrollWheel = false;
		this.startValue = 0;
		this.endValue = 660;
		var blockSize = 869;

		function init(){
			container =	document.getElementById("blockContainer");
			movingElement =	document.getElementById("portfolioContent");
			maxBlocks = container.offsetWidth / blockSize;
			slider = new CustomSlider("sliderBg", "slider", this.startValue, this.endValue, this.onChange);
			slider.init();
		}

		function onChange(){
			if(stageEnabled){
				moveToPercent(slider.getProcent());
			}
		}

		function nextCase(){
			if(stageEnabled){
				var curPos = xToPosition(movingElement.style.left);
				if((curPos + 1) >=  maxBlocks){
					return false;
				}
				var x = posToX(curPos + 1);
				var percent = xToPercent(x);
				tweenToPercent(percent);
			}
		}

		function previousCase(){
			if(stageEnabled){
				var curPos = xToPosition(movingElement.style.left);
				if((curPos - 1) <  0){
					return false;
				}
				var x = posToX(curPos - 1);
				var percent = xToPercent(x);
				tweenToPercent(percent);
			}
		}

		function tweenToPercent(percent){
			var curX = stripValuePx(movingElement.style.left);
			var newX = percentToX(percent);
			var calculated = Math.abs(curX) - Math.abs(newX);
			stageEnabled = false;
			var callback = model.pageControl.portfolioPage.onChangeBooleanTrue;
			var onTween = model.pageControl.portfolioPage.updateSlider;
			model.tweenEngine.portfolioTweener(movingElement, calculated, 0, 0.7, callback, onTween);
		}

		function moveToPercent(percent){
			var x = percentToX(percent);
			movingElement.style.left = x + "px";
		}

		function onChangeBooleanTrue(){
			stageEnabled = true;
		}

		function updateSlider(){
			var percent = xToPercent2(movingElement.style.left);
			var xValue = slider.percentToX(percent);
			slider.setToX(xValue);
		}


		/* -- Calculate functions -- */


		function xToPosition(xValue){
			if(!xValue){
				return 0;
			}
			return Math.round(Math.abs(stripValuePx(xValue))/blockSize);
		}

		function posToX(pos){
			return pos * blockSize;
		}

		function percentToX(percent){
			if(!percent){
				return 0;
			}
			var x1Procent = (container.offsetWidth - 702) / 100;
			return "-" + x1Procent * percent;
		}

		function xToPercent(xValue){
			var fullPercent = container.offsetWidth - 702;
			return xValue / (fullPercent / 100);
		}

		function xToPercent2(xValue){
			var fullPercent = container.offsetWidth - 702;
			xValue = stripValuePx(xValue);
			if(xValue == 0){
				return 0;
			}
			return xValue / (fullPercent / 100);
		}

		function xToRoundedX(xValue){
			if(!xValue){
				return 0;
			}
			var position = Math.round(Math.abs(stripValuePx(xValue))/blockSize);
			return position * blockSize;
		}
		
		//Public functions
		this.init = init;
		this.onChange = onChange;
		this.nextCase = nextCase;
		this.previousCase = previousCase;
		this.updateSlider = updateSlider;
		this.onChangeBooleanTrue = onChangeBooleanTrue;
	}

	//Controls newspage
	function NewsPage()
	{
		var slider;
		var container;
		var maxBlocks;
		var movingElement;
		var stageEnabled = true;
		var scrollWheel = false;
		this.startValue = 0;
		this.endValue = 512;
		var blockSize = 351;

		function init(){
			container =	document.getElementById("blockContainer");
			movingElement =	document.getElementById("newsContent");
			maxBlocks = container.offsetWidth / blockSize;
			slider = new CustomSlider("sliderBg", "slider", this.startValue, this.endValue, this.onChange);
			slider.init();
		}

		function onChange(){
			if(stageEnabled){
				moveToPercent(slider.getProcent());
			}
		}

		function nextCase(){
			if(stageEnabled){
				var curPos = xToPosition(movingElement.style.left);
				if((curPos + 1) >=  maxBlocks){
					return false;
				}
				var x = posToX(curPos + 1);
				var percent = xToPercent(x);
				tweenToPercent(percent);
			}
		}

		function previousCase(){
			if(stageEnabled){
				var curPos = xToPosition(movingElement.style.left);
				if((curPos - 1) <  0){
					return false;
				}
				var x = posToX(curPos - 1);
				var percent = xToPercent(x);
				tweenToPercent(percent);
			}
		}

		function tweenToPercent(percent){
			var curX = stripValuePx(movingElement.style.left);
			var newX = percentToX(percent);
			var calculated = Math.abs(curX) - Math.abs(newX);
			stageEnabled = false;
			var callback = model.pageControl.newsPage.onChangeBooleanTrue;
			var onTween = model.pageControl.newsPage.updateSlider;
			model.tweenEngine.portfolioTweener(movingElement, calculated, 0, 0.7, callback, onTween);
		}

		function moveToPercent(percent){
			var x = percentToX(percent);
			movingElement.style.left = x + "px";
		}

		function onChangeBooleanTrue(){
			stageEnabled = true;
		}

		function updateSlider(){
			var percent = xToPercent2(movingElement.style.left);
			var xValue = slider.percentToX(percent);
			slider.setToX(xValue);
		}


		/* -- Calculate functions -- */


		function xToPosition(xValue){
			if(!xValue){
				return 0;
			}
			return Math.round(Math.abs(stripValuePx(xValue))/blockSize);
		}

		function posToX(pos){
			return pos * blockSize;
		}

		function percentToX(percent){
			if(!percent){
				return 0;
			}
			var x1Procent = (container.offsetWidth - 702) / 100;
			return "-" + x1Procent * percent;
		}

		function xToPercent(xValue){
			var fullPercent = container.offsetWidth - 702;
			return xValue / (fullPercent / 100);
		}

		function xToPercent2(xValue){
			var fullPercent = container.offsetWidth - 702;
			xValue = stripValuePx(xValue);
			if(xValue == 0){
				return 0;
			}
			return xValue / (fullPercent / 100);
		}

		function xToRoundedX(xValue){
			if(!xValue){
				return 0;
			}
			var position = Math.round(Math.abs(stripValuePx(xValue))/blockSize);
			return position * blockSize;
		}

		//Public functions
		this.init = init;
		this.onChange = onChange;
		this.nextCase = nextCase;
		this.previousCase = previousCase;
		this.updateSlider = updateSlider;
		this.onChangeBooleanTrue = onChangeBooleanTrue;
	}

	//Public functions
	this.homePage = new HomePage();
	this.customerPage = new CustomerPage();
	this.portfolioPage = new PortfolioPage();
	this.newsPage = new NewsPage();
}


//
function CustomSlider(elementBg, element, startValue, endValue, callBack)
{
	this.slider;
	this.elementBg = elementBg;
	this.element = element;
	this.startValue = startValue;
	this.endValue = endValue;
	this.callBack = callBack;

	function init(){
		this.slider = YAHOO.widget.Slider.getHorizSlider(this.elementBg, this.element, this.startValue, this.endValue);
		this.slider.animate = true;
  		this.slider.subscribe("change", this.callBack);
	}

	function moveToX(x, animationDuration){
		this.slider.setValue(x, false, false, animationDuration);
	}

	function setToX(x){
		this.slider.setValue(x, true);
	}

	function getProcent(){
		var max = this.endValue - this.startValue;
		var cur = this.slider.getXValue() - this.startValue;
		return Math.round(cur / (max/100));
	}

	function percentToX(percent){
		var fullX = this.endValue - this.startValue;
		return (fullX/100)*Math.abs(percent);
	}

	function lockSlider(){
		this.slider.lock();
	}

	function unLockSlider(){
		this.slider.unlock();
	}

	//public functions
	this.init = init;
	this.getProcent = getProcent;
	this.percentToX = percentToX;
	this.lockSlider = lockSlider;
	this.unLockSlider = unLockSlider;
	this.moveToX = moveToX;
	this.setToX = setToX;
}