(function(){
	var $ = jQuery;

	$aw.data = {};
	$aw.lib  = {};
	$aw.panelString = "";
	$aw.hide = [];	
	
	$aw.init = function( panel, root ) {
		if (typeof root == "undefined") 
		{
			root = document;			
		}
		
		this._parse(panel, $(root));
	}
	
	$aw._parse = function( panel, root ) {
		var panels = panel.split(',');		

		for (var i = 0; i < panels.length; i++) 
		{
			panel = $.trim(panels[i]);
			this._load(panel, root);
		}
	}
	
	$aw._load = function( panel, root ) {
		var self = this;
		var name = panel.replace(/-/g, '_');
		
		$("." + panel, root).each ( function(i) {
			if (typeof self.data[this.id] === 'undefined') 
			{
				if (name in self.lib) 
				{
					if (!this.id) 
					{
						this.id = name + i;						
					} 
					
					var component = new self.lib[name](this, root);
					self.data[this.id] = component;
					
					self.panelString += name;
				}
			}
		}); 
	}
	
	$aw.refresh = function( panel, root ) {
		if (typeof panel == "undefined") 
		{
			this.init(this.panelString);
		} 
		else 
		{
			this.init(panel, root);			
		}
	}
	
	$aw.ready = function( onReady ) {
		$(document).ready( function()
		{
			if (typeof onReady == "function") 
			{
				onReady();			
			}			
		});
	}
	
	$aw.ajaxReplaceLinks = function( el ) {
	  if (!el.replacedLinks) 
	  {
	  	var anchors = $('a.aw-ajax', el);
		anchors.each( function() {
			var link = $(this).attr("href");
			var anchor = $(this);
			var request = $.ajax({url: link, async: false});
			$(this).replaceWith(request.responseText);
	 	});
	 	el.replacedLinks = true;
	  }
	}	
	
	$aw.ajaxLoading = function( el ) {
		var self = this;
		el.ajaxStart( function() {
			el.prepend('<span class="aw-loading"><img src="' + self.config.image_path + 'loading.gif"/></span>');
		});
		
		el.ajaxStop( function() {
			$(".aw-loading", el).remove();
		});
	}
	
	$aw.showPicker = function(input, picker) {
		var pos = input.offset();
		picker.css({'position':'absolute', 'top':pos.top + input.height() + 6, 'left':pos.left});		
		picker.show();
		$aw.hide.push(picker);			
	}

	$aw.pickerOver = function() {
		if ($(this).is(':empty')) return false;		
		$(this).addClass('aw-calendar-hover');
	}

	$aw.pickerOut = function() {
		if ($(this).is(':empty')) return false;		
		$(this).removeClass('aw-calendar-hover');		
	}		

	$aw.test = function() {
		alert("aw.js");
	}

	$aw.log = function( txt, element ) {
		if (element == null) 
		{
			element = "body";
		}
		
		$("<div class = \"aw-log\">" + txt + "</div>").appendTo(element);		
	}
	
	$(document).ready( function() {
		$aw.refresh("aw-tab, aw-accordion, aw-calendar");
	});
	
	$(document).click(function() {
		var a = $aw.hide;
		for(var i=0; i<a.length; i++) $(a[i]).hide();
		a.length=0;
	});	
	
	$aw.iframeHack = function( el, w, h ) {
		if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)){
			 if (typeof w === "undefined") w = el.width(); 
			 if (typeof h === "undefined") h = el.height();
			 f1 = document.createElement("IFRAME");
			 f1.setAttribute("src", "javascript: false;");
			 f1.setAttribute("marginWidth", "0");
			 f1.setAttribute("marginHeight", "0");
			 f1.setAttribute("align", "bottom");
			 f1.setAttribute("scrolling", "no");
			 f1.setAttribute("align", "bottom");
			 f1.style.position = "absolute";
			 f1.style.display = "block";
			 f1.style.zIndex = "-1";
			 f1.style.top = "0";
			 f1.style.left = "0";
			 f1.style.filter = "alpha(opacity=0)";
			 f1.style.height = h+'px';
			 f1.style.width = w+'px';
			 el.append(f1);
		}
	}	
	
})(jQuery);

(function(){
	var $ = jQuery;
	
	$aw.lib.aw_accordion = function( el ) {
		var self = this;
		self.elPanel = $(el);
	    self.tabs = $('.aw-accordion-header', this.elPanel).css('cursor', 'pointer');
		$('.aw-accordion-body', this.elPanel).hide();
		
		$(this.tabs).click( function() {
			if ($(this).hasClass('aw-accordion-active')) {
				$(this).removeClass('aw-accordion-active');
			}
			else {
				$(self.tabs).removeClass('aw-accordion-active');
				$(this).addClass('aw-accordion-active');
			}
			
			var hideEl = $(".aw-accordion-body:visible", self.elPanel);
			var showEl = $(this).next(".aw-accordion-body");
			$aw.ajaxReplaceLinks(showEl);
			showEl.slideDown();
			hideEl.slideUp();	  	
		});
		
		//this.openActive();
	}
	
	$aw.lib.aw_accordion.prototype = {
		openActive: function() {
			var activeTabs = $('.aw-accordion-active', this.elPanel);
			var activeTab = (activeTabs.length > 0) ? activeTabs.eq(0) : this.tabs.eq(0);
			activeTab.click();			
		},
		
		open: function( param ) {
			$(this.tabs).eq(--param).click();
		}
	}
		
})(jQuery);

(function(){
	var $ = jQuery;

	var _dm = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
	var _nm = $aw.config.aw_calendar_month;
	var _dn = $aw.config.aw_calendar_day;	
	
	$aw.lib.aw_calendar = function( el, dt ) {
		this.input = $(el);
		if (dt == 1) {
			this.dt = 1;
			this.timePicker = "00:00";
		} else this.timePicker = "";
		
		this.icon = this.input.after('&nbsp;<img src="' + $aw.config.image_path + 'datePicker.gif"/>').next();
		var calendarId = el.id + "_body";
	
		this.calendar = $('<div/>')
						.html('<table id="' + calendarId +'" class="aw-calendar-body calendar" cellspacing="0" cellpadding="0"><tr><td colspan="6" class="aw-calendar-title"></td><td class="aw-calendar-close button nav">×</td></tr><tr class="aw-calendar-top nav"><td class="button">«</td><td class="button">‹</td><td class="aw-calendar-today button" colspan="3">'+$aw.config.aw_calendar_today+'</td><td class="button">›</td><td class="button">»</td></tr><tr class="aw-calendar-header daynames"> <td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr class="day"><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr> <tr class="day"><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr> <tr class="day"><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr> <tr class="day"><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr> <tr class="day"><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr> <tr class="day"><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr></table>')
						.appendTo('body');

		$aw.iframeHack(this.calendar, 215, 160);
		
		this.calendar.hide();						
		
		this.icon.click( function(e) {
			self.readDate();		
			self.refresh();
			self.show();
			return false;
		});
	
		this.aktd = new Date();
		this.today = new Date();
		this.rDate = new Date();
		this.format = ($aw.config.date_format.substr(0, 1) == "d") ? 1 : 2;
		this.sep = $aw.config.date_format.substr(1, 1);
		
		this.top = $('tr.aw-calendar-top', this.calendar);
		this.header = $('tr.aw-calendar-header', this.calendar);
		this.dayRows = $('tr.day', this.calendar);
		this.dayCells = $('td', this.dayRows);
		
		var self = this;
		
		$('td', this.header).each( function(i){
			$(this).text(_dn[i]);
		});
		
		$('td', this.top).eq(0).click(function(){
			self.prevYear();
			return false;
		});	
		
		$('td', this.top).eq(1).click(function(){
			self.prevMonth();
			return false;
		});
		
		$('td', this.top).eq(3).click(function(){
			self.nextMonth();
			return false;
		});
		
		$('td', this.top).eq(4).click(function(){
			self.nextYear();
			return false;
		});	
		
		$('.aw-calendar-title').click(function() {
			return false;
		});
		
		$('.aw-calendar-today', self.calendar).click(function(){
			self.setDate(self.today);
		});
		
		this.dayCells.hover($aw.pickerOver, $aw.pickerOut);
		
		this.dayCells.click( function() {
			if ($(this).is(':empty')) return false;
			self.aktd.setDate(parseInt($(this).text(), 10));
			self.setDate();
		});	
	}
	
	$aw.lib.aw_calendar.prototype = {
		show: function() {
			$(document).click();	
			$aw.showPicker(this.input, this.calendar);
		},	

		getDate: function() {
			if (this.format == 1) return this.aktd.getDate() + this.sep+(this.aktd.getMonth()+1) + this.sep + this.aktd.getFullYear();		
			else return this.aktd.getFullYear() + this.sep + (this.aktd.getMonth()+1) + this.sep + this.aktd.getDate();				
		},
		
		setDate: function(day, month, year) {
			if (arguments.length == 1) {
				if (typeof day == "object")
					this.aktd.setFullYear(day.getFullYear(), day.getMonth(), day.getDate())	;
			} else if (arguments.length == 3)
				this.aktd.setFullYear(year, month - 1, day);
			
			
			var nula1 = nula2 = "";
			if (this.aktd.getDate() <= 9)
				nula1 = "0"
				
			if ((this.aktd.getMonth()+1) <= 9)
				nula2 = "0";
			
			if (this.format == 1) this.input.val(nula1+this.aktd.getDate() + this.sep+(nula2+(this.aktd.getMonth()+1)) + this.sep + this.aktd.getFullYear());		
			else this.input.val(this.aktd.getFullYear() + this.sep + (nula2+(this.aktd.getMonth()+1)) + this.sep + (nula1+this.aktd.getDate()));				
		},	
		
		readDate: function() {
			var pattern = (this.format == 1) ? /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/ : /^\d{4}(\-|\/|\.)\d{1,2}\1\d{1,2}$/;
			var dt = this.input.val().split(' ');
			var date = dt[0];
			
			if (this.dt && dt[1])
				this.timePicker = dt[1];
			
			if (pattern.test(date)) {
				date = date.split(RegExp.$1);
				
				var y = (this.format == 1) ? date[2] : date[0];
				var m = date[1] - 1;
				var d = (this.format == 1) ? date[0] : date[2];
		
				var dt = new Date(parseFloat(y), parseFloat(m), parseFloat(d));
				if ((parseFloat(d) != dt.getDate()) || (parseFloat(m) != dt.getMonth())) {
					return false;		
				}
				
				this.rDate.setFullYear(y, m, d);
				this.aktd.setFullYear(y, m, d);	
			} else {
				this.rDate = new Date();
				this.aktd = new Date();
			}
		},
		
		nextMonth: function() {
			this.aktd.setMonth(this.aktd.getMonth() + 1);	
			this.refresh();
			return false; 	
		},	
		
		prevMonth: function() {
			this.aktd.setMonth(this.aktd.getMonth() - 1); 	
			this.refresh();
			return false;
		},
		
		nextYear: function() {
			this.aktd.setFullYear(this.aktd.getFullYear() + 1);	
			this.refresh();
			return false; 	
		},	
		
		prevYear: function() {
			this.aktd.setFullYear(this.aktd.getFullYear() - 1);	
			this.refresh();
			return false; 	
		},	
		
		reset: function(){
			this.aktd = new Date();
			this.refresh();	
			return false;
		},
		
		refresh: function() {
			var y = this.aktd.getFullYear();
			var m = this.aktd.getMonth();
			var d = this.aktd.getDate();
			var wd = this.aktd.getDay();
			wd = (wd==0) ? 6 : wd-1;
			var start = wd-(d-1)%7;
			if(start<0) start+=7;
			
			var maxd = (m==1 && (y%4==0 && (y%100!=0 || y%400==0))) ? 29 : _dm[m];
			var end = start+maxd;
			$("#datex_" + this.id).text(wd + " " + d + " " + start + " " + end);
		
			$('.aw-calendar-title').text(_nm[m]+', '+y);
		
			this.dayCells.empty().removeClass('aw-calendar-active aw-calendar-selected aw-calendar-weekend');
			
			var self = this;
			$.each(this.dayCells, function(i, item){
				if (i >= start && i < end) {
					var weekend = new Date(y, m, (i- start + 1));
					var nula = "";
					if ((i - start + 1) <= 9)
						nula = "0";
					$(item).text(nula + (i - start + 1));
					if ((i - start + 1) == self.today.getDate() && m == self.today.getMonth() && y == self.today.getFullYear()) 
						$(item).addClass('aw-calendar-active');
					if ((i - start + 1) == self.rDate.getDate() && m == self.rDate.getMonth() && y == self.rDate.getFullYear()) 
						$(item).addClass('aw-calendar-selected');
					if ((weekend.getDay() == 0) || (weekend.getDay() == 6))
						$(item).addClass('aw-calendar-weekend');
				}
			});
		}					
	}
	
})(jQuery);
