var portfolio_root,portfolio_last, portfolio_buttons, portfolio_controls, portfolio_title, portfolio_items_container, portfolio_slides;

var portfolio_tolerance=5, portfolio_scroll_increment=100;

var portfolio_scroll_transition='easeInQuad';

var portfolio_title={
	original : document.title,
	current : document.title,
	sep : ' - ',
	tag : 'h2'
};

(function($){
	$(document).ready(function(){
		portfolio_root=$('.portfolio')[0];
		portfolio_items_container=$(portfolio_root).find('.portfolio-items-listing')[0];
		portfolio_buttons=$(portfolio_root).find('.portfolio-item-button');
		portfolio_slides=$(portfolio_root).find('.portfolio-items .portfolio-item');
		portfolio_content=$(portfolio_slides).find('.portfolio-item-content');
	
		portfolio_controls=portfolio_get_controls();
	
		$(portfolio_items_container).find('.button').attr('href','javascript:;');
				
		if(portfolio_items_container){
			$(portfolio_items_container).scroll(function(){
				if(portfolio_scroll_at_top(this)){
					portfolio_toggle_control(portfolio_controls.up,'hide');
				}else{
					portfolio_toggle_control(portfolio_controls.up,'show');
				}
				if(portfolio_scroll_at_bottom(this)){
					portfolio_toggle_control(portfolio_controls.down,'hide');
				}else{
					portfolio_toggle_control(portfolio_controls.down,'show');
				}
			});
		}
		if(portfolio_slides && portfolio_slides.length>0){

			for(var i=0; i<portfolio_content.length; i++){
				$(portfolio_content[i]).scroll(function(){
					portfolio_controls=portfolio_get_controls($(this).parent());
					if(portfolio_scroll_at_top(this)){
						portfolio_toggle_control(portfolio_controls.slide_up,'hide');
					}else{
						portfolio_toggle_control(portfolio_controls.slide_up,'show');
					}
					if(portfolio_scroll_at_bottom(this)){
						portfolio_toggle_control(portfolio_controls.slide_down,'hide');
					}else{
						portfolio_toggle_control(portfolio_controls.slide_down,'show');
					}
				});
			}
		}
	});
})(jQuery);

function portfolio_get_controls(container,controls){
	(function($){
		container = container || portfolio_root;
		
		controls = {
			up : $(portfolio_root).children('.button-up_arrow')[0] ||  $(portfolio_root).find('*').filter(':visible').children('.button-up_arrow')[0],
			down : $(portfolio_root).children('.button-down_arrow')[0] ||  $(portfolio_root).find('*').filter(':visible').children('.button-down_arrow')[0],
			slide_up : $(portfolio_root).find('.portfolio-item').filter(':visible').children('.button-up_arrow')[0],
			slide_down : $(portfolio_root).find('.portfolio-item').filter(':visible').children('.button-down_arrow')[0],
			item : $(portfolio_root).find('.portfolio-item').filter(':visible')
		};	
	})(jQuery);
	
	return controls;
}

function portfolio_item_change(item){
	if(item.player=='flv' || item.player=='swf'){
		Shadowbox.pause();
		_log('@@@2',Shadowbox.isOpen(),Shadowbox.isPaused());
	}
}

function portfolio_toggle_control(control,state){
	if(!control || !state)
		return false;

	(function($){
		
		var arrow=control.className.split('button-');
		arrow='.'+arrow[arrow.length-1];
		
		if($(control).find(arrow).length>0){
			arrow=$(control).find(arrow);
			switch(state){
				case 'show':
					arrow.css('visibility','visible');
					break;
				case 'hide':
					arrow.css('visibility','hidden');
					break;
			}
		}
		
	})(jQuery);
	
}

function portfolio_key(ele){
	if(!ele)
		return '';

	var key=ele.id || ele.name;
	key=key.split('--');
	return key[key.length-1];
}

function portfolio_change_title(title){
	document.title=title+portfolio_title.sep+portfolio_title.original;
	portfolio_title.current=document.title;
}

function portfolio_focus(ele,sub){
	if(!sub){
		sub=false;
	}
	
	if(portfolio_last)
		hide('portfolio-item--'+portfolio_key(portfolio_last));
	
	if(!sub){
		var hash, content_container;

		(function($){
			$(portfolio_items_container).find('.portfolio-item-button.selected').removeClass('selected');
			$(portfolio_items_container).find('.toc').hide();
			$(ele).parent().find('.toc').show();
			
			$(portfolio_slides).hide();
			
			var title=$('#portfolio-item-button--'+portfolio_key(ele)).find(portfolio_title.tag);
			title=title.text().replace(title.children().text(),'');
			_log(title);
			portfolio_change_title(title);
			
			content_container=$('#portfolio-item--'+portfolio_key(ele));
			if(content_container.length>0){
//				_log('$$content',content_container);
//				portfolio_controls=portfolio_get_controls(content_container);
			}else{
				content_container=false;			
			}
			
		})(jQuery);
		
		show(content_container[0] || 'portfolio-item--'+portfolio_key(ele));
		
		(function($){
			if(content_container.length>0){
//				_log('$$content',content_container);
				portfolio_controls=portfolio_get_controls(content_container);
			}
		})(jQuery);
		portfolio_last=ele;
	}else{
		(function($){
			$(ele).parents('.toc').siblings('.portfolio-item-button').click();
			

			hash=$('#'+ele.id+'-hash');
			content_container=hash.parents('.portfolio-item-content');
			content_scroll=get_offset(hash[0]).top - get_offset(content_container[0]).top - hash.parent().height();

			content_container.animate({
				scrollTop: content_scroll
			},{
				easing:portfolio_scroll_transition
			});
			
			$(ele).parents('.toc').find('.toc-chapter').removeClass('selected');
		})(jQuery);
	}
	addClass(ele,'selected');

	if(portfolio_controls.up && portfolio_scroll_at_top()){
		portfolio_toggle_control(portfolio_controls.up,'hide');
	}else if(portfolio_controls.up){
		portfolio_toggle_control(portfolio_controls.up,'show');
	}
	if(portfolio_controls.down && portfolio_scroll_at_bottom()){
		portfolio_toggle_control(portfolio_controls.down,'hide');
	}else if(portfolio_controls.down){
		portfolio_toggle_control(portfolio_controls.down,'show');
	}
}

function portfolio_sub_focus(ele){
	return portfolio_focus(ele,true);
}

function portfolio_set_title(title){
	var current=document.title.split(' - ');
	
	if(!empty(portfolio_title)){
		current[0]=title;
	}
	
	portfolio_title=title;
}

function portfolio_scroll_up(button){
	if(!portfolio_buttons)
		return false;
		
	var scrollTo=false;
	
	if(button==portfolio_controls.slide_up){
		(function($){
			content_container=$(button).parent().children('.portfolio-item-content');
			content_container.animate({
				scrollTop: $(content_container).scrollTop()-portfolio_scroll_increment
			},{
				easing:portfolio_scroll_transition
			});
		})(jQuery);
	}else{
	
		var scrollNum=3; //number of elements to 
			
		for(var i=0; i<portfolio_buttons.length; i++){
	//		_log(i,portfolio_buttons[i],shown(portfolio_buttons[i]),(i==portfolio_buttons.length-1 ? portfolio_buttons.length-1 : i+1));
			if(shown(portfolio_buttons[i])){ //if this element is shown, scroll to the last element not-shown;
				scrollTo=portfolio_buttons[(i<scrollNum ? 0 : i-scrollNum)];
				break;
			}
		}
		
//		_log('up',scrollTo);
		
		if(scrollTo){
			(function($){
				content_container=$(scrollTo).parent().parent();
				content_container.animate({
					scrollTop: get_offset(scrollTo).top-get_offset(content_container[0]).top
				},{
					easing:portfolio_scroll_transition
				});
			})(jQuery);

//			window.location.href=scrollTo.href;
			if(portfolio_controls.down){
				portfolio_toggle_control(portfolio_controls.down,'show');
			}
			if(portfolio_controls.up && portfolio_scroll_at_top()){
				portfolio_toggle_control(portfolio_controls.up,'hide');
			}
		}
	}
}

function portfolio_scroll_down(button){
//	_log('click',button,portfolio_controls.slide_down,$(button).parent());
//	_log('click',$(button).parent().children('.portfolio-item-content').length,$(button).siblings('.portfolio-item-content').length);
	if(!portfolio_buttons)
		return false;
		
	var scrollTo=false;
	
	if(button==portfolio_controls.slide_down){
		(function($){
			content_container=$(button).parent().children('.portfolio-item-content');
			content_container.animate({
				scrollTop: $(content_container).scrollTop()+portfolio_scroll_increment
			},{
				easing:portfolio_scroll_transition
			});
		})(jQuery);
	}else{
			
		for(var i=portfolio_buttons.length-1; i>=0; i--){ //something about simpler solution if it's reversed
			if(shown(portfolio_buttons[i])){ //if this element is shown, scroll to the last element not-shown;
				scrollTo=portfolio_buttons[(i==portfolio_buttons.length-1 ? portfolio_buttons.length-1 : i+1)];
				break;
			}
	//		_log(i,portfolio_buttons[i],shown(portfolio_buttons[i]),(i==portfolio_buttons.length-1 ? portfolio_buttons.length-1 : i+1));
		}
		
//		_log('down',button,portfolio_controls.slide_down);
		
		
		
		if(scrollTo){
			(function($){
				content_container=$(scrollTo).parent().parent();
				content_container.animate({
					scrollTop: get_offset(scrollTo).top-get_offset(content_container[0]).top
				},{
					easing:portfolio_scroll_transition
				});
			})(jQuery);
	//		scrollTo.onclick();
//			window.location.href=scrollTo.href;	
			if(portfolio_controls.up){
				portfolio_toggle_control(portfolio_controls.up,'show');
			}
			if(portfolio_controls.down && portfolio_scroll_at_bottom()){
				portfolio_toggle_control(portfolio_controls.down,'hide');
			}
		}
	}
}

function portfolio_scroll_at_top(container){
	container = (container || portfolio_items_container);
	
	return (container.scrollTop<=portfolio_tolerance/* || shown(portfolio_buttons[0])*/);
}

function portfolio_scroll_at_bottom(container){
	container = (container || portfolio_items_container);

	return (((container.scrollTop+$(container).height() <= container.scrollHeight+portfolio_tolerance) && (container.scrollTop+$(container).height() >= container.scrollHeight-portfolio_tolerance)) || (container==portfolio_items_container && shown(portfolio_buttons[portfolio_buttons.length-1])));
}

/* ~EN: system-level functions, but required for componentisation */

function shown(ele,parent){
	if(!ele){
		return false;
	}
	return (function($){
		var offset=get_offset(ele);
		parent=parent || ele.offsetParent || $(ele).parent()[0];
		var parent_offset=get_offset(parent);
		var parent_offset_top=parent_offset.top || 0;
		
//		_log(parent,{offset2:offset.top,parent_offset:parent_offset_top,parent_scroll:parent.scrollTop},(offset.top+$(ele).height()-parent_offset.top) , ($(parent).height()+parent.scrollTop),'!!',parent_offset);
		
		var ele_top=offset.top+$(ele).height()-parent_offset_top;
		
		return ((ele_top <= ($(parent).height()+parent.scrollTop)) && (ele_top >= parent.scrollTop));
	})(jQuery);
}

function get_offset(ele,offset){
    var _i=0;
    if(!ele || !defined(ele.offsetTop)){
        return false;
    }
        
    offset=offset || {top:ele.offsetTop, left:ele.offsetLeft};
    
    while(ele.offsetParent){
        ele=ele.offsetParent;
        offset.top+=ele.offsetTop;
        offset.left+=ele.offsetLeft;
    }
    
    return offset;
}

function empty(mixed_var) {
	/* ~EN: pulled from phpjs.org */
    var key;

    if (mixed_var === "" || mixed_var === 0 || mixed_var === "0" || mixed_var === null || mixed_var === false || typeof mixed_var === 'undefined') {
        return true;
    }

    if (typeof mixed_var == 'object') {
        for (key in mixed_var) {
            return false;
        }
        return true;
    }

    return false;
}

function is_object(mixed_var) {
	/* ~EN: pulled from phpjs.org */
    if (Object.prototype.toString.call(mixed_var) === '[object Array]') {
        return false;
    }
    return mixed_var !== null && typeof mixed_var == 'object';
}

function defined(ele){
    return typeof(ele)!='undefined';
}

function _log(){
	if(this.console){
		window.console.log( Array.prototype.slice.call(arguments) );
	}
/*
	if(!window.console)
		return false;
	console.log.apply(null,arguments);*/
}

String.prototype.endsWith = function(suffix) {
    return this.indexOf(suffix, this.length - suffix.length) !== -1;
};

