
function gebi(n) {
	if (!n) return false;
	if (!document.getElementById(n)) return false;
	return document.getElementById(n)
}

/*----------------------------------------------------------- ajax -----------------------------------------------------*/
var page = {
	settings: {},

	load: function(id, url, form, data, hash) {
		if (gebi(id)) {
			this.settings[id] = new this.fc(id, url, form, data, hash);
			this.settings[id].start();
		}
		
		return false;
	},
	
	script: function(text, iwRun) {
		var scriptIndex = 0;
		var IWScripts = new Array();
		
		document.onIWRun = null;
		document.IWLoaded = true;

		/* remove all scripts */
		text = text.replace(/<(\/?)script/gi, "<$1script");
		
		var scriptStart = text.indexOf("<script");
		var scriptEnd = -1;
		var scriptBody = "";

		while(scriptStart > -1) {
			scriptEnd = text.indexOf("</script>") + 9;
			scriptBody = text.substring(text.indexOf(">", scriptStart)+1, scriptEnd - 9);

			//reset collection function
			document.onIWComplete = null;
			try {
				eval(scriptBody);
			} catch (e) {
				alert(e);
			}
			if (document.onIWComplete) {
				IWScripts[scriptIndex] = document.onIWComplete;
				scriptIndex++;
			}

			//new html without executed script;
			text = text.substring(0,scriptStart)+text.substring(scriptEnd, text.length);
			scriptStart = text.indexOf("<script");
		}

		if (typeof document.onIWRun == 'function' && iwRun) {
			document.onIWRun(text);
		}

		if (IWScripts.length) {
			for (var i = 0; i < IWScripts.length; i++) {
				try {
					IWScripts[i]( );
				} catch (e) {
					alert(e);
				}
			}
		}		
	},
	
	vars: function() {
		var vars = {};
		
		if (window.location.href.indexOf('#:') != -1) {
			var hash;
			var hashes = window.location.href.slice(window.location.href.indexOf('#:') + 2).split('&');
			
			for(var i = 0; i < hashes.length; i++) {
				hash = hashes[i].split('=');
				if (i == 0 && !hash[1]) {
					vars['load'] = hash[0];
				} else {
					vars[hash[0]] = hash[1];
				}
			}
		}
		
		return vars;
	}
};

/* constructor */
page.fc = function(id, url, form, data, hash) {
	this.id = id;
	this.url = url;
	this.form = form;
	this.data = data;
	this.preloader = 1;
	this.manipulation = 'html'; //jquery manipulations
	
	try {
		for (var i in hash) this[i] = hash[i];
	} catch(e) {
		alert(e);
	}
}

/* methods */
page.fc.prototype = {
	offset: function () {
		var h = gebi(this.id).offsetHeight + 'px';
	
		$('#' + this.id + ' div.preloader2 div.preoverlay2').css({ height:h });
		$('#' + this.id + ' div.preloader2 div.pretimer2').css({ height:h });
	},
	
	overlay: function() {
		var self = this;
		var tag = $('#' + this.id).get(0).tagName.toLowerCase();
		
		if (tag == 'tr') {
			$('#' + this.id).before('<tr id="' + this.id + '_preloader2" class="preloader2"><td><div class="pretimer2"></div></td></tr>');
		} else {
			$('#' + this.id).prepend('<div id="' + this.id + '_preloader2" class="preloader2"><div class="preoverlay2"></div><div class="pretimer2"></div></div>');
		}
		this.offset();
		
		$(window).resize(function() {
			self.offset();
		});
	},
	
	success: function(html) {
		var bodyStart = html.toLowerCase().indexOf("<body>");
		var bodyEnd = html.toLowerCase().indexOf("</body>");

		if (bodyStart > -1 && bodyEnd > -1)	{
			html = html.substring( bodyStart + 6, bodyEnd );
		}
		
        //alert(gebi(this.id + '_preloader'));
		switch(this.manipulation) {
			case 'append':
				$('#' + this.id).append(html);
				$('#' + this.id + '_preloader2').remove();
				page.script(html);
				break;
			case 'prepend':
				$('#' + this.id).prepend(html);
				$('#' + this.id + '_preloader2').remove();
				page.script(html);
				break;
			case 'replaceWith':
				$('#' + this.id).replaceWith(html);
				page.script(html);
				break;	
			case 0:
			case 'none':
				$('#' + this.id + '_preloader2').remove();
				page.script(html, 1);
				break;
			default:
				$('#' + this.id).html(html);
				page.script(html);
		}
        //alert(gebi(this.id + '_preloader'));
		$('#' + this.id).removeClass('preloader-container2');
	},
	
	start: function () {
		var self = this;
		
		$('#' + this.id).addClass('preloader-container2');
        
		if (this.preloader) this.overlay();

		if (this.form) {
			var options = {
				type: 'post',
				url: self.url,
				data: self.data ? self.data : false,
				success: function(html) {
					if (self.preloader) {
						setTimeout(function(){
							self.success(html);
						}, 500);
					} else {
						self.success(html);
					}
				}
			};			
			$(this.form).ajaxSubmit(options);
		} else {
			$.ajax({
				type: 'get',
				url: self.url,
				data: self.data ? self.data : false,
				success: function(html) {
					if (self.preloader) {
						setTimeout(function(){
							self.success(html);
						}, 500);
					} else {
						self.success(html);
					}
				}
			});
		}
	}
};


/*---------------------------------------------------------- toggle ----------------------------------------------------*/
var toggle = {
	radio: function(_this) {
		$('input[name=' + _this.name + ']').each(function(){
			if (this.id) $('label[for=' + this.id + ']').removeClass('js-active');
		});
		
		if (_this.id && _this.checked) $('label[for=' + _this.id + ']').addClass('js-active');
		
		_this.blur();
	}
};


/*-------------------------------------------------------- pagination --------------------------------------------------*/
var pagination = {
	timer		: 0,
	start		: 0,	/* current start item */
	onpage		: 0,	/* items on page */
	length		: 0,	/* items on page with hidden */
	cols		: 0,	/* cols quantity */
	rows		: 0,	/* set rows count */
	quantity	: 0,	/* total element quantity */
	pages		: 0,	/* pages quantity */
	current		: 0,	/* current page */
	width		: 150,	/* item max width */
	range		: 9,	/* pages before and after current */
	source		: 'table.video-grid',	/* source block selector */
	items		: 'td.video-item',		/* items selector */
	
	success: function() {
		var url = document.location.toString();
		
		url = url.split('#');
		document.location.href = url[0] + '#:video&start=' + this.start;
		
		alert('start=' + this.start + '\nonpage=' + this.onpage);
	},
	
	init: function(options, resize) {	
		try {
			for (var i in options) this[i] = options[i];
		} catch(e) {
			alert(e);
		}

		var self = this;
		var $items = $(self.source + ' ' + self.items);
        var $rows = $items.parent();    
		var items = $items.get();
		var length = items.length;
		
		$items.not(':nth-child(1)').css({ display:'none' });
		
		var cols = parseInt($(self.source).parent().width() / self.width);
		var rows = Math.floor(length / cols);
		var row = 1;
		var $row = $('<tr />');
		
		$items.css({ display:'' });
		
		if (!resize || !self.cols || cols != self.cols) { //alert(1);
			self.cols = cols;
			
			$rows.remove();
			
			$row.appendTo(self.source);
			
			if (self.pages && self.length && self.pages == self.startToPage(self.start)) { /* last page */
				rows = Math.floor(self.length / cols);
				rows = self.rows && self.rows < rows ? self.rows : rows; /* custom rows count */
			} else {
				rows = self.rows && self.rows < rows ? self.rows : rows; /* custom rows count */
				self.length = length;
			}

			for (i = 0; i < length; i++) {
				if (i != 0 && !(i % cols)) {
					$row = $('<tr />');
					$row.appendTo(self.source);
					row++;
				}
				
				$row.append(items[i]);
				
				if (row > 1 && row > rows) {
					$row.css({ display:'none' });
				}
			}
			
			self.onpage = rows * cols;
			
			self.create();
			
			self.ctrl();
			
			self.resize();
		}
	},

	resize: function() {
		var self = this;
		
		self.winevnt = function(e) {
			clearTimeout(self.timer);
		
			self.timer = setTimeout(function(){
				self.init({}, 1);
			}, 100);
		};
		$(window)
			.unbind('resize', self.winevnt)
			.bind('resize', self.winevnt);
	},
	
	ctrl: function() {
		var self = this;
		
		self.docevnt = function(e) {
			if (e.ctrlKey && !e.altKey && !e.shiftKey) {
				switch (e.keyCode) {
					case 37:
						$('span.pagination-prev a').click();
						break;
					case 39:
						$('span.pagination-next a').click();
						break;
				}
			}
		};
		$(document)
			.unbind('keydown', self.docevnt)
			.bind('keydown', self.docevnt);
	},
	
	pageToStart: function(i) { /* calculate start item from page number  */
		var mod = this.start % this.onpage;
			
		start = (mod ? i - 1 : i) * this.onpage + mod;
		
		return start < 0 ? 0 : start;
	},
	
	startToPage: function(start) { /* calculate page number from start item */
		return Math.ceil(start / this.onpage);
	},
	
	create: function(){
		var self = this;
		
		var $prev = $('span.pagination-prev a');
		var $next = $('span.pagination-next a');
		var $pages = $('div.pagination-pages a');
		
		$prev
			.removeClass('pagination-disabled')
			.click(function(){
				self.navigate(this, 'prev');
			});
		$next
			.removeClass('pagination-disabled')
			.click(function(){
				self.navigate(this, 'next');
			});
		$pages.remove();
		
		var mod = self.start % self.onpage;
		self.pages = Math.ceil((self.quantity - mod) / self.onpage) + (mod ? 1 : 0) - 1; /* pages count from 0 */
		
		self.current = self.startToPage(self.start);
		
		/* previous and next buttons */
		if (self.current == 0) $prev.addClass('pagination-disabled');
		if (self.current == self.pages) $next.addClass('pagination-disabled');
		
		/* first and last pages */
		var first = (self.current - self.range) < 0 ? 0 : self.current - self.range;
		var last = (self.current + self.range) > self.pages ? self.pages : self.current + self.range;
		
		if	(self.current > self.range) { /* current - range - 1 */
			var $page =	$('<a />')
							.attr('href', '#:prev')
							.attr('title', self.current - self.range)
							.text('...')
							.click(function(){
								self.navigate(this, self.current - self.range - 1);
								return false;
							});
			$page.appendTo('div.pagination-pages');
		}
		
		for (i = first; i <= last; i++) { /* range + current + range) */
			var $page =	$('<a />')
							.attr('href', '#:' + (i + 1))
							.text(i + 1)
							.click(function(page){
								return function() {
									self.navigate(this, page);
									return false;
								}
							}(i));
			$page.appendTo('div.pagination-pages');
			if (i == self.current) {
				$page.addClass('pagination-disabled');
			}
		}
		
		if	(self.current <= self.pages - self.range - 1) { /* current + range + 1 */
			var $page =	$('<a />')
							.attr('href', '#:next')
							.attr('title', self.current + self.range + 2)
							.text('...')
							.click(function(){
								self.navigate(this, self.current + self.range + 1);
								return false;
							});
			$page.appendTo('div.pagination-pages');
		}
	},
	
	navigate: function(_this, page) { /* dinamic navigation */
		var start = 0;
		
		if (isNaN(page)) { /* previous and next page */
			page = this.current + (page == 'prev' ? -1 : 1);
		}
		
		if (!(page < 0 || page > this.pages || page == this.current)) {
			this.start = this.pageToStart(page);
			this.success();
			
			$(document).unbind('keydown', self.docevnt);
		}
	}
}

/*-------------------------------------------------------- classsic pagination --------------------------------------------------*/
var pagination_classic = {
	timer		: 0,
	start		: 0,	/* current start item */
	onpage		: 0,	/* items on page */
	length		: 0,	/* items on page with hidden */
	cols		: 0,	/* cols quantity */
	rows		: 0,	/* set rows count */
	quantity	: 0,	/* total element quantity */
	pages		: 0,	/* pages quantity */
	current		: 0,	/* current page */
	width		: 150,	/* item max width */
	range		: 9,	/* pages before and after current */
	source		: 'table.video-grid',	/* source block selector */
	items		: 'td.video-item',		/* items selector */
	
	success: function() {
		var url = document.location.toString();
		
		url = url.split('#');
		document.location.href = url[0] + '#:video&start=' + this.start;
		
		alert('start=' + this.start + '\nonpage=' + this.onpage);
	},
	
	init: function(options, resize) {	
	   
		try {
			for (var i in options) this[i] = options[i];
		} catch(e) {
			alert(e);
		}

		var self = this;
		if (!resize || !self.cols || cols != self.cols) { //alert(1);
			self.onpage = 30;
			
			self.create();
			
			self.ctrl();
			
			self.resize();
		}
	},

	resize: function() {
		var self = this;
		
		self.winevnt = function(e) {
			clearTimeout(self.timer);
		
			self.timer = setTimeout(function(){
				self.init({}, 1);
			}, 100);
		};
		$(window)
			.unbind('resize', self.winevnt)
			.bind('resize', self.winevnt);
	},
	
	ctrl: function() {
		var self = this;
		
		self.docevnt = function(e) {
			if (e.ctrlKey && !e.altKey && !e.shiftKey) {
				switch (e.keyCode) {
					case 37:
						$('span.pagination-prev a').click();
						break;
					case 39:
						$('span.pagination-next a').click();
						break;
				}
			}
		};
		$(document)
			.unbind('keydown', self.docevnt)
			.bind('keydown', self.docevnt);
	},
	
	pageToStart: function(i) { /* calculate start item from page number  */
		var mod = this.start % this.onpage;
			
		start = (mod ? i - 1 : i) * this.onpage + mod;
        
		return start < 0 ? 0 : start;
	},
	
	startToPage: function(start) { /* calculate page number from start item */
		return Math.ceil(start / this.onpage);
	},
	
	create: function(){
		var self = this;
		
		var $prev = $('span.pagination-prev a');
		var $next = $('span.pagination-next a');
		var $pages = $('div.pagination-pages a');
		
		$prev
			.removeClass('pagination-disabled')
			.click(function(){
				self.navigate(this, 'prev');
			});
		$next
			.removeClass('pagination-disabled')
			.click(function(){
				self.navigate(this, 'next');
			});
		$pages.remove();
		
		var mod = self.start % self.onpage;
		self.pages = Math.ceil((self.quantity - mod) / self.onpage) + (mod ? 1 : 0) - 1; /* pages count from 0 */
		
		self.current = self.startToPage(self.start);
		
		/* previous and next buttons */
		if (self.current == 0) $prev.addClass('pagination-disabled');
		if (self.current == self.pages) $next.addClass('pagination-disabled');
		
		/* first and last pages */
		var first = (self.current - self.range) < 0 ? 0 : self.current - self.range;
		var last = (self.current + self.range) > self.pages ? self.pages : self.current + self.range;
		
		if	(self.current > self.range) { /* current - range - 1 */
			var $page =	$('<a />')
							.attr('href', '#:prev')
							.attr('title', self.current - self.range)
							.text('...')
							.click(function(){
								self.navigate(this, self.current - self.range - 1);
								return false;
							});
			$page.appendTo('div.pagination-pages');
		}
		
		for (i = first; i <= last; i++) { /* range + current + range) */
			var $page =	$('<a />')
							.attr('href', '#:' + (i + 1))
							.text(i + 1)
							.click(function(page){
								return function() {
									self.navigate(this, page);
									return false;
								}
							}(i));
			$page.appendTo('div.pagination-pages');
			if (i == self.current) {
				$page.addClass('pagination-disabled');
			}
		}
		
		if	(self.current <= self.pages - self.range - 1) { /* current + range + 1 */
			var $page =	$('<a />')
							.attr('href', '#:next')
							.attr('title', self.current + self.range + 2)
							.text('...')
							.click(function(){
								self.navigate(this, self.current + self.range + 1);
								return false;
							});
			$page.appendTo('div.pagination-pages');
		}
	},
	
	navigate: function(_this, page) { /* dinamic navigation */
		var start = 0;
        
		if (isNaN(page)) { /* previous and next page */
			page = this.current + (page == 'prev' ? -1 : 1);
		}
		
		if (!(page < 0 || page > this.pages || page == this.current)) {
			this.start = this.pageToStart(page);
			this.success();
			
			$(document).unbind('keydown', self.docevnt);
		}
	}
}

