/**
 * @author Orhan POLAT
 * @abstract Written with jquery, jquery-ui
 */

$.path = '/';
$.lang = {
	'yes': 'Evet',
	'no': 'Hayır',
	'ok': 'Tamam',
	'message': 'Mesaj',
	'close': 'Kapat',
	'first': 'İlk',
	'previous': 'Önceki',
	'next': 'Sonraki',
	'last': 'Son',
	'total': 'Toplam',
	'save': 'Kaydet',
	'delete': 'Sil',
	'delete-all': 'Seçilileri Sil',
	'cancel': 'İptal',
	'filters': 'Filtreler',
	'filter': 'Filtrele',
	'loading': 'Yükleniyor...',
	'ajax-error': 'AJAX sonuç hatası oluştu!',
	'new-rec': 'Yeni Kayıt',
	'no-recs': 'Kayıt bulunamadı!',
	'no-result': 'Sonuç dönmedi!',
	'check-at-least-one': 'En az bir tane seçin!',
	'sure-to-delete': 'Kaydı silmek istediğinize emin misiniz?',
	'sure-to-delete-all': 'Seçili kayıtları silmek istediğinize emin misiniz?',
	'no-filter': 'Filtre yok',
	'after': '%s sonuna',
	'all_files': 'Tüm Dosyalar',
	'pending': 'Bekliyor...',
	'uploading': 'Yükleniyor...',
	'processed': 'dosya işlendi',
	'too_many_files': 'Çok fazla dosya seçtiniz!',
	'big_file': 'Dosya çok büyük',
	'zerobyte_file': 'Dosya içeriği boş',
	'invalid_filetype': 'Geçersiz dosya türü',
	'unhandled_error': 'Bilinmeyen hata',
	'upload_error': 'Yükleme Hatası',
	'upload_failed': 'Yükleme Başarısız',
	'server_error': 'Server (IO) Error',
	'security_error': 'Security Error',
	'limit_exceeded': 'Upload limit exceeded',
	'validation_failed': 'Failed Validation, Upload skipped',
	'cancelled': 'İptal edildi',
	'stopped': 'Durduruldu',
	'upload': 'Yükle',
	'pick': 'Seç',
	'pick-and-upload': 'Seç ve Yükle',
	'pick-to-upload': 'Yüklemek için dosyaları seçin',
	'already-used': '"%s" anahtarı zaten kullanılmış!',
	'checked-objects-authorizing': '<b>%s</b> nesne yetkilendiriliyor...'
};

/**
 * Language text
 */
function lang(key) {
	var str = key;
	
	if ($.lang[key]){
		str = $.lang[key];
		
		if (arguments.length > 1){
			for (var i=1; i < arguments.length; i++){
				str = str.replace('%s', arguments[i]);
			}
		}
	}
	
	return str;
}

/**
 * Message dialog
 */
function message() {
 var config = arguments[0] || {};
 var types = [
		'info',
		'error',
		'ok',
		'warning',
		'forbidden',
		'delete',
		'caution',
		'confirm',
		'find'
	];
	var type = (config.type || 'info');

	if ($.inArray(type, types) < 0){
		type = 'info';
	}
	
	var labels = config.labels || {};
	
	var buttons = [];
	
	if (type == 'confirm'){
		buttons.push({
			text: (labels.yes || lang('yes')),
			click: function(){
				$(this).dialog('close');
				if ($.isFunction(config.onConfirm)){
					config.onConfirm();
				}
			}
		});
		buttons.push({
			text: (labels.no || lang('no')),
			click: function(){
				$(this).dialog('close');
				if ($.isFunction(config.onReject)){
					config.onReject();
				}
			}
		});
	}else{
		buttons.push({
			text: (labels.ok || lang('ok')),
			click: function(){
				$(this).dialog('close');
			}
		});
	}
	
	var html = $('<table\/>').attr('width', '100%').append(
		$('<tbody/>').append(
			$('<tr/>').append(
				$('<td/>').addClass('ui-message').append(
					$('<span/>').addClass('ui-message-icon ui-message-'+ type)
				).append(
					$('<span/>').text(config.text || '')
				)
			)
		)
	).dialog({
		modal: true,
		resizable: false,
		title: (config.title || lang('message')),
		closeText: (config.closeText || lang('close')),
		width: 350,
		position: 'center',
		buttons: buttons,
		close: function(){
			if ($.isFunction(config.onAfterClose)){
				config.onAfterClose();
			}
		}
	});
}

/**
 * 
 * Only events
 * @param e
 * @param type
 * @param specialCodes
 * @returns {Boolean}
 */
function only(e, type, specialCodes) {
	e = e || window.event;
	var codes = [], i = 0; k = e.keyCode ? e.keyCode : e.charCode;
	
	switch (type){
		case 'numbers':
			
			codes = [8,9,46,48,49,50,51,52,53,54,55,56,57];
			
			break;
		case 'characters':
			
			codes.push(8,9,199,214,220,231,246,252,286,287,304,305,350,351);
			
			for (i=65; i < 91; i++){
				codes.push(i);
			}
			
			for (i=97; i < 123; i++){
				codes.push(i);
			}
			
			break;
		case 'datechars':
			
			codes = [8,9,45,46,47,48,49,50,51,52,53,54,55,56,57];
			
			break;
	}
	
	if (typeof(specialCodes) !== 'undefined'){
		for (i in specialCodes){
			if ($.inArray(specialCodes[i], codes) < 0){
				codes.push(specialCodes[i]);
			}
		}
	}
	
	return $.inArray(k, codes) > -1;
}

/**
 * Reset form
 */
(function($){
	$.fn.reset = function() {
		$(this).get(0).reset();
		
		return $(this).find(':input').not(':button').each(function(){
			if ($(this).get(0).type == 'hidden'){
				$(this).val(!isNaN($(this).val) ? '' : 0);
			}
		});
	};
})(jQuery);

/**
 * Set value into form element
 */
(function($){
	$.fn.set = function(val) {		
		return $(this).each(function(){
			if ($(this).is('input')){
				switch ($(this).attr('type')){
					case 'radio':
					case 'checkbox':
						$(this).val([val]);
						break;
					default:
						$(this).val(val);
				}
			}else if ($(this).is('select')){
				if ($(this).attr('multiple') == 'multiple'){
					$(this).val([val]);
				}else{
					$(this).val(val);
				}
			}else if ($(this).is('textarea')){
				$(this).val(val);
			}
		});
	};
})(jQuery);

/**
 * Clear string
 */
(function($){
	$.clearString = function(str) {
  str = $.trim(str);
  
  var chrs = ['ç','ğ','ı','ö','ş','ü','Ç','Ğ','İ','Ö','Ş','Ü',' '];
  var chns = ['c','g','i','o','s','u','C','G','I','O','S','U','-'];
  
  var i = y = 0, splitted;
  
  for (i=0; i < str.length; i++){
   for (y=0; y < chrs.length; y++){
    if (str[i] == chrs[y]){
     splitted = str.split(chrs[y]);
     str = splitted.join(chns[y]);
    }
   }
  }
  
  return str.toLowerCase().replace(/[^a-zA-Z0-9_-]/g, '');
 };
})(jQuery);

/**
 * Check
 */
(function($){
 $.checkStr = {
  email: function (str){
   return /^([a-zA-Z0-9_.-])+@([a-zA-Z0-9_.-])+\.([a-zA-Z])+([a-zA-Z])+/.test(str);
  },
  date: function (str){
   var delimChar = '-';
   
   str = str.value ? str.value : str;
   str = str.replace(/\./g, delimChar);
   str = str.replace(/\//g, delimChar);
  
   var mo, day, yr;
   var entry = str;
   var re = /\b\d{1,2}[\/-]\d{1,2}[\/-]\d{4}\b/;
  
   if (re.test(entry)) {
    var splitted = entry.split(delimChar);
  
    if (splitted.length == 3){
     day = splitted[0];
     mo  = splitted[1];
     yr  = splitted[2];
  
     var testDate = new Date(yr, mo-1, day);
  
     if ((testDate.getDate() == day) && ((testDate.getMonth() + 1) == mo) && (testDate.getFullYear() == yr)) {
      return true;
     }
    }else{
     return false;
    }
   }
  
   return false;
  }
 };
})(jQuery);

/**
 * To Upper / Lower
 */
(function($){
	var methods = {
		'upper': function(excepts) {
			return $(this).find('input[type="text"], textarea').each(function(){
				if ((typeof excepts != 'object') || ($.inArray($(this).attr('id'), excepts) < 0)){
					$(this).val($.trim($(this).val()).replace(/i/g, 'İ').toUpperCase());					
				}
			});
		},
		'lower': function(excepts) {
			return $(this).find('input[type="text"], textarea').each(function(){
				if ((typeof excepts != 'object') || ($.inArray($(this).attr('id'), excepts) < 0)){
					$(this).val($.trim($(this).val()).replace(/İ/g, 'i').toLowerCase());					
				}
			});
		}
	};
	
	$.fn.to = function(method) {
		if (methods[method]){
			return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
		}else{
			$.error('(To) Metot: \"'+ method +'\" bulunamadı!');
		}
	};
})(jQuery);

/**
 * Select options
 */
(function($){
	$.fn.options = function(options, empty) {
		var $obj = $(this);
		
		if (empty){
			$obj.empty();
		}
		
		$.each(options, function(val, text){
			$obj.append($('<option/>').val(val).text(text));
		});
		
		return $obj;
	};
})(jQuery);

/**
 * Paging
 */
(function($){
	var settings = {
		'x': 0,
		'y': 20,
		'total': 0,
		'perPages': {
			10: 10,
			20: 20,
			30: 30,
			50: 50
		},
		'labels': {
			'first': lang('first'),
			'prev': lang('previous'),
			'next': lang('next'),
			'last': lang('last'),
			'total': lang('total')
		},
		'pos': 'bottom',
		'func': function(){}
	};
	
	var methods = {
		'init': function(options) {
			//Settings
			$.extend(true, settings, options || {});
			
			$(this).append(methods._create(settings.pos));
		},
	 _calculate: function() {
	 	settings.first = 0;
	 	settings.prev = settings.x - settings.y;
	 	settings.next = settings.x + settings.y;
	 	settings.last = settings.total - ((settings.total%settings.y == 0) ? settings.y : (settings.total%settings.y));
	 },
	 _labelFirst: function() {
	  var html;
	  
	  if ((settings.total > 0) && (settings.first < settings.x)){
	  	html = $('<a/>').attr({
	  		href: 'javascript:void(0)'
	  	}).text('|<'+ settings.labels.first).click(function(e){
	  		settings.func({
	  			x: 0,
	  			y: settings.y
	  		})
	  	});
	  }else{
	   html = $('<span/>').css('color', '#cccccc').text('|<'+ settings.labels.first);
	  }
	  
	  return html;
	 },
	 _labelPrev: function() {
	  var html;
	  
	  if (settings.x > 0){
	  	html = $('<a/>').attr({
	  		href: 'javascript:void(0)'
	  	}).text('<<'+ settings.labels.prev).click(function(e){
	  		settings.func({
	  			x: settings.prev,
	  			y: settings.y
	  		})
	  	});
	  }else{
	  	html = $('<span/>').css('color', '#cccccc').text('<<'+ settings.labels.prev);
	  }
	  
	  return html;
	 },
	 _labelNext: function() {
	  var html;
	  
	  if (settings.x < (settings.total - settings.y)){
	  	html = $('<a/>').attr({
	  		href: 'javascript:void(0)'
	  	}).text(settings.labels.next +'>>').click(function(e){
	  		settings.func({
	  			x: settings.next,
	  			y: settings.y
	  		})
	  	});
	  }else{
	  	html = $('<span/>').css('color', '#cccccc').text(settings.labels.next +'>>');
	  }
	  
	  return html;
	 },
	 _labelLast: function() {
	  var html;
	  
	  if ((settings.total > 0) && ((settings.x + settings.y) < settings.total)){
	  	html = $('<a/>').attr({
	  		href: 'javascript:void(0)'
	  	}).text(settings.labels.last +'>|').click(function(e){
	  		settings.func({
	  			x: settings.last,
	  			y: settings.y
	  		})
	  	});
	  }else{
	  	html = $('<span/>').css('color', '#cccccc').text(settings.labels.last +'>|');
	  }
	  
	  return html;
	 },
	 _create: function(pos) {
	 	//Calculate vars
	 	this._calculate();
	 	
	 	//Middle el
	 	var mid;
	 	
	  if (pos == 'top'){
	  	mid = $('<span/>').text(settings.labels.total +': '+ settings.total +' | '+ (settings.x + 1) +' - '+ (settings.x + settings.y));
	  }else{
	   var opts = {};
	   
	   for (var i=0; i < Math.ceil(settings.total / settings.y); i++){
	    opts[(i*settings.y)] = (i+1);
	   }
	   
	   mid = $('<select/>').attr({
	   	'id': 'pager',
	   	'name': 'pager'
	   }).options(opts).val(settings.x).change(function(e){
 				settings.func({
 					x: $(this).val(),
 					y: settings.y
 				});
 			});
	  }
	 	
	 	var html = $('<div/>').append(
	 		$('<div/>').addClass('left').css({
	 			'width': '33%',
	 			'overflow': 'hidden'
	 		}).append(
	 			$('<select/>').attr({
	 				'id': 'paging-'+ settings.pos,
	 				'name': 'paging-'+ settings.pos
	 			}).options(settings.perPages).val(settings.y).change(function(e){
	 				settings.y = $(this).val();
	 				settings.func({
	 					x: 0,
	 					y: settings.y
	 				});
	 			})
	 		),
	 		$('<div/>').addClass('left').css({
	 			'width': '34%',
	 			'textAlign': 'center',
	 			'overflow': 'hidden'
	 		}).append(mid),
	 		$('<div/>').addClass('left').css({
	 			'width': '33%',
	 			'textAlign': 'right',
	 			'overflow': 'hidden'
	 		}).append(
	 			this._labelFirst(),
	 			this._labelPrev(),
	 			this._labelNext(),
	 			this._labelLast()
	 		)
	 	).append(
 			$('<br/>').addClass('clear')
 		);
	 	
	 	return html;
	 }
	};
	
	$.fn.paging = function(method) {
		if (methods[method]){
			return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
		}else if ((typeof method === 'object') || !method){
			return methods.init.apply(this, arguments);
		}else{
			$.error('(Paging) Metot: \"'+ method +'\" bulunamadı!');
		}
	};
})(jQuery);

(function($){
	var settings = {
		'url': location.href,
		'form': 'form',
		'params': {},
		'paging': [true, true],
		'content': {
			'filtering': true,
			'editing': true,
			'deleting': true,
			'multiDeleting': true
		},
		'action': {
			'list': 'list',
			'save': 'save',
			'values': 'values',
			'delete': 'delete'
		},
		'onBeforeList': function() { return true; },
		'onAfterList': function() {},
		'onBeforeSave': function() { return true; },
		'onAfterSave': function() {},
		'onBeforeCancel': function() { return true; },
		'onAfterCancel': function() {},
		'onBeforeDelete': function() { return true; },
		'onAfterDelete': function() {},
		'onBeforeForm': function() { return true; },
		'onAfterForm': function() {},
		'onBeforeLoad': function() { return true; },
		'onAfterLoad': function() {},
		'reset': function() {}
	};
	
	var methods = {
		'init': function(options) {
			//Settings
			$.extend(true, settings, options || {});

			$(this).append(methods._create());
			
			methods.list(settings.params);
		},
		'filter': {
			'data': {},
			'_compile': function() {
				if ($('#filters').get()){
					$('#filters').empty();
	
					var k, i = 0, params = {};
	
					for (k in methods.filter.data){
						if (methods.filter.data[k].val){
							i++;
						}
					}
	
					if (i > 0){
						var ul = $('<ul/>').appendTo($('#filters'));
						
						for (k in methods.filter.data){
							if (methods.filter.data[k].val){
								ul.append(
									$('<li/>').append(
										$('<a/>').attr({
											'id': 'data_'+ k,
											'href': 'javascript:void(0)'
										}).click(function(e){
											e = e || window.event;
											var node = e.target ? e.target : e.srcElement;
		
											while (node){
												if (node.tagName && (node.tagName.toLowerCase() == 'a')){
													break;
												}
												
												node = node.parentNode;
											}
		
											methods.filter.remove($(node).attr('id').replace('data_', ''));
										}).text(methods.filter.data[k].txt)
									)
								);
							}
	
							params[k.replace('filter_', '')] = methods.filter.data[k].val;
						}
					}else{
						$('<span/>').appendTo($('#filters')).addClass('shadow').text('<'+ lang('no-filter') +'>');
					}
	
					methods.list(params);
				}
			},
			'remove': function(id) {
				var arr = {}, k;
				
				for (k in methods.filter.data){
					if (k != id){
						arr[k] = methods.filter.data[k];
					}
				}
	
				methods.filter.data = arr;			
				methods.filter._compile();
			},
			'show': function() {
				$('#dialogFilter').dialog({
					width: 600,
					title: lang('filters'),
					position: 'center',
					open: function() {					
						$('#dialogFilterForm').reset();
						
						for (var k in methods.filter.data){
							if ($('#'+ k).get(0)){
								$('#'+ k).set(methods.filter.data[k].val);
							}else if ($('input[name='+ k +']').get(0)){
								$('input[name='+ k +']').set(methods.filter.data[k].val);
							}
						}
					},
					buttons: [
						{
							text: lang('filter'),
							click: function() {
								methods.filter.data = {};
								
								$(this).find('input, select, textarea').each(function(){
									if ((($(this).val().length > 0) && ($(this).val() !== '__all__'))){
										var txt = '';
										
										if ($(this).is('input')){
											switch ($(this).attr('type')){
												case 'radio':
												case 'checkbox':
												
													if ($(this).is(':checked')){
														txt = $(this).parent().find('label').text();
													}
													
													break;
												default:
													txt = $(this).val();
											}
										}else if ($(this).is('select')){
											if ($(this).attr('multiple') == 'multiple'){
												var txts = [];
		
												$(this).find(':selected').each(function(){
													txts.push($(this).text());
												});
												
												txt = txts.join(', ');
											}else{
												txt = $(this).find(':selected').text();
											}
										}else if ($(this).is('textarea')){
											txt = $(this).val();
										}
										
										if (txt.length > 0){
											methods.filter.data[$(this).attr('id')] = {
												val: $(this).val(),
												txt: txt
											};
										}
									}
								});
								
								methods.filter._compile();
								
								$(this).dialog('close');
							}
						},
						{
							text: lang('cancel'),
							click: function() {
								$(this).dialog('close');
							}
						}
					]
				});		
			}
		},
		'list': function(params) {
			//Before list
			if (!settings.onBeforeList()){
				return false;
			}
			
			methods.__container.animate({
				marginLeft: 0
			});
			
			if (typeof(params) === 'object'){
				var t = 0;
				
				for (var k in params){
					t++;
				}
				
				settings.params = {};
				
				if (t > 0){
					$.extend(settings.params, params);
				}
			}
			
			$.ajax({
				url: (settings.url + (/\?/.test(settings.url) ? '&' : '?') +'act='+ settings.action.list),
				data: $.param(settings.params),
				success: function(data) {
					//Clear container
					$('#list').empty();
					
					if (data){
						var x = data.x || 0;
						var y = data.y || 20;
						var total = data.total || 0;
						
						if ((total > 0) && data.rows){
							//Paging
							if (settings.paging[0]){
								$('<div/>').addClass('pagination').appendTo($('#list')).paging({
									x: x,
									y: y,
									total: total,
									func: function(n) {
										settings.params.x = n.x;
										settings.params.y = n.y;
									
										methods.list();
									},
									pos: 'top'
								});
							}
							
							var i = 0, d, s, k, c, li, txt = '';
							var grid = $('<ul/>').addClass('grid').appendTo($('#list'));
							
							//Cols
							if (data.cols){
								var cols = $('<li/>').addClass('cols').appendTo(grid);
								
								if (settings.content.deleting && settings.content.multiDeleting){
									$('<span/>').css({
										width: 30,
										textAlign: 'center'
									}).append(
										$('<input/>').attr({
											'type': 'checkbox',
											'id': 'chk-all',
											'name': 'chk-all',
											'value': 'all'
										}).click(function(e){
											e = e || window.event;
					
											var $this = e.target ? e.target : e.srcElement;
											
											$('.rows input[type=checkbox]', $('#list')).each(function(){
												$(this)[0].checked = $this.checked;
											});
										})
									).appendTo(cols);
								}else{
									$('<span/>').css({
										width: 30,
										textAlign: 'center'
									}).text(' ').appendTo(cols);
								}
								
								i = 0;
								
								for (k in data.cols){
									s = $('<span/>').css({
										width: (data.cols[k].width || 'auto'),
										textAlign: (data.cols[k].align || 'left')
									}).appendTo(cols);
									
									if (data.cols[k].orderby){
										d = $('<div/>').html(data.cols[k].title).appendTo(
											$('<a/>').attr({
												'orderby': data.cols[k].orderby,
												'order': (data.cols[k].order || 'DESC')
											}).click(function(e){
												e = e || window.event;
												var node = e.target ? e.target : e.srcElement;
												
												while (node){
													if (node.tagName && (node.tagName.toLowerCase() == 'a')){
														break;
													}
													
													node = node.parentNode;
												}
												
												settings.params.order = ($(node).attr('order') == 'DESC' ? 'ASC' : 'DESC');
												settings.params.orderby = $(node).attr('orderby');
											
												methods.list();
											}).attr('href', 'javascript:void(0)').appendTo(s)
										);
										
										if (data.cols[k].order){
											d.addClass(data.cols[k].order.toLowerCase());
										}
									}else{
										s.html(data.cols[k].title);
									}
			
									i++;
								}
			
								$('<br/>').addClass('clear').appendTo(cols);
							}
		
							var body = $('<li/>').addClass('rows').appendTo(grid);
							var rows = $('<ul/>').appendTo(body);
		
							for (k in data.rows){
								li = $('<a/>').attr({
									id: 'rec-'+ data.rows[k].id,
									href: 'javascript:void(0)'
								}).click(function(e){
									e = e || window.event;
									var node = e.target ? e.target : e.srcElement;
									var togo = true;
									
									if (settings.content.editing){
										while (node){
											if (node.tagName && (node.tagName.toLowerCase() == 'input') && $(node).is(':checkbox')){
												togo = false;
											}
											
										 if (node.tagName && node.id && (node.tagName.toLowerCase() == 'a')){
										 	break;
										 }
										 
										 node = node.parentNode;
										}
									}
									
									if (togo){
										methods.edit(parseFloat($(this).attr('id').substr(4)));
									}
								}).appendTo($('<li/>').addClass('row').appendTo(rows));
								
								if (settings.content.deleting && settings.content.multiDeleting){
									$('<span/>').css({
										width: 30,
										textAlign: 'center'
									}).append(
										$('<input/>').attr({
											'type': 'checkbox',
											'id': 'chk'+ k,
											'name': 'chk'+ k,
											'value': data.rows[k].id
										}).click(function(){
											if ($(this).is(':checked')){
												if ($('.rows input[type=checkbox]', $('#list')).length == $('.rows input[type=checkbox]:checked', $('#list')).length){
													$('#chk-all')[0].checked = true;
												}
											}else{
												$('#chk-all')[0].checked = false;
											}
										})
									).appendTo(li);
								}else{
									$('<span/>').css({
										width: 30,
										textAlign: 'center'
									}).html('<b>'+ (parseFloat(k.replace('r', '')) + data.x) +'</b>').appendTo(li);
								}
		
								i = 0;
								
								for (c in data.rows[k]){
									txt = data.rows[k][c];
									
									$('<span/>').attr('id', 'row-'+ data.rows[k].id +'-'+ c).css({
										width: ((data.cols && data.cols[c] && data.cols[c].width) ? data.cols[c].width : 'auto'),
										textAlign: ((data.cols && data.cols[c] && data.cols[c].align) ? data.cols[c].align : 'left')
									}).html(txt).appendTo(li);
									
									i++;
								}
								
								$('<br/>').addClass('clear').appendTo(li);
							}
		
							//Paging
							if (settings.paging[1]){
								$('<div/>').addClass('pagination').appendTo($('#list')).paging({
									x: x,
									y: y,
									total: total,
									func: function(n) {
										settings.params.x = n.x;
										settings.params.y = n.y;
									
										methods.list();
									},
									pos: 'bottom'
								});
							}
							
							if (settings.content.deleting && settings.content.multiDeleting){
								$('#deleteAllBtn').css('display', 'inline').removeAttr('disabled');
							}
						}else if (data.result){
							message({
								type: data.result.status.toLowerCase(),
								text: data.result.message
							});
						}else{
							$('<div/>').addClass('warning').appendTo($('#list')).text(lang('no-recs'));
						}
					
						//After list
						settings.onAfterList();
					}else{
						message({
							type: 'error',
							text: lang('ajax-error')
						});
					}
				}
			});
		},
		'save': function() {
			if (settings.content.editing){
				//Before save
				if (!settings.onBeforeSave()){
					return false;
				}
				
				$.ajax({
					url: (settings.url + (/\?/.test(settings.url) ? '&' : '?') +'act='+ settings.action.save),
					data: $('#'+ settings.form).serialize(),
					success: function(data) {
						if (data && data.result){
							message({
								type: data.result.status.toLowerCase(),
								text: data.result.message,
								onAfterClose: function() {
									if (data.result.status == 'OK'){
										//After save
										settings.onAfterSave();
										methods.list();
									}
								}
							});
						}
					}
				});
				
				return true;
			}
		},
		'edit': function(id) {
			if (settings.content.editing){
				//Before form
				if (!settings.onBeforeForm()){
					return false;
				}
				
				settings.reset();
				
				if (id !== undefined){
					//Before load
					if (!settings.onBeforeLoad()){
						return false;
					}
					
					$.ajax({
						url: (settings.url + (/\?/.test(settings.url) ? '&' : '?') +'act='+ settings.action.values),
						data: 'id='+ id,
						success: function(data) {
							if (data){
								for (var k in data){
									if ($('#'+ k).get(0)){
										$('#'+ k).set(data[k]);
									}else if ($('input[name='+ k +']').get(0)){
										$('input[name='+ k +']').set(data[k]);
									}
								}
								
								if (settings.content.deleting){
									$('#deleteBtn').css('display', 'inline').removeAttr('disabled');
								}
								
								methods.__container.animate({
									marginLeft: '-='+ (methods.__container.width() / 2)
								}, {
									complete: function() {
										//After form
										settings.onAfterForm();
									}				
								});
								
								//After load
								settings.onAfterLoad();
							}else{
								message({
									type: 'error',
									text: lang('no-recs')
								});
							}
						}
					});
				}else{
					//Hide delete button
					$('#deleteBtn').css('display', 'none').attr('disabled', 'disabled');
					
					methods.__container.animate({
						marginLeft: '-='+ (methods.__container.width() / 2)
					}, {
						complete: function() {
							//After form
							settings.onAfterForm();
						}
					});
				}
				
				return true;
			}
		},
		'delete': function(ids) {
			if (settings.content.deleting){
				//Before delete
				if (!settings.onBeforeDelete()){
					return false;
				}
				
				message({
					type: 'confirm',
					text: ((ids && (ids.length > 0)) ? lang('sure-to-delete-all') : lang('sure-to-delete')),
					onConfirm: function() {
						$.ajax({
							url: (settings.url + (/\?/.test(settings.url) ? '&' : '?') +'act='+ settings.action['delete']),
							data: 'id='+ ((ids && (ids.length > 0)) ? ids.join(',') : $('#id').val()),
							success: function(data) {
								if (data && data.result){
									message({
										type: data.result.status.toLowerCase(),
										text: data.result.message,
										onAfterClose: function() {
											if (data.result.status == 'OK'){
												methods.list();
												
												//After delete
												settings.onAfterDelete();
											}
										}
									});
								}else{
									message({
										type: 'error',
										text: lang('no-result')
									});
								}
							}
						});
					}
				});
			}
		},
		'deleteSelected': function() {
			if (settings.content.deleting){
				var ids = [];
		
				$('.rows input[type=checkbox]:checked', $('#list')).each(function(){
					ids.push($(this).val());
				});
		
				if (ids.length > 0){
					this['delete'](ids);
				}else{
					message({
						type: 'warning',
						text: lang('check-at-least-one')
					});
				}
			}
		},
		'cancel': function() {
			//Before cancel
			if (!settings.onBeforeCancel()){
				return false;
			}
			
			methods.__container.animate({
				marginLeft: 0
			});
			
			//After cancel
			settings.onAfterCancel();
			
			return true;
		},
		_create: function() {
			this.__container = $('<ul/>').attr('id', 'data-content');
			
			var li1 = $('<li/>').attr('id', 'list-content').appendTo(this.__container);
			
			var tBar = $('<div/>').addClass('bar').appendTo(li1);
			
			//Content editing
			if (settings.content.editing){
				tBar.append(
					$('<div/>').addClass('links').append(
						$('<a/>').addClass('new').attr('href', 'javascript:void(0)').text(lang('new-rec')).click(function() {
							methods.edit();
						}),
						$('<br/>').addClass('clear')
					)
				);
			}
			
			$('<div/>').attr('id', 'list').append(
				$('<div/>').addClass('loading').text(lang('loading'))
			).appendTo(li1);
			
			//Content filtering
			if (settings.content.filtering){
				tBar.prepend(
					$('<div/>').addClass('filters').append(
						$('<a/>').addClass('filter').attr('href', 'javascript:void(0)').click(function(){
							methods.filter.show();
						}),
						$('<div/>').attr('id', 'filters').append(
							$('<span/>').addClass('shadow').text('<'+ lang('no-filter') +'>')
						),
						$('<br/>').addClass('clear')
					)
				);
			}
			
			tBar.append(
				$('<br/>').addClass('clear')
			);
			
			//Content deleting
			if (settings.content.deleting){
				$('<div/>').addClass('button-bar').append(
					$('<button/>').attr({
						'type': 'button',
						'id': 'deleteAllBtn',
						'name': 'deleteAllBtn',
						'disabled': 'disabled'
					}).hide().click(function() {
							methods.deleteSelected();
					}).append(
						$('<span/>').addClass('delete').text(lang('delete-all'))
					)
				).appendTo(li1);
			}
			
			$('<li/>').attr('id', 'form-content').appendTo(methods.__container).append(
				$('#'+ settings.form),
				$('<div/>').addClass('button-bar').append(
					$('<button/>').attr({
						'type': 'button',
						'id': 'saveBtn',
						'name': 'saveBtn'
					}).addClass('submit').click(function() {
						methods.save();
					}).append(
						$('<span/>').addClass('save').text(lang('save'))
					),
					$('<span/>').text(' '),
					$('<button/>').attr({
						'type': 'button',
						'id': 'deleteBtn',
						'name': 'deleteBtn',
						'disabled': 'disabled'
					}).hide().click(function() {
						methods['delete']();
					}).append(
						$('<span/>').addClass('delete').text(lang('delete'))
					),
					$('<span/>').text(' '),
					$('<button/>').attr({
						'type': 'button',
						'id': 'cancelBtn',
						'name': 'cancelBtn'
					}).click(function() {
						methods.cancel();
					}).append(
						$('<span/>').addClass('cancel').text(lang('cancel'))
					)
				)				
			);
			
			return this.__container;
		}
	};
	
	$.fn.form = function(method) {
		if (methods[method]){
			return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
		}else if ((typeof method === 'object') || !method){
			return methods.init.apply(this, arguments);
		}else if (settings[method]){
			if ($.isFunction(settings[method])){
				return settings[method].apply(settings, Array.prototype.slice.call(arguments, 1));
			}else{
				return settings[method];
			}
		}else{
			$.error('(Form) Metot: \"'+ method +'\" bulunamadı!');
		}
	};
})(jQuery);

/**
 * Uploader
 */
(function($) {
	var swfu;
	var settings = function(options) {
		//Return object
		return $.extend(true, {
			'url': location.href,
			'params': {},
			'title': lang('upload'),
			'description': lang('pick-to-upload'),
			'action': {
				'list': 'objects',
				'get': 'object'
			},
			'uploader': {
	   flash_url : location.href,
	   upload_url: location.href,
	   post_params: {},
	   file_size_limit : '100 MB',
	   file_types : '*.*',
	   file_types_description : lang('all-files'),
	   file_upload_limit : 100,
	   file_queue_limit : 100,
	   custom_settings : {
	    progressTarget : 'uploadProgress',
	    cancelButtonId : 'cancelUploadsBtn'
	   },
	   debug: false,
	   button_image_url: '',
	   button_width: '121',
	   button_height: '31',
	   button_placeholder_id: 'uploadButton',
	   button_text: '<span class="text">'+ lang('pick-and-upload') +'<\/span>',
	   button_text_style: '.text { font-family:Arial; font-size:14px; text-align:center; font-weight:bold; color:#333333 }',
	   button_text_left_padding: 0,
	   button_text_top_padding: 5,
	   file_queued_handler: fileQueued || function(){},
	   file_queue_error_handler: fileQueueError || function(){},
	   file_dialog_complete_handler: fileDialogComplete || function(){},
	   upload_start_handler: uploadStart || function(){},
	   upload_progress_handler: uploadProgress || function(){},
	   upload_error_handler: uploadError || function(){},
	   upload_success_handler: uploadSuccess || function(){},
	   upload_complete_handler: uploadComplete || function(){},
	   queue_complete_handler: queueComplete || function(){}
	  },
	  'onBeforePick': function() { return true; },
	  'onAfterPick': function() {},
	  'onBeforeUpload': function() { return true; },
	  'onAfterUpload': function() {},
	  'reset': function() {}
		}, options || {});
	}
	
	$.browse = function(options) {
		var browser = new settings(options);
		
		browser.pick = function() {
  	if (browser.onBeforePick()){
				$('#dialogObjectList').dialog({
					title: lang('pick'),
					width: 700,
					position: 'center',
					open: function() {
						$('#object_filter_title').val('').keyup(function(){
							browser.list();
						});
						browser.list();
					}
				});
			}
		};
		
		browser.list = function(x) {
			if (!x){
				$('#object-list').unbind('scroll').empty();
			}
 	
			browser.stats = {
				x: (x || 0),
				y: 20,
				total: 0
			};

			var params = $.extend({}, {
				'x': browser.stats.x,
				'y': browser.stats.y,
				'title': $('#object_filter_title').val()
			}, browser.params);

			$.ajax({
				url: (browser.url + (/\?/.test(browser.url) ? '&' : '?') +'act='+ browser.action.list +'&rnd='+ Math.random()),
				data: $.param(params),
				global: false,
				success: function(data) {
					if (data && (typeof(data.total) !== 'undefined')){
						if ((data.total > 0) && data.rows){
							var ul = $($('#object-list > ul').get(0) || $('<ul/>').appendTo($('#object-list')).get(0));

							for (var k in data.rows){
								$('<li/>').appendTo(ul).append(
									$('<a/>').attr({
										'id': 'o'+ data.rows[k].id,
										'href': 'javascript:void(0)',
										'title': data.rows[k].name
									}).data({
										'id': parseFloat(data.rows[k].id),
										'type': data.rows[k].type,
										'name': data.rows[k].name,
										'title': data.rows[k].title,
										'source': data.rows[k].source,
										'poster': data.rows[k].poster
									}).click(function(){
										browser.set({
											'id': $(this).data('id'),
											'type': $(this).data('type'),
											'name': $(this).data('name'),
											'title': $(this).data('title'),
											'source': $(this).data('source'),
											'poster': $(this).data('poster')
										});
									}).append(
										$('<span/>').addClass('poster').css({
											'background': 'url('+ data.rows[k].poster +') no-repeat scroll center center'
										}),
										$('<span/>').addClass('title').text(data.rows[k].title)
									)
								);
							}
							
		     browser.stats.x = parseFloat(data.x);
		     browser.stats.y = parseFloat(data.y);
		     browser.stats.total = parseFloat(data.total);
	
		     $('#object-list').bind('scroll', function(e){
		      e = e || window.event;
	
		      var node = e.target ? e.target : e.srcElement;
	
		      if (($(node).scrollTop() + $(node).height() >= node.scrollHeight) && ((browser.stats.x + browser.stats.y) < browser.stats.total)){
			      browser.list(browser.stats.x + browser.stats.y);
		      }
		     });
						}else{
							$('<div/>').appendTo($('#object-list')).addClass('warning').text(lang('no-recs'));
						}						
		     
		    $('#object-total').text(data.total);
					}
				}
			});
  };
  
  browser.upload = function() {
			if (typeof(SWFUpload) !== 'undefined'){
				if (browser.onBeforeUpload()){
					$('#dialogObjectUpload').dialog({
						title: browser.title,
						position: 'center',
						open: function() {
							$('#uploadStatus, #uploadProgress, #uploadResult, #uploadButtonContainer').empty();
							$('#uploadStatus').text(browser.description);
							$('<span/>').attr('id', 'uploadButton').appendTo($('#uploadButtonContainer'));
		
							swfu = new SWFUpload(browser.uploader);
						},
						close: function() {
							if (swfu.uploaded){
								swfu.uploaded = false;
								
								browser.getUploaded();
								browser.onAfterUpload();
							}
						}				
					});
				}
			}else{
				message({
					type: 'forbidden',
					text: 'SWFUpload eksik!'
				});
			}
		};
  
  browser.uploaded = [];
  
  browser.set = function(obj) {
			if (typeof(obj) === 'object'){
				browser.uploaded = [];
				browser.uploaded.push(obj);
				browser.onAfterPick();
			}else{
				browser.getUploaded(obj);
			}
  };
  
  browser.getUploaded = function(id) {
			browser.uploaded = [];
			
			$.ajax({
				url: (browser.url + (/\?/.test(browser.url) ? '&' : '?') +'act='+ browser.action.get +'&rnd='+ Math.random()),
				data: 'id='+ (id || 0),
				global: false,
				success: function(data) {
					if (data){
						if (data.result){
							message({
								type: data.result.status.toLowerCase(),
								text: data.result.message
							});
						}else{
							for (var k in data){
								browser.uploaded.push({
									id: data[k].id,
									type: data[k].type,
									name: data[k].name,
									title: data[k].title,
									source: data[k].source,
									poster: data[k].poster
								});
							}
								
							browser.onAfterPick();
						}
					}
				}
			});
		};
		
		return browser;
	};
})(jQuery);

/**
 * Context Menu
 */
(function($) {
	$.extend($.fn, {
		contextMenu : function(o, callback) {
			// Defaults
			if(o.menu == undefined)
				return false;
			if(o.inSpeed == undefined)
				o.inSpeed = 150;
			if(o.outSpeed == undefined)
				o.outSpeed = 75;
			// 0 needs to be -1 for expected results (no fade)
			if(o.inSpeed == 0)
				o.inSpeed = -1;
			if(o.outSpeed == 0)
				o.outSpeed = -1;
			// Loop each context menu
			$(this).each(function() {
				var el = $(this);
				var offset = $(el).offset();
				// Add contextMenu class
				$('#' + o.menu).addClass('context-menu');
				// Simulate a true right click
				$(this).mousedown(function(e) {
					var evt = e;
					evt.stopPropagation();
					$(this).mouseup(function(e) {
						e.stopPropagation();
						var srcElement = $(this);
						$(this).unbind('mouseup');
						if(evt.button == 2) {
							// Hide context menus that may be showing
							$(".context-menu").hide();
							// Get this context menu
							var menu = $('#' + o.menu);

							if($(el).hasClass('disabled'))
								return false;

							// Detect mouse position
							var d = {}, x, y;
							if(self.innerHeight) {
								d.pageYOffset = self.pageYOffset;
								d.pageXOffset = self.pageXOffset;
								d.innerHeight = self.innerHeight;
								d.innerWidth = self.innerWidth;
							} else if(document.documentElement && document.documentElement.clientHeight) {
								d.pageYOffset = document.documentElement.scrollTop;
								d.pageXOffset = document.documentElement.scrollLeft;
								d.innerHeight = document.documentElement.clientHeight;
								d.innerWidth = document.documentElement.clientWidth;
							} else if(document.body) {
								d.pageYOffset = document.body.scrollTop;
								d.pageXOffset = document.body.scrollLeft;
								d.innerHeight = document.body.clientHeight;
								d.innerWidth = document.body.clientWidth;
							}
							(e.pageX) ? x = e.pageX : x = e.clientX + d.scrollLeft; (e.pageY) ? y = e.pageY : y = e.clientY + d.scrollTop;

							// Show the menu
							$(document).unbind('click');
							$(menu).css({
								top : y,
								left : x
							}).fadeIn(o.inSpeed);
							// Hover events
							$(menu).find('A').mouseover(function() {
								$(menu).find('LI.hover').removeClass('hover');
								$(this).parent().addClass('hover');
							}).mouseout(function() {
								$(menu).find('LI.hover').removeClass('hover');
							});
							// Keyboard
							$(document).keypress(function(e) {
								switch( e.keyCode ) {
									case 38:
										// up
										if($(menu).find('LI.hover').size() == 0) {
											$(menu).find('LI:last').addClass('hover');
										} else {
											$(menu).find('LI.hover').removeClass('hover').prevAll('LI:not(.disabled)').eq(0).addClass('hover');
											if($(menu).find('LI.hover').size() == 0)
												$(menu).find('LI:last').addClass('hover');
										}
										break;
									case 40:
										// down
										if($(menu).find('LI.hover').size() == 0) {
											$(menu).find('LI:first').addClass('hover');
										} else {
											$(menu).find('LI.hover').removeClass('hover').nextAll('LI:not(.disabled)').eq(0).addClass('hover');
											if($(menu).find('LI.hover').size() == 0)
												$(menu).find('LI:first').addClass('hover');
										}
										break;
									case 13:
										// enter
										$(menu).find('LI.hover A').trigger('click');
										break;
									case 27:
										// esc
										$(document).trigger('click');
										break
								}
							});
							// When items are selected
							$('#' + o.menu).find('A').unbind('click');
							$('#' + o.menu).find('LI:not(.disabled) A').click(function() {
								$(document).unbind('click').unbind('keypress');
								$(".context-menu").hide();
								// Callback
								if(callback)
									callback($(this).attr('href').substr(1), $(srcElement), {
										x : x - offset.left,
										y : y - offset.top,
										docX : x,
										docY : y
									});
								return false;
							});
							// Hide bindings
							setTimeout(function() {// Delay for Mozilla
								$(document).click(function() {
									$(document).unbind('click').unbind('keypress');
									$(menu).fadeOut(o.outSpeed);
									return false;
								});
							}, 0);
						}
					});
				});
				// Disable text selection
				if($.browser.mozilla) {
					$('#' + o.menu).each(function() {
						$(this).css({
							'MozUserSelect' : 'none'
						});
					});
				} else if($.browser.msie) {
					$('#' + o.menu).each(function() {
						$(this).bind('selectstart.disableTextSelect', function() {
							return false;
						});
					});
				} else {
					$('#' + o.menu).each(function() {
						$(this).bind('mousedown.disableTextSelect', function() {
							return false;
						});
					});
				}
				// Disable browser context menu (requires both selectors to work in IE/Safari + FF/Chrome)
				$(el).add($('UL.context-menu')).bind('contextmenu', function() {
					return false;
				});
			});
			return $(this);
		},
		// Disable context menu items on the fly
		disableContextMenuItems : function(o) {
			if(o == undefined) {
				// Disable all
				$(this).find('LI').addClass('disabled');
				return ( $(this) );
			}
			$(this).each(function() {
				if(o != undefined) {
					var d = o.split(',');
					for(var i = 0; i < d.length; i++) {
						$(this).find('A[href="' + d[i] + '"]').parent().addClass('disabled');
					}
				}
			});
			return ( $(this) );
		},
		// Enable context menu items on the fly
		enableContextMenuItems : function(o) {
			if(o == undefined) {
				// Enable all
				$(this).find('LI.disabled').removeClass('disabled');
				return ( $(this) );
			}
			$(this).each(function() {
				if(o != undefined) {
					var d = o.split(',');
					for(var i = 0; i < d.length; i++) {
						$(this).find('A[href="' + d[i] + '"]').parent().removeClass('disabled');

					}
				}
			});
			return ( $(this) );
		},
		// Disable context menu(s)
		disableContextMenu : function() {
			$(this).each(function() {
				$(this).addClass('disabled');
			});
			return ( $(this) );
		},
		// Enable context menu(s)
		enableContextMenu : function() {
			$(this).each(function() {
				$(this).removeClass('disabled');
			});
			return ( $(this) );
		},
		// Destroy context menu(s)
		destroyContextMenu : function() {
			// Destroy specified context menus
			$(this).each(function() {
				// Disable action
				$(this).unbind('mousedown').unbind('mouseup');
			});
			return ( $(this) );
		}
	});
})(jQuery);

/**
 * AJAX
 */
$(function(){
	//Loader veil
	var veil = $('<div/>').css({
		'display': 'none',
		'position': 'fixed',
		'top': 0,
		'left': 0,
		'width': $(window).width(),
		'height': $(window).height(),
		'backgroundColor': '#ffffff',
		'opacity': .1,
		'zIndex': 10000
	}).appendTo('body');
	
	$(window).resize(function(){
		veil.css({
			'width': $(window).width(),
			'height': $(window).height()
		});
	});
	
	//Loading bar
	$('<div/>').hide().appendTo('body').addClass('loading-bar').ajaxStart(function(){
		veil.show();
		$(this).css({
			'left': (($(window).width() / 2) - ($(this).width() / 2)),
			'top': (($(window).height() / 2) - ($(this).height() / 2)),
			'zIndex': 10001
		}).show();
	}).ajaxStop(function(){
		veil.hide();
		$(this).hide('slow');
	}).text(lang('loading'));
	
	//Ajax error
	$(document).ajaxError(function(){
		message({
			type: 'forbidden',
			text: lang('ajax-error')
		});
	});
	
	//Ajax setup
	$.ajaxSetup({
		abortOnRetry: true
	});
	
	//Current requests
	var currentRequests = {};

	//Filter requests
	$.ajaxPrefilter(function(options, originalOptions, jqXHR) {
  if (options.abortOnRetry){
   if (currentRequests[options.url]){
    currentRequests[options.url].abort();
   }
   
   currentRequests[options.url] = jqXHR;
  }
	});	
});

