var loader = '<div class="loader">Loading...</div>';


var Slideshow = function (config) {
	var self = this;

	var id = 'slides',
		current = 0,
		interval = null,
		timeout = null,
		order = 'random',
		total = 0,
		image_to_rotate = 5,
		image_rotate_repeat = 2,
		image_current_index = 0,
		image_current_rotate = 0,
		options = {
			delay: 5000,
			fadeInSpeed: 1500,
			fadeOutSpeed: 1500,
			captionSpeed: 500,
			captionDelay: 500
		};
	
	var random_ids = new Array();
	var random_imgs = new Array();
	var slides = {};
	
	var 
	load = function (n) {
		var slideshow = $(id + ' ul.slides');

		var img = new Image();
		$(img).load(function () {
				$(this).hide();
				
				var tmp = slideshow.html();
				tmp = tmp == null ? '' : tmp;
				//var html = '<li class="hide" rel="' + n + '"><img style="display: none" src="img/slideshow/' + n + '.jpg" /><p style="display: none">' + slides[n].text + '</p></li>';
				var html = '<li rel="' + n + '"><img src="img/slideshow/' + n + '.jpg" /></li>';
				slides[n].html = html;
				slideshow.html(tmp+html);
				/*
				if (n == current) {
					var li = $(id + ' li[rel='+n+']');
					var img = li.find('img');
			 		var p = li.find('p');
					li.show();
					img.show();
					p.show();
					
					start();
				}
				*/
				
			})
			.error(function () {
			})
			.attr('src', 'img/slideshow/' + n + '.jpg');
	},
	show = function (n) {
		var li = $(id + ' ul.slides li[rel='+n+']');
		var img = li.find('img');
		//var p = li.find('p');
		
		// Put random paragraph text
		//p.html(slides[Math.floor(Math.random()*count(slides))].text);

		li.show();
		img.fadeIn(options.fadeInSpeed, function () {});
		//p.hide()
			//.animate({opacity: 1}, options.captionDelay)
			//.fadeIn(options.captionSpeed);
	},
	hide = function (n) {
		var li = $(id + ' ul.slides li[rel=' + n + ']');
		var img = li.find('img');
		var p = li.find('p');
		
		p.fadeOut(options.captionSpeed, function() {});
	
		li.animate({opacity: 1}, 1000).fadeOut(options.fadeOutSpeed, function () {
			img.hide();
			p.hide();
			li.hide();
		});	
	},
	next = function () {
		/*
		hide(current);
		
		if (order == 'sequence') {
			current = current + 1 < count(slides) ? current+1 : 0;
		} else {
			tmp = current;
			current = Math.floor(Math.random()*total);
			//alert(current);
			if (current == tmp) {
				if (current + 1 < total) {
					current++;
				} else if (current - 1 >= 0) {
					current--;
				}
			}
		}
		
		
		image_current_index = image_current_index + 1;
		image_current_index = image_current_index %  image_to_rotate;
		if(image_current_index == 0)
		{
			image_current_rotate = image_current_rotate + 1;
		}
		current = random_ids[image_current_index];
		//alert(current);
		
		show(current);
		$(document).stopTime('interval');
			
		if(!( image_current_rotate == (image_rotate_repeat -1) && image_current_index == (image_to_rotate - 1) ) )
		{
			$(document).oneTime(options.delay, 'interval', function () { next(); });
		}
		*/
		
	},
	prev = function () {
	},
	start = function () {
		//$(id + ' p').fadeIn();
		//$(document).stopTime('fade');
		//$(document).oneTime(options.delay, 'fade', function () { next(); });
	},
	stop = function () {
		//$(id + ' p').fadeOut();
		//$(document).stopTime('fade');
		//$(document).stopTime('interval');
	},
	show_menu = function () {
	    //alert("show_menu");
		$(window).scrollTop(0);
		stop();
		$(id + ' .shade').fadeIn();
		$('#slideshow_menu').fadeIn();
		
		if(navigator.appName.indexOf("Microsoft") != -1)
		{
			document.getElementById("header_slides").style.margin = "-14px 0px 0px 0px";
		}

	},
	hide_menu = function () {
		start();
		$(id + ' .shade').fadeOut();
		document.getElementById("header_slides").style.margin = "0px 0px 0px 0px";
		$('#slideshow_menu').fadeOut();
		
	},
	build = function (_id, config) {

		id = _id;
		
		// Constructor
		options.delay = config.options.delay;
		options.fadeInSpeed = config.options.fadeInSpeed;
		options.fadeOutSpeed = config.options.fadeOutSpeed;
		options.captionSpeed = config.options.captionSpeed;
		options.captionDelay = config.options.captionDelay;
		order = config.options.order;
		total = config.total;
		image_to_rotate = config.image_to_rotate;
		image_rotate_repeat = config.image_rotate_repeat;
		slides = config.captions;
		
		
		for(i=0; i < image_to_rotate; i++)
		{
			random_ids_temp = Math.floor(Math.random()*total);
			while(random_ids.toString().indexOf(random_ids_temp) != -1)
			{
					random_ids_temp = Math.floor(Math.random()*total);
			}
			random_ids[i] = random_ids_temp;
			random_imgs[i] = new Image(100,100);
			random_imgs[i].src = "./img/slideshow/"+random_ids_temp+".jpg";
			
		}
		
		current = random_ids[0];
		
		
		//alert("build");
		/*
		for (var i in slides) {
			slides[i].html = '';
			slides[i].loaded = false;
			load(i);
		}
		*/
		
		var banner_html = "";
		
		for(i=0;i<3;i++)
		{
			banner_html = banner_html + '<li rel="' + random_ids[i] + '"><img src="img/slideshow/' + random_ids[i] + '.jpg" /></li>';
		}
		
		var tmp = $(id).html();
		
		$(id).html(tmp + '<div class="shade"></div><ul class="slides" id="header_slides">'+banner_html+'</ul>');
		
		$(id).hover(null, hide_menu);
	
		
		

		
		//alert(random_ids);
		//alert(options.delay);
	};
	
	// Return
	return {
		current: current,
		options: options,
		slides: slides,
		
		next: next,
		prev: prev,
		build: build,
		show_menu: show_menu,
		hide_menu: hide_menu,
		start: start,
		stop: stop
	}
}();

var Ad = function () {
	var self = this;
	
	var interval;
	
	var
	show = function(name, list, i) {
		$('.ads').hide();
		var holder = $('.ads_holder');
		var html = holder.html();
		html += '<ul id="' + name + '" rel="' + i + '">';
		for (var i=0, l=list.length; i<l; i++) {
			var ad = ads[list[i]];
			rel = ad.warning == false ? ' rel="close"' : '';
			html += '<li class="ad" style="display: block"><a class="url" title="' + ad.title + '" href="' + ad.url + '" style="background-image: url(ads/' + ad.img + ')" ' + rel + '>' + ad.title + '</a></li>';
		}
		html += '</ul>';
		holder.html(html);
	},
	next = function (holder) {}
	;
	
	return {
		show: show
	};
}();

var Page = function () {
	var self = this;
	
	var
	open = function(page, location) {
		var holder = $('#page_content'),
			content = pages[page].content ? pages[page].content : '',
			file = content.substr(content.length-5) == '.html' ? content : (content == '' ? page + '.html' : '');
		
		// Put loader image
		holder.html(loader);

		// Load stuff if needed
		if (file) {		
			$.get(base_url + '/content/' + file, function(data) {
				show(page, data, holder);
			});
		} else {
			show(page, content, holder);
		}	
		
		// Display ads
		
		if (pages[page].ads) {
			$('.ads_holder').html('');
			for (var i=0, l=pages[page].ads.length; i<l; i++) {
				Ad.show('#ad' + i, pages[page].ads[i], i);
			}
		}
		
	},
	show = function (page, content, holder) {
		pages[page].content = content;

		holder.fadeOut('normal', function() {
			holder.html(content);
				
			// Fill boxes
			$('.box').each(function (i) {
				var name = this.id;
				if (boxes[name] != 'undefined') {
					var html = '\
						<h1>' + boxes[name].title + '</h1>\
						<div class="content">' + boxes[name].content + '</div>\
						';
					$(this).html(html);
				}
			});
				
			// Fill texts
			$('.text').each(function (i) {
				var name = this.id;
				if (pages[name] != 'undefined') {
					var text = truncate(pages[name].content, pages[name].params.length);
					text += '<a class="readmore page" href="#' + name + '" rel=":' + name + '">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</a>';
					$(this).html(text);
				}
			});
				
			holder.fadeIn('slow');
			
			$(document).oneTime(1000, function() { $('.ads').fadeIn('slow'); });

			bind();
			fix();
		});
	};
	
	return {
		open: open
	};
}();

var Modal = function () {
	var self = this;

	var
	close = function (page) {
	
		id = '#' + page;
		var e = $(id);
		
		$('#iron_curtain').fadeOut('slow');
		e.fadeOut('slow');
		
		Slideshow.start();
		
		//$('body').css('overflow', 'auto');
		/*$(window).scrollTop(1);*/
		
		$(window).unbind('resize');
	},
	closeAll = function () {
		$('#modals .mod').fadeOut('slow');
		$('#iron_curtain').fadeOut('slow');
		
		Slideshow.start();
		
		//$('body').css('overflow', 'auto');
		/*$(window).scrollTop(1);*/

		$(window).unbind('resize');		
		
		holder = document.getElementById("modals");
		
		while(holder.hasChildNodes()){
			holder.removeChild(holder.lastChild);
		}
	},
	resize = function (page){
		id = '#' + page;
		var e = $(id);
		var ww = $(window).width();
		var wh = $(window).height();
		var mw = e.width();
		var mh = e.height();
		var lw = e.find('.loader');
		var lh = e.find('.loader');
	
		if (ww < mw) {
			e.css('left', (ww / 2) + 'px');
		} else {
			e.css('left', ((ww-mw) / 2) + 'px');
		}
		
		if (wh < mh) {
			e.css('top', 0);
		} else {
			e.css('top', ((wh - mh) / 2) + 'px');
		}
		
		var curtain = $('#iron_curtain');
		curtain.width($(window).width());
		curtain.height($(window).height());
	},
	open = function(name, location) {
		var content = modals[name].content ? modals[name].content : '',
			//file = content.substr(content.length-5) == '.html' ? content : (content == '' ? name + '.html' : ''),
			file = name,
			holder = null,
			show_curtain = true,
			width = 600,
			height = 400,
			title = 'Hello World!',
			ifram_enabled = false;
			
		// Check for params
		if (modals[name]) {
		
			title = modals[name].title ? modals[name].title : title;
			
			if (modals[name].params) {
				width = modals[name].params.size[0] ? modals[name].params.size[0] : width;
				height = modals[name].params.size[1] ? modals[name].params.size[1] : height;
				ifram_enabled = modals[name].params.iframe ? modals[name].params.iframe : ifram_enabled;
				show_curtain = modals[name].params.curtain != undefined ? modals[name].params.show_curtain : show_curtain;
			}
			
		}
		//alert(ifram_enabled);
		// Close all opened modal
		closeAll();
		
		//$('body').css('overflow', 'hidden');
		/*$(window).scrollTop(0);*/
		
		// Create modal HTML hitesh.webmaker@gmail.com style="position:absolute;" this is because of IE
		$('#modals').append('\
			<div id="' + name + '" class="mod" style="display: none">\
				<div class="border"></div>\
				<div class="frame" style="position:absolute;">\
					<div class="header">\
						<h1>' + title + '</h1>\
						<a href="#" class="button close" rel="close" onclick="Modal.closeAll(); return false;">close</a>\
					</div>\
					<div class="content">\
						<div class="modal_content"></div>\
					</div>\
					<div class="footer"></div>\
				</div>\
			</div>\
			');
		var modal = $('#' + name);

		// Windows sizes
		border_size = 6;
		title_height = 10;
		inner_width = width - (20 + 2 * border_size);
		inner_height = height - (35 + 2 * border_size);
		
		// Set size of window
		modal.width(width);
		modal.height(height);

		// Set size of frame
		var frame = modal.find('.frame');
		frame.width(width - (2 * border_size));
		frame.height(height - (2 * border_size));
		frame.css('margin', border_size + 'px')
		resize(name);
		
		// Set size of content holder
		cont = modal.find('.content');
		cont.width(inner_width);
		cont.height(inner_height);
		
		// Set size of text holder
		holder = modal.find('.modal_content');
		holder.width(inner_width);
		holder.height(inner_height);

		// Fix corners
		modal.find('.border').corner();
		modal.find('.frame').corner();		
		modal.find('.header a').corner();
		modal.find('.button').corner();
		
		// Show curtain
		if (show_curtain) {
			var curtain = $('#iron_curtain');
			curtain.width($(window).width());
			curtain.height($(window).height());
			curtain.fadeIn('slow');
			Slideshow.stop();
		}
		
		// Map events
		$(document).resize(function () { resize(name); });
		modal.find('.close').click(function () { close(name);});
		
		// Show loader
		holder.html(loader);
		$('.loader').hide().css('margin-top', (inner_height/2 - 40) + 'px')
				
		// Show modal
		modal.fadeIn('slow', function() { $('.loader').fadeIn(); });
		// Check if we need to load
		if (ifram_enabled) {
			file = file +".html";
			$.get(base_url + 'content/' + file, function(data) {
				show(name, data, holder, ifram_enabled,base_url + 'content/' + file,width,height);
			});
		} else {
			show(name, modals[name].content, holder, ifram_enabled,base_url + 'content/' + file,width,height);
		}
		
		// Attach resize event
		$(window).bind("resize", function(){
			Modal.resize(name);
		});
	},
	show = function (name, content, holder, iframe,file_full_path,width,height) {
		modals[name].content = content;
		if(iframe)
		{
			holder.fadeOut('normal', function() {
				holder.html("<iframe src='"+file_full_path+"' width='"+(width-50)+"px' height='"+(height-50)+"px' frameborder='0'></iframe>");
				holder.jScrollPane();
				bind();
				fix();
				holder.fadeIn('slow');
			});
		}
		else
		{
			holder.fadeOut('normal', function() {
				holder.html(content);
				holder.jScrollPane();
				bind();
				fix();
				holder.fadeIn('slow');
			});
		}
	};  
	
	// Return
	return {
		open: open,
		closeAll: closeAll,
		resize: resize
	}
}();

var Menu = function () {
	var self = this;
	
	var
	build = function (id, config) {
		var c = count(config.tree),
			classes = '',
			href = '',
			menu = $(id),
			html = '',
			page = '';
		
		var i = 0;
		for (var name in config.tree) {			
			var
				type = config.tree[name].type != 'undefined' ? config.tree[name].type : 'page',
				classes = config.tree[name].cls != 'undefined' ? config.tree[name].cls : '',
				data = type == 'page' ? pages : modals;
			
			if (data[name]) {
				var title = type == 'page' ? pages[name].title : modals[name].title;
	
				classes += Number(i)+1 == c ? ' last' : '';
				classes += Number(i) == 0 ? ' first' : '';
				// classes += i == selected ? ' selected' : '';
				//alert('<li class="' + classes + '"><a href="#' + name + '" rel="' + id + ':' + name + '" class="' + type + '">' + title + '</a></li>');
				html += '<li class="' + classes + '"><a href="#' + name + '" rel="' + id + ':' + name + '" class="' + type + '">' + title + '</a></li>';
			}
			
			i++;
		}

		menu.html(html);

		menu.find('a').click(function() { 
			var rel = $(this).attr('rel'),
				tmp = rel.split(':'),
				type = $(this).attr('class');
			open(tmp[1], type, tmp[0]);
		})
	},
	open = function (page, type, id) {
		
		Slideshow.hide_menu();
		
		// Open page or Modal
		if (type.indexOf('page') >= 0) {
			Page.open(page, id);
		} else if (type.indexOf('modal') >= 0) {
			Modal.open(page, id);
		}
	};

	// Return
	return {
		build: build,
		open: open
		}
}();

// Utility functions
function trim(str) {
	var	str = str.toString().replace(/^\s\s*/, ''),
		ws = /\s/,
		i = str.length;
	while (ws.test(str.charAt(--i)));
	return str.slice(0, i + 1);
}
function count(obj) {
	var len = 0;
	for (var k in obj) len++;
	return len;
}

function scrolling() {
	$('#modal_content').jScrollPane();
}
function truncate(str, limit) {
	var bits, i;

	str = remove_tags(str);
	bits = str.split('');
	
	if (bits.length > limit) {
		for (i = bits.length - 1; i > -1; --i) {
			if (i > limit) {
				bits.length = i;
			} else if (' ' === bits[i]) {
				bits.length = i;
				break;
			}
		}
		bits.push('...');
	}
	
	return bits.join('');
};
function remove_tags(str) {
 	return str.replace(/<\/?[^>]+(>|$)/g, "");
}
