//----------------------------------------------------------------------------------------------------------------------
// variables

var isIntroPlaying = true;
var closeIntention;
var loadPage_pageToLoad = 0;
var currentPageId = -9999;
var currentSubsection = "";
var currentItemId = -9999;
var hashParams = [];
var workUidToLoad = -9999;
var dl = 0;
//----------------------------------------------------------------------------------------------------------------------
// initialization

do { 
	/** 
	 * fixes issue with IE and Flash causing titles to change appending the location.hash values 
	 * @see http://stackoverflow.com/q/5062918
	 */
	var originalTitle = document.title.split("#")[0];
	if ($.browser.msie) {
		document.attachEvent('onpropertychange', function (evt) {
			if(evt.propertyName === 'title' && document.title !== originalTitle) {
				setTimeout(function () {
					document.title = originalTitle;
				}, 1);
			}
		});
	}

	//Incase the developer wants to change the title manually, instead of directly using     //document.title=newtitle, he will need to use changeTitle(newTitle)
	function changeTitle(newTitle)
	{
		originalTitle = newTitle;
		document.title = newtitle;
	}
} while(false);


$(document).ready(startSitePreloaderIntro);

function mobileClick(event) {
	event.preventDefault();
	$(event.target).trigger('click');
}

function startSitePreloaderIntro() {
	
	if(isMobile() == true) {
		document.addEventListener('mousedown', mobileClick, false);
		document.addEventListener('mouseenter', mobileClick, false);
		document.addEventListener('mouseover', mobileClick, false);
		document.addEventListener('onfocus', mobileClick, false);
	}
	
	//traceOut("==================================================");
	//traceOut("  NEW EXECUTION ");
	//traceOut("==================================================");
	
	var hashtag = getHashtag();
	if(parseInt(hashtag['dl'])!=1) {
		//Backbone.history.navigate('');
		isIntroPlaying = true;
		dl = 0;
	} else {
		dl = 1;
	}
	
	if(!isIE()) {
		$('body').css({
			'overflow-y':'scroll',
			'overflow-x':'scroll'
		});
	}
	
	setTimeout(startSitePreloaderIntro2, 500);

}

var loadTime;
function startSitePreloaderIntro2() {
	//traceOut("startSitePreloaderIntro2()...");
	
	//--------------------------------------------------------------------------------
	// preload assets
	preloaderServices.preloadImages(preloadParams, onAllPreloadComplete, onPreloadProgress);
	preloaderNumUpdate();
	preloaderNumIntervalId = setInterval(preloaderNumUpdate, 50);
	var d = new Date();
	loadTime = d.getTime();
	
	//--------------------------------------------------------------------------------
	// intro animation
	
	var theCursor = $('<div id="preloaderIntroCursor"></div>');
	theCursor.width(13);
	theCursor.height(30);
	theCursor.hide();
	theCursor.css('background-color','#424242');
	theCursor.css('position','absolute');
	
	var _parts = $('#preloader-copy0')
					.html()
						.replace(/(^\s+)|(\s+$)/, '')
						.replace(/\s+/, ' ')
						.replace(/<br(?: \/)?>/i, '<br />')
						.split('<br />');
	
	$('#preloader-copy0').html('');
	
	var _prevElement = null;
	$(_parts).each(function() {
		var _element = $('<span/>');
		_element
			.css('display', 'none')
			.text(this.toString());
		
		$('#preloader-copy0').append(_element).append('<br />');
		
		_element.data('typeOutDeffered', jQuery.Deferred());
		
		if (_prevElement) {
			_prevElement.data('typeOutDeffered').done(function() {
				theCursor.hide();
				_element
					.css('display', 'inline')
					.typeOut(
						25, 
						function() {
							_element.data('typeOutDeffered').resolve();
						}, 
						theCursor
					);
			});
		} else {
			theCursor.hide()
			_element
				.css('display', 'inline')
				.typeOut(
					25, 
					function() {
						_element.data('typeOutDeffered').resolve();
					}, 
					theCursor
				);
		}
		_prevElement = _element;
	});
	_prevElement.next().remove(); // remove the <br>
	_prevElement.data('typeOutDeffered').done(
		function() {
			$('#preloader-copy1').css('visibility', 'visible');
		},
		sitePreloaderIntro2
	);
	
	//$('#preloader-copy0').typeOut(25, sitePreloaderIntro2, theCursor);
	$('#preloader-wrapper').append(theCursor);
	$('#preloader-copy0-wrapper').show();
	
}

//--------------------------------------------------------------------------------
// preloader

var preloadCount = 0;
var PRELOADER_MAX = 85;
var targetPreloaderNum = 2;
var currentPreloaderNum = 0;
var maxDelta = 1.8;
function onPrelaoderEachLoadComplete(tobj) {
	preloadCount++;
	targetPreloaderNum = (preloadCount / (preloadParams.length - 1) * PRELOADER_MAX);
}

function preloaderNumUpdate() {
	var delta = (targetPreloaderNum - currentPreloaderNum);
	// Fixing that the preloader should go to 100%
	// TODO: Verify that this will work correctly
	//if(delta > maxDelta) delta = maxDelta;
	
	currentPreloaderNum += delta;
	$('#preloader-number').text(Math.round(currentPreloaderNum) + '%');
	if(Math.floor(currentPreloaderNum) >= 100) {
		clearInterval(preloaderNumIntervalId);
	}
}

function onPreloadProgress() {
	
}

function onAllPreloadComplete() {
	//traceOut("onAllPreloadComplete()...");
	
	var da = new Date();
	loadTime = (da.getTime() - loadTime) / 1000;
	loadRate = preloaderServices.getTotalBytes() / loadTime;
	//traceOut2('loading time:'+loadTime);
	//traceOut2('totalBytes:'+preloaderServices.getTotalBytes());
	//traceOut2(loadRate + " kb / sec");
	
	targetPreloaderNum = PRELOADER_MAX;
	var standardRate = 350000;
	maxDelta = 1.2 * loadRate / standardRate;
	preloaderNumUpdate();
	sitePreloaderIntro2Check();
	
	targetPreloaderNum = 100;
	
}

var preloaderNumIntervalId;

function sitePreloaderIntro2() {
	//traceOut2('sitePreloaderIntro2()...');
	var randomColors = ['#ff7202', '#ffd425', '#9bc204', '#0e9a82', '#ce3677'];
	$('#preloaderIntroCursor').remove();
	$('#preloader-copy1').randomColorBlinker(50, randomColors, ['#fff'], 'color');
	
	setTimeout(function() {
		$('#preloader-copy1').randomColorBlinker(50, randomColors, 'color');
		$('#preloader-copy1').css('color', randomColors[Math.floor(Math.random()*randomColors.length)]);
		$('#preloader-copy1').data('jquery_plugin_randomColorBlinker_timerId');
	}, 500);
	
	setTimeout(function() {
		//traceOut('type out intro is done. now check!!');
		sitePreloaderIntro2Check();
	}, 1000);
}

var sitePreloaderIntro2CheckCount = 0;
function sitePreloaderIntro2Check() {
	//traceOut('sitePreloaderIntro2Check()...');
	sitePreloaderIntro2CheckCount++;
	if(sitePreloaderIntro2CheckCount >= 2) {
		sitePreloaderIntro3();
	}
}

function sitePreloaderIntro3() {
	//traceOut('sitePreloaderIntro3()...');
	//$('#preloader-number').fadeOut();
	init();
}

var initFunc = function() {
	//traceOut("main.js:initFunc()...");
	//init();
}

var currentColumnIndex;

function init() {
	//traceOut("init()...");
	//$(window).resize(repositionWrappers);
	repositionWrappers();
	
	$('#search-overlay').hide();
	$('#search-overlay-2').hide();
	$('#nav-footer').hide();
	$('#primary-wrapper').hide();
	
	$('#logo').hide();
	
	$('#nav-primary').hide();
	
	if(isMobile() == false) {
		$('.nav-primary-link[data-pageid=0]').parent().mouseenter(function() {
			showHideAllworkLink('show');
		});
		$('.nav-primary-link[data-pageid=0]').parent().mouseleave(function() {
			if(getHashtag()['pageid'] != 0 || true) {
				showHideAllworkLink('hide');
			}
		});
	}
	
	$('#primary-wrapper').delay(250).fadeIn();
	
	Backbone.history.start();
	
	var hashParams = getHashtag();
	if(hashParams['pageid'] >= 0) {
		//traceOut('// there is a page specified. so skip intro.');
		isIntroPlaying = false;
	} else {
		//traceOut('// no page is specified. so play the intro.');
		isIntroPlaying = true;
		updateHashtag2({pageid:0});
	}
	
	//traceOut("init():post-proc:isIntroPlaying=="+isIntroPlaying);
	
}

function navClick(_this) {  
	if($(_this).attr('data-navid')==0) {
		forceToOpenAsFeaturedWork = true;
	}
}

//--------------------------------------------------------------------------------
// page loader

var loadPageStatus = 0;// 0:nothing, 1:loading, 2:init
var hashtagsWhileLoading;
var pageLoadWaitTimerId;
function loadPage(pageId) {
	//traceOut("loadPage():"+pageId);
	
	clearTimeout(pageLoadWaitTimerId);
	
	$('.nav-primary-item > a').each(function() {
		
		disableLink(this);
		
	});
	
	if(loadPageStatus > 0) return;
	
	loadPageStatus = 1;
	hashtagsWhileLoading = document.location.hash;
	
	pageId = parseInt(pageId);
	
	if(pageId != 2) {
		stopFooterPosChange();
		$('#nav-footer').fadeOut();
		
		loadPage_pageToLoad = pageId;
		
		if(loadPage_pageToLoad == -1) {
			loadPage_pageToLoad = 0;
			hashParams['pageid'] = loadPage_pageToLoad;
			//hashParams['itemid'] = -1;
		}
		
		if(loadPage_pageToLoad==0 && currentPageId==0 && hashParams['itemid'] == -1) {
			showColumn(currentColumnIndex, -1);
		} else {
			// need to kill current page
			$('#content-wrapper').stop(true, true);
			$('#content-wrapper').fadeOut(250);
			$('#content-wrapper').animate({top:-30}, {
				duration:250,
				easing:"easeInQuad",
				queue:false,
				complete:function() {
					loadPage2(loadPage_pageToLoad);
				}
			});
		}
	}
}

function showHideAllworkLink(showHide) {
	$('.nav-primary-item-allwork').stop(true,true).animate({width:(showHide=='show')?(120):(0)},150);
	$('.nav-primary-item-allwork-diabled').stop(true,true).animate({width:(showHide=='show')?(120):(0)},150);
}

function updateMainNav() {
	
	var hashtags = getHashtag();
	
	//traceOut('updateMainNav():pageid=='+hashtags['pageid']+', subsection=='+hashtags['subsection']);
	
	$('#nav-primary > #theList > div > a').removeClass('nav-primary-link-disabled');
	$('.nav-primary-link-allwork').removeClass('nav-primary-link-disabled');
	
	//if it is a static page
	if(parseInt(hashtags['pageid']) == 4){
		$('#nav-primary > #theList > div > a[data-navsubid="'+hashtags['id']+'"]').addClass('nav-primary-link-disabled');
	}else{
		$('#nav-primary > #theList > div > a[data-pageid="'+hashtags['pageid']+'"]').addClass('nav-primary-link-disabled');
	}
	
	
	
	if(hashtags['pageid'] == 0) {
		if(hashtags['subsection']==-1 || hashtags['subsection']==$('.column').length-1) {
			//$('#nav-primary > #theList > div > a[data-pageid="0"]').removeClass('nav-primary-link-disabled');
			$('.nav-primary-link-allwork').addClass('nav-primary-link-disabled');
		}
	}
	
	/*
	if(hashtags['pageid'] == 0) {
		showHideAllworkLink('show');
	} else {
		showHideAllworkLink('hide');
	}
	*/
	
}

var loadTime;
function loadPage2(pageId) {
	//traceOut("loadPage2():pageId=="+pageId);
	
	try {
		killPage();// is defined in each page
	} catch(e) {
		
	}
	
	if(isIE() == true) {
		pageLoadWaitTimerId = setTimeout(function() {
			loadPage3(pageId);
		},250);
	} else {
		loadPage3(pageId);
	}
	
}

function loadPage3(pageId) {
	
	$('#content-wrapper').hide();

	var fileName = mainNavServices.getPageFileNameByPageId(pageId);
	
	$('#content-wrapper').empty();
	
	//document.location.hash = fileName;
	if(!isIntroPlaying) {
		$('#content-wrapper').css({
			top:30
		});
	} else {
		$('#content-wrapper').css({
			top:0
		});
	}
	
	//traceOut("loadPage2():loading "+fileName)
	
	$('#content-wrapper').load(fileName, function(){
		setTimeout(onLoadPageComplete,500);
	});
	
	var d = new Date();
	loadTime = d.getTime();
	
}

function showGlobalFixtures(twnDelay) {
	//traceOut("showGlobalFixtures()...");
	
	if(!twnDelay) twnDelay = 0;
	
	//traceOut('showGlobalFixtures():twnDelay=='+twnDelay);
	
	twnDelay += 800;
	
	$('#nav-primary').delay(twnDelay).show();
	
	$('#logo').delay(twnDelay).fadeIn();
	
	$('#nav-primary > #theList > div').each(function() {
		var navigationItem = $(this); 
		
		navigationItem.delay(twnDelay + parseInt(navigationItem.attr('data-navId')) * 100).animate({width:240},1000,"easeOutQuart");
	});
	
	twnDelay += $('.nav-primary-item').length*100;
	
	setTimeout(function() {
		updateMainNav($('.nav-primary-link[data-pageid="'+loadPage_pageToLoad+'"]').attr("data-navid"));
	}, twnDelay);
	
	$('#search-icon').delay(twnDelay).fadeIn();
	
	$('#nav-footer').delay(twnDelay).fadeIn();
	startFooterPosChange();
	
}

var initiateCounter = 0;
/*
function onLoadPageComplete(response, status, xhr) {
	//traceOut("onLoadPageComplete() with timer 5sec...");
	
	$('#preloader-wrapper').hide();
	
	currentPageId = loadPage_pageToLoad;
	
	if(isIntroPlaying) {
		$('#content-wrapper').fadeIn(600);
	} else {
		$('#content-wrapper').stop(true, true);
		//$('#content-wrapper').hide();
		$('#content-wrapper').animate({top:0}, {duration:500, easing:"easeOutQuad", queue:false});
		$('#content-wrapper').fadeIn();
		//updateMainNav(currentPageId);
	}
	
	var hashParams = getHashtag();
	
	if(currentPageId==0) {
		initFunc(hashParams['itemid'], hashParams['pageid']);
	} else {
		//initPage();
		initFunc();
		showGlobalFixtures(0);
	}
	
	//-----------------------
	// initiate once
	
	if(initiateCounter == 0) {
		
		$('.search').siteSearch();
		$('.search').returnSearch();
		$(window).bind('scroll', scrollPositionCheck);
	
		initiateCounter++;
		//alert("test");
		
	} else {
		
		$('#nav-footer').fadeIn();
		startFooterPosChange();
		
	}
	
	repositionWrappers();
	
}
*/

function onLoadPageComplete(response, status, xhr) {
	//traceOut("onLoadPageComplete():new hashtag found:pageid=="+getHashtag()['pageid']+',itemid=='+getHashtag()['itemid']+',subsection=='+getHashtag()['subsection']);
	
	//traceOut("onLoadPageComplete():isIntroPlaying=="+isIntroPlaying);
	
	var d = new Date();
	//traceOut('onLoadPageComplete():loadTime=='+Math.round((d.getTime() - loadTime)/1000*10)/10);
	
	currentPageId = loadPage_pageToLoad;
	
	if(isIntroPlaying && $('#preloader-wrapper').length > 0) {
		$('#preloader-wrapper').animate({left:'700%'}, 800, "easeInQuart");
	} else {
		var dur = 500;
		$('#preloader-wrapper').fadeOut(dur *.5);
		$('#preloader-wrapper').animate({top:-50},{
			duration:dur *.5,
			ease:"easeInQuart",
			queue:false,
			complete:function() {
				//$('#preloader-wrapper').remove();
			}
		});
	}
	
	if(isIntroPlaying) {
		$('#content-wrapper').fadeIn(600);
	} else {
		var dur = 500;
		$('#content-wrapper').stop(true, true);
		$('#content-wrapper').animate({top:0}, {duration:dur, easing:"easeOutQuad", queue:false});
		$('#content-wrapper').fadeIn(dur);
	}
	
	showGlobalFixtures((isIntroPlaying)?(1000):(0));
	
	initFunc();
	
	//-----------------------
	// initiate once
	
	if(initiateCounter == 0) {
		
		$('.search').siteSearch();
		$('.search').returnSearch();
		if((isMobile()) ==false) {
			$(window).bind('scroll', scrollPositionCheck);
		}
	
		initiateCounter++;
		//alert("test");
		
	} else {
		
		$('#nav-footer').fadeIn();
		startFooterPosChange();
		
	}
	
	repositionWrappers();
	
	loadPageStatus = 0;
	
	if(hashtagsWhileLoading != document.location.hash) {
		hashtagsWhileLoading = '';
		loadNewHashtag();
	}
	
	$('.nav-primary-item > a').each(function() {
		
		enableLink(this);
		
	});
	
}

//----------------------------------------------------------------------------------------------------------
// load item

//var loadItemOfThePage;
function loadItem(itemid, subsection) {
	//traceOut("loadItem():itemid=="+itemid);
	if(loadItemOfThePage && loadItemOfThePage.call) {// defined in each page that needs to load an item.
		loadItemOfThePage(itemid, subsection);
	}
}


//--------------------------------------------------------------------------------
// utilities

function openFooterLink(url) {
	window.open(url,"_blank","menubar=yes, toolbar=yes, location=yes, status=yes, resizable=yes, scrollbars=yes");
}

//----------------------------------------------------------------------------------------------------------------------
// window resize

var footerRepositionTimer;
function startFooterPosChange() {
	//traceOut('startFooterPosChange()...');
	//$(window).bind('resize',repositionFooter);
	//$('#primary-wrapper').bind('resize',repositionFooter);
	footerRepositionTimer = setInterval(repositionFooter,(isMobile() == true)?(1000):(30));
	
}

var lastWidth;
var lastHeight;
function repositionWrappers(forceUpdate) {
	
	//--------------------------------------------------------------------------------
	// the wrapper
	var tWidth = $(window).width();
	if(tWidth < 1209) tWidth = 1209;
	var tHeight
	if(tHeight < 600) tHeight = 760;
	
	if(lastWidth == tWidth && lastHeight == tHeight && forceUpdate==true) {
		return;
	}
	
	lastWidth = tWidth;
	lastHeight = tHeight;
	
	if($('#nav-footer').css('display') == 'none') {
		tHeight = $(window).height();
	} else {
		tHeight = $('#nav-footer').offset().top + $('#nav-footer').height();
	}
	
	//var tHeight = $(window).height() - $('#nav-footer').height();
	$('#size-control-wrapper').css({
		top:0,
		width:tWidth,
		//width:'100%',
		height:tHeight
	});
	
	if($('#lightbox_FWVideoWrapper') && $('#lightbox_FWVideoWrapper').length > 0) {
		
		//traceOut("FWVideo wrapper found!");
		//--------------------------------------------------------------------------------
		// light box
		
		var tWidth = $(window).width();
		var tHeight = tWidth * (9 / 16);
		
		var videoBox = $('#lightbox_FWVideoWrapper');
		videoBox.css({
			position:'fixed',
			width:$(window).width(),
			height:$(window).height()
		});

		var mult = .80;// the size factor of the video
		var videoWidth = tWidth *mult;
		var videoHeight = tHeight *mult;
		if(videoWidth < 860) {
			videoWidth = 860;
			videoHeight = videoWidth * (9 / 16);
		}
		$('.showcaseImgWrapper', videoBox).css({
			position:'relative',
			width:videoWidth,
			height:videoHeight,
			left:$(window).width()*.5,
			top:tHeight * (1 - mult) * .5,
			'margin-left':-videoWidth *.5
		});

		$('.showcaseImgWrapper > .FWVideo > object', videoBox).css({
			width:videoWidth,
			height:videoHeight
		});

		var theBottom = $('#lightbox_FWVideoBox > .showcaseImgWrapper > .FWVideo').offset().top + $('#lightbox_FWVideoBox > .showcaseImgWrapper > .FWVideo').height();
		$('#lightbox_FWVideoBox > .showcaseImgWrapper > .FWVideo').tubeplayer('size', {
			width:videoWidth,
			height:videoHeight
		});
		
		var theControl = $('.videoControlWrapper-fullscreen > .videoControl');
		var theControlBottom = theBottom - 80 - $(window).scrollTop() + theControl.height();
		if(theControlBottom < $(window).height()) {
			theControl.css({
				top:theBottom - 80 - $(window).scrollTop(),
				'margin-top':0
			});
		} else {
			theControl.css({
				top:$(window).height() - theControl.height(),
				'margin-top':0
			});
		}
		
		$('.fullscreen-close', videoBox).css({
			//top:$('#lightbox_FWVideoBox > .showcaseImgWrapper > .FWVideo').offset().top - $(window).scrollTop() - 40,
			//left:$('#lightbox_FWVideoBox > .showcaseImgWrapper > .FWVideo').offset().left + $('#lightbox_FWVideoBox > .showcaseImgWrapper > .FWVideo').width() - 28
			top:$('#lightbox_FWVideoBox > .showcaseImgWrapper > .FWVideo').offset().top - $(window).scrollTop(),
			left:$('#lightbox_FWVideoBox > .showcaseImgWrapper > .FWVideo').offset().left + $('#lightbox_FWVideoBox > .showcaseImgWrapper > .FWVideo').width() + 20
		});

		//--------------------------------------------------------------------------------
		// footer

		var padding = 30;
		var theNavFooter = $('#nav-footer');
		if(theBottom + padding > $(window).height() - $('#nav-footer').height()) {
			theNavFooter.css({
				'position':'fixed',
				'top':theBottom + padding,
				'margin-top':0
			});
		} else {
			theNavFooter.css({
				'position':'fixed',
				'top':-$('#nav-footer').height(),
				'margin-top':'100%'
			});
		}
	}
}

function stopFooterPosChange() {
	clearInterval(footerRepositionTimer);
}

function repositionFooter() {
	
	repositionWrappers();
	
	//--------------------------------------------------------------------------------
	// control size-control-wrapper size
	
	//traceOut("onWindowResizeFooter():window.height=="+$(window).height()+",primary-wrapper.height=="+$('#primary-wrapper').height()+",nav-footer.height=="+$('#nav-footer').height());
	if($('#lightbox_FWVideoWrapper') && $('#lightbox_FWVideoWrapper').length > 0) {
		//
	} else {
		
		var theNavFooter = $('#nav-footer');
		// the full screen lightbox is NOT up - so the footer should interact with the page contents
		if($(window).height() >= $('#content-wrapper').height() + theNavFooter.height()) {
			theNavFooter.css({
				'position':'fixed',
				top:'100%',
				'margin-top':-$('#nav-footer').height()
			});
		} else {
			theNavFooter.css({
				'position':'absolute',
				top:$('#content-wrapper').height(),
				'margin-top':0
			});
		}
		
	}
	
}

//--------------------------------------------------------------------------------
// keyboard control related

function activateKeyboardControl(pageId) {
	
	/*
	$("body").keydown(function(event) {
		
		//traceOut(event.keyCode);
		if(featureToggles.checkToggleOf("KEYBOARD_COMMANDS")) {
			switch(event.keyCode) {
				case 40:{// down arrow
					expandColumn(currentColumnIndex);
					break;
				}
				case 38:{// up arrow
					//contractColumn(currentColumnIndex);
					break;
				}
				case 37:{// left arrow
					event.preventDefault();
					if(showColumnId2>0) {
						showColumn(showColumnId1, showColumnId2-1,false);
					}
					break;
				}
				case 39:{// left arrow
					event.preventDefault();
					if(showColumnId2<fwServices.getNumOfFeaturedWorks()+1) {
						showColumn(showColumnId1, showColumnId2+1,false);
					}
					break;
				}
				case 1+48:
				case 2+48:
				case 3+48:
				case 4+48:
				case 5+48:
				case 6+48:
				case 7+48:
				case 8+48:
				case 9+48:{
					if(event.keyCode-1-48 < fwServices.getNumOfFeaturedWorks()) {
						showColumn(currentColumnIndex, event.keyCode-48-1);
					}
					break;
				}
				case 0+48:{
					
					break;
				}
			}
		}
	});
	*/
	
}

function scrollTopAnimationKiller() {
	$(window).stop();
	$(window).clearQueue();
	$('body').stop();
	$('body').clearQueue();
}

//----------------------------------------------------------------------------------------------------------
// hashtag handling

function getHashtag() {
	var retHashParams = {};
	
	if(document.location.hash) {
		var originalHash = document.location.hash.toLowerCase();
		if(originalHash.charAt(0)=='#' && originalHash.charAt(1)=='!') {
			var pairs = originalHash.substring(2, originalHash.length).split('&');
			for(var pair in pairs) {
				var hashParam = pairs[pair].split('=');
				retHashParams[hashParam[0]] = parseInt(hashParam[1]);
			}
		}
	}
	
	return retHashParams;
}

function updateHashtag2(params) {
	//traceOut("updateHashtag2():pageid=="+params.pageid+', subsection=='+params.subsection+', itemid=='+params.itemid);
	
	params = $.extend({
		pageid:null,
		subsection:null,
		itemid:null
	}, params);
	
	var newHash = [];
	newHash['pageid'] = params.pageid;
	newHash['subsection'] = params.subsection;
	newHash['itemid'] = params.itemid;
	
	var hashOutput = "";
	for(var hashId in newHash) {
		//traceOut('updateHashrag2():updating '+hashId+' to '+newHash[hashId]);
		hashOutput += '&' + hashId + "=" + newHash[hashId];
	}
	//hashOutput = hashOutput.substring(0,hashOutput.length);
	
	Backbone.history.navigate(hashOutput, !params.quietUpdate);
	
	return hashOutput;
}

function loadNewHashtag() {
	traceOut("loadNewHashtag()...");
	
	var hashTags = getHashtag();
	
	if((currentPageId != hashTags['pageid']) || currentPageId == 4) {
		//traceOut("loadNewHashtag():pageid is different.");// pageid is different. so load the new page. item will be loaded in onLoadComplete. each page provides its own loadItem.
		loadPage(hashTags['pageid']);
	} else if(currentItemId != hashTags['itemid'] || currentSubsection != hashTags['subsection']) {
		//traceOut("loadNewHashtag():pageid is not different.");
		// pageid is the same, but different itemid.each page takes care of loading the item.
		loadItem(hashTags['itemid'], hashTags['subsection']);
		currentSubsection = hashTags['subsection'];
		currentItemId = hashTags['itemid'];
	}
}

function disableLink(_this) {
	$(_this).attr('__disableLink_href',$(_this).attr('href'));
	$(_this).attr('disabled', 'disabled');
	$(_this).removeAttr('href');
}

function enableLink(_this) {
	$(_this).attr('href', $(_this).attr('__disableLink_href'));
	$(_this).removeAttr('__disableLink_href');
	$(_this).removeAttr('disabled');
}

// adding a bbdo namespaces and containers
var bbdo = {
		app: {}, // instances
		classes: {} // classes
	};

(function () { /* Bbdo application init */

	bbdo.classes.Workspace = Backbone.Router.extend({
		routes: { // the routes should be defined from most exact to most common
			//"help":                 				"help",    // #help
			//"search/:query":        				"search",  // #search/kiwis
			//"search/:query/p:page": 				"search",   // #search/kiwis/p7
			"/search/*query": 'search_page',
			'*url': "not_routed" 
		},
		
		initialize: function(options) {
			this.route(/(?:pageid=([^&]+))/, 'legacy_page', this.legacy_page);
			
			// Legacy FE compatyblity
			Backbone.history.bind('fragmentchanged', function (from, to) {
				updateMainNav();
			});
		},
		
//			help: function() {
//				console.log(this, arguments);
//			},
//
//			search: function(query, page) {
//				console.log(this, arguments);
//			},
		search_page: function (query) {
			$.fn.fetchGeneralData(query);
			var _binded = false;
			if (!_binded) {
				_binded = true;
				Backbone.history.bind('fragmentchanged', function (from, to) {
					if (to.indexOf('/search/') !== 0) {
						$.fn.siteSearch.exitSearch();
						Backbone.history.unbind('fragmentchanged', arguments.callee);
						_binded = false;
					}
				});
			}
		},
		
		// Legacy FE compatyblity
		legacy_page: function (pageid) {
			//if(console && console.log) console.log(['legacy_page', arguments]);
			loadNewHashtag();
		},

		not_routed: function (url) {
			// a route to just log not routed urls for speedup of development
			//if(console && console.log) console.log(["route:not_routed", arguments]);
			return false;
		}
	});

	bbdo.app.router = new bbdo.classes.Workspace();

	//Backbone.history.bind('fragmentchanged', function (from, to) {
	//	if(console && console.log) console.log(['fragmentchanged', from, to]);
	//});

	//$(function(){
//			Backbone.history.start();
////			if (!Backbone.history.getFragment()) {
////				Backbone.history.navigate('&pageid=0');
////			}
	//});
	
})();
