﻿// get wheel dir
function getWheelDir( _event) {
	 var delta; // dir: 1 up, -1 down

	 // Opera + IE - wheelDelta
	 if (_event.wheelDelta) {
		  delta = _event.wheelDelta / 120;

		  // opera - wheelDelta with negative sign
		  //if ( typeof $.browser.opera != 'undefined' ) 
			//	delta = -delta;

	 // Gecko - detail
	 } else if (_event.detail)
		  delta = -_event.detail / 3;

	 return delta;
};

function DaysInMonth(_month, _year){
    var days;


    switch(_month){
        case 1: case 3: case 5: case 7: case 8: case 10: case 12:
            days = 31; break;

        case 4: case 6: case 9: case 11:
            days = 30; break;

        case 2: if( _year % 4==0 && _year % 100 != 0 || _year % 400==0 )
                    days = 29;
                else
                    days = 28;
    }

    return days;
};



function imageLoad(_cfg){
	var img = new Image();

	if( _cfg.hasOwnProperty('load') )
		img.onload = _cfg.load;
	
	if( _cfg.hasOwnProperty('error') )
		img.onerror = _cfg.error;

	if( _cfg.hasOwnProperty('abort') )
		img.onabort = _cfg.abort;

	img.src = _cfg.src;
	
	return img;
};


// $
(function($) {

	jQuery.cookie = function(name, value, options) {
		 if (typeof value != 'undefined') { // name and value given, set cookie
			  options = options || {};
			  if (value === null) {
					value = '';
					options.expires = -1;
			  }
			  var expires = '';
			  if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
					var date;
					if (typeof options.expires == 'number') {
						 date = new Date();
						 date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
					} else {
						 date = options.expires;
					}
					expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
			  }
			  // CAUTION: Needed to parenthesize options.path and options.domain
			  // in the following expressions, otherwise they evaluate to undefined
			  // in the packed version for some reason...
			  var path = options.path ? '; path=' + (options.path) : '';
			  var domain = options.domain ? '; domain=' + (options.domain) : '';
			  var secure = options.secure ? '; secure' : '';
			  document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
		 } else { // only name given, get cookie
			  var cookieValue = null;
			  if (document.cookie && document.cookie != '') {
					var cookies = document.cookie.split(';');
					for (var i = 0; i < cookies.length; i++) {
						 var cookie = jQuery.trim(cookies[i]);
						 // Does this cookie string begin with the name we want?
						 if (cookie.substring(0, name.length + 1) == (name + '=')) {
							  cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
							  break;
						 }
					}
			  }
			  return cookieValue;
		 }
   };

	
	// $(this).addClass('').siblings().removeClass('');
	$.fn.switchSibClass = function( _class ){
		this.addClass( _class ).siblings().removeClass( _class );
	};


	// unselect
	$.fn.unselectable = function(){
		return this.each(function(){

			if ( typeof $.browser.msie != 'undefined' ) // IE
				this.ondrag = this.onselectstart = function(){ return false; };

			else if( typeof $.browser.opera != 'undefined' )
				$(this).attr('unselectable', 'on');

			else // .FF + Safari,Chrome + CSS 3
				$(this).css({ '-moz-user-select': 'none', '-khtml-user-select': 'none', 'user-select': 'none' });
		});
	};


	$.fx.step.color = function(fx) {

		 if (fx.state == 0 ) {
			  var start = $.curCSS(fx.elem, 'color');

			  var res = start.match(/rgb\(([0-9]{1,3}),\s?([0-9]{1,3}),\s?([0-9]{1,3})\)/);
			  var rgb;


			  if (!res) {
				  res = start.match(/^#(\w{2})(\w{2})(\w{2})$/);
				  rgb = [parseInt(res[1], 16), parseInt(res[2], 16), parseInt(res[3], 16)];
			  } else {
				  rgb = [parseInt(res[1]), parseInt(res[2]), parseInt(res[3])];
			  }

			  fx.start = rgb;
			  //try{
			  //if( typeof fx.end == 'string' )
					fx.end = [parseInt(fx.end.substr(1,2),16), parseInt(fx.end.substr(3,2),16), parseInt(fx.end.substr(5,2),16) ];
			  //} catch(er){  }

			  fx.opts = { dR:fx.end[0] - fx.start[0]
							  , dG:fx.end[1] - fx.start[1]
							  , dB:fx.end[2] - fx.start[2]
			  };
		 }

		 var R = Math.round( fx.opts.dR * fx.pos + fx.start[0]);
		 var G = Math.round( fx.opts.dG * fx.pos + fx.start[1]);
		 var B = Math.round( fx.opts.dB * fx.pos + fx.start[2]);

		 fx.elem.style.color = 'rgb('+R+','+G+','+B+')';
	};


	// image loader
	$.fn.imgload = function( _load ){
		var loadedCount = 0;
		var imgList = []; // 4 opera
		var qty = this.length;
		var newImg;


		function onLoad(){
			loadedCount++;

			if( loadedCount == qty )
				_load();
		};

		for(var i=0; i< qty; i++ ){
			newImg = new Image();
			newImg.onload = newImg.onerror = newImg.onabort = onLoad;
			newImg.src = this[i].getAttribute('src');

			imgList.push(newImg);  // 4 opera
		};
	};


	// ;
	$.fn.gallery = function( _cfg ){

		if( this.length == 0 )
			return this;

		var $list = this;
        var $images = new Array();

        if(!$list.length){
            return;
        }

        $list.each(function(i){
            var src = $(this).parent('a').attr('href');
            $images[i] = $('<img src="'+src+'">');
        })

//        console.debug($images);

		//var cache = {};

		var $bgr   = $('#htmltemplates .photoOneBlockBg').clone(true);
		var $block = $('#htmltemplates .photoLentaBlock2').clone(true);

		var $lent = $block.find('.lenta');

		var $close = $lent.find('.close');
		var $wrap  = $lent.find('.wrap');

		var $next = $wrap.find('.next');
		var $prev = $wrap.find('.prev');

		var $arNext = $wrap.find('.arrowNext');
		var $arPrev = $wrap.find('.arrowPrev');

		var $cur = $wrap.find('.cur');
			// img .num .descr

		var cur = 0;
		var size = $list.length;
		var preloaderSrc = '/media/i/preloadercircle.gif';

        var preloader = $('<img src="'+preloaderSrc+'">');

		var scrollTop;

		var mode = 'hide';


		/* prepare */
		$bgr.css({ position: 'absolute' });
		$block.css({ position: 'absolute'/*, 'overflow-x': 'auto'*/ });

		$bgr.hide().appendTo( 'body' );
		$block.hide().appendTo( 'body' );

		$lent.find('dfn:first span')[0].nextSibling.nodeValue = ' ' + _cfg.title;

		/* prepare */
		// var list  = $list.get();
		// item = { imgsrc:'', descr:'', number:1, img:null }


		var hand = {
			  show : function( _prm ){

				  mode = 'show';

				  // magic with scroll
				  scrollTop = $(document).scrollTop();
				  $(document).scrollTop( 0 ); // scroll top

				  // + set title
				  $bgr.show();
				  $block.show();

				  cur = _prm.n;

				  $bgr.css({ height: $('#container').outerHeight()+102 });
				  $cur.find('.num span')[0].nextSibling.nodeValue = ' из ' + $list.length; // 2 init

				  this.showCur();
				}

			, showCur: function(){
				  var $img = $list.eq(cur);
				  var $a = $img.parent('a');
				  var img = $img[0];

				  var src = img.getAttribute('src');//$item.attr('src');
				  var descr = ''; //img.getAttribute('rel');//$item.attr('rel');


				  $cur.find('.num span').text( cur+1 );

				  // set img + description
				  $cur.find('.descr').text( descr );

				  // set cur img
				  $cur.find('img').replaceWith(preloader);
//				  imageLoad({
//					  src: $a.attr('href')
//					  , load: function( _img ){
							$cur.find('img').replaceWith($images[cur]);
							hand.adjust( $images[cur][0].width );
//						}
//				  });

				  // set prev img
				  $prev.html(preloader);
//				  imageLoad({
//					  src: $list.eq( cur==0?size-1:cur-1 ).parent('a').attr('href')
//					  , load: function(){
//                          console.debug($($images[(cur==0?size-1:cur-1)]));
						  $prev.find('img').replaceWith($images[(cur==0?size-1:cur-1)]);
//						}
//				  });

				  // set next img
				  $next.html(preloader);
//				  imageLoad({
//					  src: $list.eq( cur==(size-1)?0:cur+1 ).parent('a').attr('href')
//					  , load: function(){
//                          console.debug($($images[cur==(size-1)?0:cur+1]));
                          $next.find('img').replaceWith($images[cur==(size-1)?0:cur+1]);
//				        }
//				  });
				}

			, adjust: function( w ){
				//var w = parseInt( $cur.find('img').css('width'), 10 );

				if( w != 0 ){
					$lent.css({ width: w,  marginLeft: -w/2 });
					$cur.css({width: w});
				}
			}

			, close: function(){
					mode = 'close';

					$bgr.fadeOut(222);
					$block.fadeOut(222);
				
					$(document).scrollTop( scrollTop );
				}

			, next: function(){
					cur++;

					if( cur == $list.length )
						cur = 0;

					this.showCur();
				}

			, prev: function(){
					cur--;

					if( cur < 0 )
						cur = $list.length-1;

					this.showCur();
				}

		};

		$(document).keyup( function(ev){
			if( mode == 'close' )
				return;

			if( ev.keyCode == 27 ){
				hand.close();
			} else if( ev.ctrlKey ){
				if( ev.keyCode == 37 )
					 hand.prev();
				else if(  ev.keyCode == 39 )
					 hand.next();
			}
		});

		$arNext.click(function(){ hand.next(); });
		$arPrev.click(function(){ hand.prev(); });

		$next.click(function(){ hand.next(); });
		$prev.click(function(){ hand.prev(); });

		$close.click(function(){ hand.close(); });

		// attach
		$list.each(function(i){
			$(this).click(function(_ev){
				hand.show({n:i});

			}).parent().click(function(_ev){
				_ev.preventDefault();

			});
		});
	};

})(jQuery);


function imageLoad(_cfg){
	var img = new Image();

	if( _cfg.hasOwnProperty('load') )
		img.onload = function(){ _cfg.load( img ); };

	if( _cfg.hasOwnProperty('error') )
		img.onerror = function(){ (_cfg.error || _cfg.load)( img ); };

	if( _cfg.hasOwnProperty('abort') )
		img.onabort = function(){ (_cfg.abort || _cfg.load)( img ); };

	img.src = _cfg.src;

	return img;
};

function Calendar( _cfg ){

	this.cfg    = _cfg;
	this.$day   = _cfg.$day;
	this.$month = _cfg.$month;
	this.$year  = _cfg.year;


	_cfg.$day.empty();
	_cfg.$month.empty();
	_cfg.$year.empty();

	for(var i=0;i<monthList.length;i++)
		_cfg.$month.append( $('<option value='+(i+1)+'>'+monthList[i]+'</option>') );

	for(var i=(new Date().getFullYear());i>=1900;i--)
		_cfg.$year.append( $('<option value='+i+'>'+i+'</option>') );


	function ChangeDate() {
		var daysQty = DaysInMonth(parseInt(_cfg.$month.val(),10), parseInt(_cfg.$year.val(),10));
		var cur = parseInt(_cfg.$day.val(), 10);
		var optsDay = _cfg.$day.find('option');

		if( daysQty == optsDay.length )
			;

		else if ( daysQty > optsDay.length )
			for (var i = optsDay.length + 1; i <= daysQty; i++)
				_cfg.$day.append('<option value=' + i + '>' + i + '</option>');

		else if (daysQty < optsDay.length)
			for (var i = optsDay.length; i > daysQty; i--)
				_cfg.$day.find('option:last').detach();

		if (cur > daysQty)
			$slctDay.find('option:last').attr('selected');

		_cfg.ChangeDate();
	};

	ChangeDate();

	_cfg.$day.change( ChangeDate );
	_cfg.$month.change(ChangeDate );
	_cfg.$year.change( ChangeDate );
};


function CalendarFrame( _cfg ){

	var self = this;

	this.$block = _cfg.$tmpl.clone(true).hide();
	
	this.$years  = this.$block.find('ul._year');
	this.$months = this.$block.find('ul._month');
	this.$days   = this.$block.find('table._days td');
	
	this.curDate = new Date();
	this.minYear = _cfg.minYear || 2000;

	this.cur = { year: _cfg.year || this.curDate.getFullYear()
				  , month: _cfg.month || this.curDate.getMonth()+1
				  , day: _cfg.day || this.curDate.getDate()
	};

	this.closetimeout;

	
	$('body').append( this.$block );


	/* view */
	this.$block
	
	.mouseenter(function(){
		clearTimeout( self.closetimeout );
	})

	.mouseleave(function(){
		self.closetimeout = setTimeout(function(){ self.close() }, 555 );
	})

	// year
	.delegate('ul._year li', 'click', function(){
		var $li=$(this); 

		if( $li.parent().hasClass('show') ){
			$li.switchSibClass('cur');

			self.cur.year = parseInt( this.getAttribute('rel'), 10);
			self.refreshDays();

			if( typeof _cfg.refreshDays == 'function' )
				_cfg.refreshDays();

			if( typeof _cfg.changeDate == 'function' )
				_cfg.changeDate();
		}

		$li.parent().toggleClass('show');
	})

	// month
	.delegate('ul._month li', 'click', function(){
		var $li=$(this); 

		if( $li.parent().hasClass('show') ){
			$li.switchSibClass('cur');

			self.cur.month = parseInt( this.getAttribute('rel'), 10);
			self.refreshDays();

			if( typeof _cfg.refreshDays == 'function' )
				_cfg.refreshDays();

			if( typeof _cfg.changeDate == 'function' )
				_cfg.changeDate();
		}

		$li.parent().toggleClass('show');
	})

	// day
	.delegate('table._days td._isDay', 'click', function(){
		self.cur.day = parseInt( this.getAttribute('rel'), 10)

		if( typeof _cfg.changeDate == 'function' )
			_cfg.changeDate();
	});

	this.$block.find('div.close').click( function(){ self.close(); } );


	/**/
	// refresh days in month
	this.refreshDays = function(){

		var $cels = this.$block.find('._days td');

		var days = DaysInMonth( this.cur.month, this.cur.year );
		var firstDay = (new Date(this.cur.year, this.cur.month-1, 1)).getDay();


		if( firstDay == 0 )
			firstDay = 7;

		firstDay--;

		$cels.each(function(i){
			var $td = $(this);

			if( i<firstDay || i>(firstDay+days-1) ){
				$td.removeClass('_isDay').attr('rel', '' ).html('&nbsp;');
			} else {
				$td.addClass('_isDay').attr('rel', i-firstDay+1 );
				$td.html(i-firstDay+1);
			}
		});

		this.$block.find('._days tr:has(td)').show().not(':has(td._isDay)').hide();
	};

	this.close = function(){
		this.$years.removeClass('show');
		this.$months.removeClass('show');

		self.$block.fadeOut(333);
	};
	
	/* data */
	//
	this.setYear = function(){
	};

	//
	this.setMonth = function(){
	};

	//
	this.setDay = function(){
	};

	//
	this.setDate = function( _date ){

		this.cur.year  = _date.year;
		this.cur.month = _date.month;
		this.cur.day   = _date.day;

		this.$years.find('[rel='+this.cur.year+']').switchSibClass('cur');
		this.$months.find('[rel='+this.cur.month+']').switchSibClass('cur');
		
		this.refreshDays();

	};
 
	/* init */
	this.init = function(){
		/**/
		for(var i=curDate.getFullYear(); i>=this.minYear; i-- )
			this.$years.append( $('<li rel='+i+'><a href="javascript:void('+i+');">'+i+'</a></li>') );

		this.$years.find('li[rel='+this.cur.year+']').switchSibClass('cur');
		this.$months.find('li[rel='+this.cur.month+']').switchSibClass('cur');

		this.refreshDays();

		if( typeof _cfg.refreshDays == 'function' )
			_cfg.refreshDays();
	};

};


// map data
function CMap( _cfg ){

	this.all = false;
	this.districts = {};
	this.cur = null;

	this.expires = 30; // exp days


	// init structure
	this.init = function( _cfg ){
		this.districts = _cfg.data;
	};


	// set all regions in district
	this.setAllReg = function( _dis, _stt ){
		var regList = this.districts[_dis].regions;

		for(var key in regList )
			regList[key] = _stt;
	};


	// is all regions in district checked
	this.allInDis = function( _dis ){
		var regList = this.districts[_dis].regions;


		for( var key in regList )
			if( regList[key] == false )
				return false;

		return true;
	};

	// title
	this.getTitle = function(){
		var title = this.districts[this.cur].name

		if( this.all )
			title = 'Все';
		else if( !this.allInDis( this.cur ) )
			title += '(регионы)';

		return title;
	};

	// save
	this.save = function(){
		var data = '';
		var regList;
		var list;


		for( var d in this.districts ){
			regList = this.districts[d].regions;
			list = '';

			for( var r in regList )
				if( regList[r] == true )
					list += (list!=''?',':'') + r;

			if( list != '' ){
				data += (data!=''?'|':'') + d+':'+list;
			}
		};

		$.cookie( 'map', data, { expires: this.expires } );
		$.cookie( 'currentDistrict', this.cur, { expires: this.expires } );
		$.cookie( 'filter_all', this.all, { expires: this.expires } );
	};

	// load
	this.load = function(){
		this.cur = $.cookie( 'currentDistrict' );
		this.all = $.cookie( 'filter_all' ) == 'true' ? true : false;

		var data = $.cookie( 'map' );

		var districts;
		var district;
		var regions;


		if( data != undefined && data != '' ){
			districts = data.split('|');

			for(var i=0;i<districts.length;i++){
				regions = districts[i].split(':');

				district = this.districts[regions[0]];
				regions = regions[1].split(',');

				for(var j=0;j<regions.length;j++)
					district.regions[ regions[j] ] = true;

			};
		};
	};

};

// all != all regional news
function CNews(){
	this.mode;
	this.allRegion = false;
	this.expires = 30;


	// regional news
	this.getRegionalNews = function( _cfg ){
		var filter = {};
		var regList;


		filter.district = _cfg.map.cur;
		filter.regions = [];

		regList = _cfg.map.districts[_cfg.map.cur].regions;

		for( var key in regList )
			if( regList[key] == true )
				filter.regions.push(key);

			// if not checked
		if( filter.regions.length == 0 )
			for( var key in regList )
				filter.regions.push(key);
			
		$.ajax({
			 url: _cfg.map.all ? '/region_news/all/' : '/region_news/'
			, type: 'post'
			, data: filter
			, success : function(_data){
				_cfg.load( _data );
			}
		});
	};

	// all news
	this.getAllNews = function( _cfg ){
		$.ajax({
			 url: '/core/all_news/'
			, type: 'get'
			, success : function(_data){
				_cfg.load( _data );
			}
		});
	};

	// save news cfg
	this.save = function(){
		$.cookie('viewmode', this.mode, { expires: this.expires } );
	};

	// load news cfg
	this.load = function(){
		this.mode = $.cookie('viewmode');
	};

};


function slct( _node ){
	if ( typeof _node.setSelectionRange != 'undefined' ){ // good
		_node.setSelectionRange( 0, _node.value.length);
		_node.focus();
	} else if (_node.createTextRange)// IE
		 r = _node.createTextRange().select();
};



