
var NS_Framework = 
{
	Phrase: {},
	
	_globalSettings:
	{
		disableAllAnimations: false,
		language: 'en'
	},
	
	_dateSettings:
	{
		dateFormat: 'Y-m-d',
		timeFormat: 'H:i',
		firstDay: 1
	},
	
	_cookieSettings: 
	{ 
		path: '/', 
		secure: false, 
		domain: '' 
	},
	
	_tooltipSettings: 
	{
		position: 'center right',
		offset: [-2, 10],
		effect: 'fade',
		opacity: 0.7
	},
	
	_messageObject: null,
	
	fetch: function(phrase)
	{
		if (typeof this.Phrase[phrase] == 'undefined')
		{
			phrase = '*[*' + phrase + '*]*';
		}
		else
		{
			phrase = this.Phrase[phrase];
		}
		
		if (arguments.length > 1)
		{
			for (var i in arguments)
			{
				if (i > 0)
				{
					phrase = phrase.replace('{' + i + '}', arguments[i]);
				}
			}
		}
		
		return phrase;
	},
	
	bind: function(fn, scope)
	{
		var args = [];
		if (arguments.length > 2)
		{
			args = Array.prototype.slice(arguments, 2);
		}
		
		return function()
		{
			return fn.apply(scope || this, NS_Framework.mergeArray(args, arguments) || []);
		};
	},
	
	ucFirst: function(val)
	{
		return val.charAt(0).toUpperCase() + val.substr(1);
	},
	
	navRegister: function(node)
	{
		node = $(node);
		node.each(function(i, el){
			el = $(el);
			el.tooltip({
				tip: '#' + el.attr('id') + '_subnav',
				effect: NS_Framework._globalSettings.disableAllAnimations ? 'noanim' : 'slide',
				position: 'bottom center',
				offset: ($.browser.msie && $.browser.version < 8) ? [13, 0] : [20, 0],
				delay: 200,
				opacity: 1,
					
				onBeforeShow: function()
				{
					el.addClass('navigation_hover');
				},
					
				onBeforeHide: function()
				{
					el.removeClass('navigation_hover');
				}
			});
			
			el.click(function(e){
				e.preventDefault();
			});
		});
	},
	
	redirect: function(url)
	{
		window.location = url;
	},
	
	cookie: function(name, val, options)
	{
		return $.cookie(name, val, $.extend(options || {}, this._cookieSettings));
	},
	
	opacityFix: function(node)
	{
		node = $(node);
		if ($.browser.msie && $.browser.version < 7)
		{
			node[0].style.removeAttribute('filter');
		}
	},
	
	merge: function(mainObject, childObject)
	{
		var cloneMain = $.extend(true, {}, mainObject);
		for (var i in childObject)
		{
			cloneMain[i] = childObject[i];
		}
		
		return cloneMain;
	},
	
	mergeArray: function(mainArray, childArray)
	{
		var newArray = [], len = 0;
		for (var i in mainArray)
		{
			newArray[len] = mainArray[i];
			len++;
		}
		
		for (i in childArray)
		{
			newArray[len] = childArray[i];
			len++;
		}
		
		return newArray;
	},
	
	systemInit: function()
	{
		NS_Framework.navRegister('.subnav > a');
		
		$('form').each(function()
		{
			var tryOptions = ['crossCheck', 'tooltip', 'listProcess'], form = $(this);
			for (var i = 0; i < tryOptions.length; i++)
			{
				if (form.attr('data-' + tryOptions[i]))
				{
					var callback = NS_Framework.ucFirst(tryOptions[i]);
					NS_Framework['_init' + callback].call(NS_Framework, form);
				}
			}
		});
		
		$('.listActionMenu').each(function()
		{
			var actionMenuContainer = $(this);
			
			actionMenuContainer.find('h4').tooltip({
				tip: actionMenuContainer.find('.menuList'),
				effect: 'menuEffect',
				position: 'center right',
				offset: [0, 0],
				delay: 600
			});
		});
		
		$('.expandcollapse-detector').each(function(i)
		{
			var el = $(this);
			el.expandCollapser(
			{ 
				phrase: el.attr('data-expandCollapsePhrase') || 'Expand/Collapse', 
				useCookies: true 
			});
		});
		
		$('.input-date').dateinput(
		{
			lang: NS_Framework._globalSettings.language,
			format: 'Y-m-d',
			firstDay:  NS_Framework._dateSettings.firstDay
		});
		
		if ($.fn.timePicker)
		{
			$('.timepicker-input').timePicker();
		}
		
		var langChooser = $('#language-chooser');
		if (langChooser.length > 0)
		{
			langChooser.languageChooser();
		}
		
		if ($.fn.tinymce)
		{
			$('textarea.editor').tinymce(
			{
				script_url: 'js/tiny_mce/tiny_mce.js',
				theme: 'advanced',
				plugins: 'autolink,lists,pagebreak,layer,table,advhr,advimage,advlink,inlinepopups,preview,searchreplace,print,contextmenu,paste,advlist,template',
				theme_advanced_buttons1: 'bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,formatselect,|removeformat,|,print,|,pastetext,pasteword,|,search,replace,|,bullist,numlist,|,outdent,indent,blockquote,|,undo,redo,|,link,unlink,anchor,image,cleanup,code,|,preview,|,forecolor,|,template',
				theme_advanced_buttons2: '',
				theme_advanced_buttons3: '',
				content_css: 'view/panel/css/editor.css',
				theme_advanced_toolbar_location: 'top',
				theme_advanced_toolbar_align: 'left',
				theme_advanced_statusbar_location: 'bottom',
				width: '100%',
				height: '300px',
				theme_advanced_resizing: true,
				entities : '160,nbsp,38,amp,34,quot,162,cent,8364,euro,163,pound,165,yen,169,copy,174,reg,8482,trade,8240,permil,60,lt,62,gt,8804,le,8805,ge,176,deg,8722,minus',
				external_image_list_url: 'admin.php?image/get-list'

			});
		}
		
		$('.imageSelectBits').each(function()
		{
			var imageList = $(this), 
				input = imageList.find('input'),
				mask = imageList.find('.mask').css('opacity', 0.6),
				clickFn = function(imageList, input, mask)
				{
					var root = imageList.parents('ul'),
						selectedMask = root.data('selectedMask');
					if (input.is('[type=checkbox]'))
					{
						mask.css('opacity', input.is(':checked') ? 0 : 0.6);
					}
					else if (mask !== selectedMask && input.is(':checked'))
					{
						mask.css('opacity', 0);
						if (selectedMask !== null)
						{
							selectedMask.css('opacity', 0.6);
						}
						
						root.data('selectedMask', mask);
					}
				};
		
			clickFn(imageList, input, mask);
			input.click(function(){ clickFn(imageList, input, mask); });
		});
		
		$('.compareTitle').each(function()
		{
			var compareTitle = $(this),
				compareSelector = compareTitle.attr('data-container'),
				compareCheckboxes = $(compareSelector + ' input[type=checkbox]');
			
			compareSelector = compareSelector.replace('#', '');
			
			compareTitle.html('<a href="javascript:void(null)" class="toggleSelection" id="toggleSelector' + compareSelector + '">' + NS_Framework.fetch('tumunu_sec_secimi_kaldir') + '</a>' + compareTitle.html());
			$('#toggleSelector' + compareSelector).click(function(e)
			{
				e.preventDefault();
				
				compareCheckboxes.attr('checked', !compareTitle.data('checkboxChecked') ? true : false);
				compareTitle.data('checkboxChecked', !compareTitle.data('checkboxChecked'));
			});
		});
	},
	
	initCrop: function(imgCropSelector, imgPreviewSelector, imgHiddenInput)
	{
		imgCropSelector = $(imgCropSelector);
		imgPreviewSelector = $(imgPreviewSelector);
		imgHiddenInput = $(imgHiddenInput);
		
		var imgW = imgCropSelector.innerWidth(),
			imgH = imgCropSelector.innerHeight(),
			previewNode = imgPreviewSelector.parent(),
			prevImgW = previewNode.innerWidth(),
			prevImgH = previewNode.innerHeight();
		
		var showPreview = function(coords)
		{
			if (parseInt(coords.w) > 0)
			{
				var rx = prevImgW / coords.w,
					ry = prevImgH / coords.h,
					absoluteWidth = Math.round(rx * imgW),
					absoluteHeight = Math.round(ry * imgH),
					cropLeft = Math.round(rx * coords.x),
					cropTop = Math.round(ry * coords.y);
					
				imgPreviewSelector.css(
				{
					width: absoluteWidth + 'px',
					height: absoluteHeight + 'px',
					marginLeft: '-' + cropLeft + 'px',
					marginTop: '-' + cropTop + 'px'
				});
				
				imgHiddenInput.val([coords.x, coords.y, coords.w, coords.h].join(','));
			}
		};
		
		imgCropSelector.Jcrop(
		{
			onChange: showPreview,
			onSelect: showPreview
			,
			aspectRatio: prevImgW / prevImgH
		});
	},
	
	_initCrossCheck: function(form)
	{
		var validatorConfig = form.attr('data-crossCheckValidtorConfig') || false,
			useIpConfig = form.attr('data-crossCheckUseIpConfig') || false;
		
		if (validatorConfig)
		{
			validatorConfig = $.parseJSON(validatorConfig);
		}
		
		validatorConfig = NS_Framework.merge(validatorConfig, {lang: NS_Framework._globalSettings.language});
		form.crossCheck(validatorConfig, useIpConfig);
	},
	
	_initTooltip: function(form)
	{
		var selector = form.attr('data-tooltipSelector') || ':input:not(button, [type=radio])',
			options = this._tooltipSettings,
			additionalOptions = form.attr('data-tooltipOptions') || false;
		
		if (additionalOptions && (additionalOptions = $.parseJSON(additionalOptions)))
		{
			options = $.extend(options, additionalOptions);
		}
		
		form.find(selector).tooltip(options);
	},
	
	_initListProcess: function(form)
	{
		form.find('select[name=do]').change(function()
		{
			form.submit();
		});
	},
	
	showMessage: function(message)
	{
		if (this._messageObject === null)
		{
			this._messageObject = new NS_Message();
		}
		
		this._messageObject.show.apply(this._messageObject, arguments);
	},
	
	hideMessage: function()
	{
		if (this._messageObject)
		{
			this._messageObject.hide();
		}
	},
	
	_tooltipShowNoAnimationEffect: function(onEndEventCallback)
	{
		this.getTip().show();
		onEndEventCallback.call();
	},
	
	_tooltipHideNoAnimationEffect: function(onEndEventCallback)
	{
		this.getTip().hide();
		onEndEventCallback.call();
	},
	
	_menuShowEffect: function(onEndEventCallback)
	{
		var tipObj = this.getTip();
		if (NS_Framework._globalSettings.disableAllAnimations)
		{
			tipObj.css({width: '180px'}).show().css({left: tipObj.offset().left + 12});
			onEndEventCallback.call();
		}
		else
		{
			tipObj.css({width: '0px', overflow: 'hidden'})
			.animate({width: 180, left: '+=12'}, 500, 'easeInOutQuart', onEndEventCallback)
			.show();
		}
	},
	
	_menuHideEffect: function(onEndEventCallback)
	{
		this.getTip().hide();
		onEndEventCallback.call();
	}
		
};

function NS_Message()
{
	NS_Message.prototype.__construct.apply(this, arguments);
}

NS_Message.prototype =
{
	_messageNode: null,
	
	_timerControl: null,
	
	_visibleState: false,
	
	_isAnimated: false,
	
	_hideDelay: 2000,
	
	_duration: 500,
	
	_toHeight: null,
		
	__construct: function()
	{
		if (arguments.length > 0)
		{
			this.show.apply(this, arguments);
		}
	},
	
	show: function(phrase)
	{
		this._showMessage(NS_Framework.fetch.apply(NS_Framework, arguments));
	},
	
	_showMessage: function(message)
	{
		if (!this._isAnimated && !this._visibleState)
		{
			this._clearTimer();
			
			this._getMessageNode().html(message);
			this._messageNode.css('display', '');
			
			if ($.browser.msie)
			{
				this._locateNode();
				this._bindResizeEvent();
			}
			
			this._visibleState = true;
			if (!NS_Framework._globalSettings.disableAllAnimations)
			{
				if (this._toHeight == null)
				{
					this._toHeight = this._messageNode.attr('offsetHeight');
				}
				
				this._messageNode.css('height', '0px');
				
				this._isAnimated = true;
				this._messageNode.animate(
					{height: this._toHeight},
					this._duration,
					'easeOutCubic', 
					NS_Framework.bind(this._showAnimateComplete, this)
				);
			}
		}
	},
	
	_showAnimateComplete: function()
	{
		this._isAnimated = false;
		this._initHideTimer();
	},
	
	_initHideTimer: function()
	{
		this._clearTimer();
		this._timerControl = setTimeout(NS_Framework.bind(this.hide, this), this._hideDelay);
	},
	
	_locateNode: function()
	{
		this._messageNode.offset({top: 0, left: 0});
	},
	
	_locateNodeWithTimer: function()
	{
		var _self = this;
		setTimeout(function()
		{
			_self._locateNode();
		}, 0);
	},
	
	_bindResizeEvent: function()
	{
		$(window).bind('resize', NS_Framework.bind(this._locateNodeWithTimer, this));
	},
	
	_unbindResizeEvent: function()
	{
		$(window).unbind('resize', NS_Framework.bind(this._locateNodeWithTimer, this));
	},
	
	hide: function()
	{
		if (!this._isAnimated && this._visibleState)
		{
			this._clearTimer();
			
			if ($.browser.msie)
			{
				this._unbindResizeEvent();
			}
			
			this._visibleState = false;
			if (!NS_Framework._globalSettings.disableAllAnimations)
			{
				this._isAnimated = true;
				this._messageNode.animate(
					{height: 0},
					this._duration,
					'easeOutCubic', 
					NS_Framework.bind(this._hideAnimateComplete, this)
				);
			}
			else
			{
				this._messageNode.css('display', 'none');
			}
		}
	},
	
	_hideAnimateComplete: function()
	{
		this._isAnimated = false;
		this._messageNode.css('display', 'none');
	},
	
	_clearTimer: function()
	{
		clearTimeout(this._timerControl);
	},
	
	_getMessageNode: function()
	{
		if (this._messageNode === null)
		{
			this._messageNode = $('<div class="messagenode"></div>').css('opacity', NS_Framework._tooltipSettings.opacity);
			this._messageNode.appendTo(document.body);
		}
		
		return this._messageNode;
	}
};

$.tools.tooltip.addEffect('noanim', NS_Framework._tooltipShowNoAnimationEffect, NS_Framework._tooltipHideNoAnimationEffect);
$.tools.tooltip.addEffect('menuEffect', NS_Framework._menuShowEffect, NS_Framework._menuHideEffect);


$(document).ready(NS_Framework.systemInit);
$(window).load(function()
{
	if ($.fn.Jcrop)
	{
		$('.imageRow').each(function(e)
		{
			var el = $(this);
			NS_Framework.initCrop(
				el.find('.cropImage img:first'), 
				el.find('.thumbnailPreview img:first'),
				el.find('input[type=hidden]:first')
			);
		});
	}
});

if (typeof console == 'undefined')
{
	var console = {log: function(){}};
}
