/* Brambucho - Lightweight JavaScript UI Library
 * By Nikola Obreshkov - nikola.obreshkov@gmail.com
 * http://www.strangerstudio.net/
 * MIT Licensed.
 */

/* Simple JavaScript Inheritance
 * By John Resig http://ejohn.org/
 * MIT Licensed.
 */
// Inspired by base2 and Prototype
(function(){
  var initializing = false, fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/;

  // The base Class implementation (does nothing)
  this.Class = function(){};

  // Create a new Class that inherits from this class
  Class.extend = function(prop) {
    var _super = this.prototype;

    // Instantiate a base class (but only create the instance,
    // don't run the init constructor)
    initializing = true;
    var prototype = new this();
    initializing = false;

    // Copy the properties over onto the new prototype
    for (var name in prop) {
      // Check if we're overwriting an existing function
      prototype[name] = typeof prop[name] == "function" &&
        typeof _super[name] == "function" && fnTest.test(prop[name]) ?
        (function(name, fn){
          return function() {
            var tmp = this._super;

            // Add a new ._super() method that is the same method
            // but on the super-class
            this._super = _super[name];

            // The method only need to be bound temporarily, so we
            // remove it when we're done executing
            var ret = fn.apply(this, arguments);
            this._super = tmp;

            return ret;
          };
        })(name, prop[name]) :
        prop[name];
    }

    // The dummy class constructor
    function Class() {
      // All construction is actually done in the init method
      if ( !initializing && this.init )
        this.init.apply(this, arguments);
    }

    // Populate our constructed prototype object
    Class.prototype = prototype;

    // Enforce the constructor to be what we expect
    Class.constructor = Class;

    // And make this class extendable
    Class.extend = arguments.callee;

    return Class;
  };
})();

(function($){
	$.fn.extend({
		disableSelection : function() {
			return this.each(function() {
				this.onselectstart = function() { return false; };
				this.unselectable = "on";
				$(this).css('user-select', 'none');
				$(this).css('-o-user-select', 'none');
				$(this).css('-moz-user-select', 'none');
				$(this).css('-khtml-user-select', 'none');
				$(this).css('-webkit-user-select', 'none');
			});
		}
	});
})(jQuery);

var toggleGroups = new Array();
var ddp = null;
function hideDDM() {
	if ( ddp ) {
		ddp.hide();
	}
	ddp = null;
}

$(document).ready(function() {

	$(document).click(function() {
		hideDDM();
	});

});

var TabPanel = Class.extend({
	init: function(cfg) {
		this.defaults = {
			theme: 'light-gray',
			items: [],
			transform: false,
			handler: function() {}
		};
		this.cfg = $.extend(this.defaults, cfg);

		if ( this.cfg.renderTo ) {
			this.render();
		}
	},

	render: function() {
		var tpnl = this;
		var cfg = this.cfg;
		var id = cfg.renderTo;

		var html = '<ul id="tabs">';
		for ( var i = 0; i < cfg.items.length; i++ ) {
			html += '<li><a href="#">' + cfg.items[i] + '</a></li>';
		}
		html += '</ul>';
		$('#' + id).prepend(html);

		$('#' + id + '  > div').addClass('tabContent');
		$('#' + id + ' li a').each(function(i) {
			$(this).click(function() {
				tpnl.showTab(i);
			});
		});
		this.showTab(0);
	},

	hideTabs: function() {
		$('#' + this.cfg.renderTo + ' li a').removeClass('selected');
		$('#' + this.cfg.renderTo + ' > div').addClass('hide');
	},

	showTab: function(i) {
		this.hideTabs();
		$('#' + this.cfg.renderTo + ' li:eq(' + i + ') a').addClass('selected');
		$('#' + this.cfg.renderTo + ' > div:eq(' + i + ')').removeClass('hide');
	}
});

var Button = Class.extend({

	init: function(cfg) {
		this.setDefaults();
		this.cfg = $.extend(this.defaults, cfg);

		if ( this.cfg.renderTo ) {
			this.render();
		}
	},

	setDefaults: function() {
		this.defaults = {
			theme: 'light-gray',
			size: 'm',
			transform: false,
			pos: 'n',
			text: '',
			handler: function() {}
		};
	},

	setText: function(text) {
		$('#' + this.cfg.renderTo + ' .brm-btn-txt').html(text);
	},

	attachHandlers: function() {
		var id = this.cfg.renderTo;
		var cfg = this.cfg;
		$('#' + id + ' .brm-btn').click(function(e) {
			e.stopPropagation();
			hideDDM();
			cfg.handler();
		}).hover(function() {
			$(this).addClass('brm-btn-theme-' + cfg.theme + '-hover');
		}, function() {
			$(this).removeClass('brm-btn-theme-' + cfg.theme + '-hover');
		}).mousedown(function() {
			$(this).addClass('brm-btn-theme-' + cfg.theme + '-active');
		}).mouseup(function() {
			$(this).removeClass('brm-btn-theme-' + cfg.theme + '-active');
		});
	},

	render: function() {
		var cfg = this.cfg;
		var id = cfg.renderTo;
		var txt = cfg.text;
		if ( cfg.transform ) {
			txt = $('#' + id).html();
		}

 		var html = '';
		html += '<span class="brm-btn brm-btn-theme-' + cfg.theme + ' brm-btn-pos-' + cfg.pos + '"><span class="brm-btn-cnt brm-btn-size-' + cfg.size + '"><span class="brm-btn-txt">' +  txt + '</span></span></span>';
		$('#' + id).html(html);

		if ( cfg.width ) {
			$('#' + id + ' .brm-btn-cnt').css('width', cfg.width + 'px');
		}

		$('#' + id + ' .brm-btn-txt').disableSelection();
		this.attachHandlers();
	}

});

var ToggleButton = Button.extend({

	setDefaults: function() {
		this._super();
		this.defaults.selected = false;
		this.defaults.toggleGroup = '';
	},

	isSelected: function() {
		return this.cfg.selected;
	},

	select: function() {
		var cfg = this.cfg;
		var id = cfg.renderTo;
		if ( cfg.toggleGroup ) {
			for ( var i = 0; i < toggleGroups[cfg.toggleGroup].length; i++ ) {
				toggleGroups[cfg.toggleGroup][i].deselect();
			}
		}
		$('#' + id + ' .brm-btn').addClass('brm-btn-theme-' + cfg.theme + '-selected');
		cfg.selected = true;
	},

	deselect: function() {
		var cfg = this.cfg;
		var id = cfg.renderTo;
		$('#' + id + ' .brm-btn').removeClass('brm-btn-theme-' + cfg.theme + '-selected');
		cfg.selected = false;
	},

	unselect: function() {
		this.deselect();
	},

	uncheck: function() {
		this.deselect();
	},

	attachHandlers: function() {
		var btn = this;
		var id = this.cfg.renderTo;
		var cfg = this.cfg;

		if ( cfg.toggleGroup ) {
			if ( !toggleGroups[cfg.toggleGroup] ) {
				toggleGroups[cfg.toggleGroup] = new Array();
			}
			toggleGroups[cfg.toggleGroup].push(this);
		}

		if ( cfg.selected ) {
			this.select();
		}

		$('#' + id + ' .brm-btn').click(function(e) {
			e.stopPropagation();
			hideDDM();
			if ( btn.isSelected() ) {
				if ( this.isSelected() && !cfg.toggleGroup ) {
					btn.deselect();
				}
			} else {
				btn.select();
			}
			cfg.handler();
		}).hover(function() {
			$(this).addClass('brm-btn-theme-' + cfg.theme + '-hover');
		}, function() {
			$(this).removeClass('brm-btn-theme-' + cfg.theme + '-hover');
		});/*.mousedown(function() {
			$(this).addClass('brm-btn-theme-' + cfg.theme + '-active');
		}).mouseup(function() {
			$(this).removeClass('brm-btn-theme-' + cfg.theme + '-active');
		});*/
	}
});

var SelectField = Class.extend({
	init: function(cfg) {
		this.defaults = {
			theme: 'light-gray-sf',
			size: 'm',
			width: 170,
			transform: false,
			pos: 'n',
			value: '',
			handler: function() {},
			onFocus: function() {},
			onBlur: function() {}
		};
		this.cfg = $.extend(this.defaults, cfg);

		if ( this.cfg.renderTo ) {
			this.render();
		}
	},

	setValue: function(val) {
		$('#' + this.cfg.renderTo + '-fld').val(val);
	},

	rndrDDMenu: function() {
		var cb = this;
		var cfg = this.cfg;
		var id = cfg.renderTo;
		this.ddm = new DropDownMenu({
			renderTo: id + '-ddm',
			items: cfg.items,
			width: cfg.width + 4,
			onSelect: function(val) {
				cb.ddm.hide();
				cb.setValue(val);
// 				cb.cfg.onChange(val);
			}
		});
	},

	render: function() {
		var sf = this;
		var cfg = this.cfg;
		var id = cfg.renderTo;
		var txt = cfg.text;
		if ( cfg.transform ) {
			txt = $('#' + id).html();
		}

 		var html = '<table class="cb-tbl" cellspacing="0" cellpadding="0" border="0"><tbody><tr><td>';
		html += '<span class="brm-btn brm-btn-theme-' + cfg.theme + ' brm-btn-pos-m"><input type="text" id="' + id + '-fld" name="' + cfg.name + '" class="brm-btn-cnt-l"><span class="brm-btn-cnt-r brm-btn-size-icn"><span class="brm-btn-txt"><img src="down-arrow.gif"></span></span></span>';
		html += '</td></tr><tr><td><div id="' + id +'-ddm">';
		html += '</ul></div></td></tr></tbody></table>';

		$('#' + id).html(html);
		this.setValue(cfg.value);

		$('#' + id + '-fld').focus(function() {
// 			$('#' + id + '-fld').removeClass('brm-fld-err');
// 			$('#' + id + '-msg').text('');
			$('#' + id + ' .brm-btn').addClass('brm-sfld-theme-' + cfg.theme + '-focus');
			cfg.onFocus();
		}).blur(function() {
			$('#' + id + ' .brm-btn').removeClass('brm-sfld-theme-' + cfg.theme + '-focus');
			cfg.onBlur();
		}).attr('readOnly', true);

		$('#' + id + '-fld').attr('readOnly', true);

		if ( cfg.width ) {
			$('#' + id + ' .brm-btn-cnt-l').css('width', (cfg.width - 22) + 'px');
		}

		this.rndrDDMenu();

		$('#' + id + ' .brm-btn-txt').disableSelection();

		$('#' + id + ' .brm-btn').click(function(e) {
			e.stopPropagation();
			hideDDM();
			if ( sf.ddm.isVisible() ) {
				sf.ddm.hide();
			} else {
				ddp = sf.ddm;
				sf.ddm.show();
			}
			cfg.handler();
		}).hover(function() {
			$(this).addClass('brm-btn-theme-' + cfg.theme + '-hover');
		}, function() {
			$(this).removeClass('brm-btn-theme-' + cfg.theme + '-hover');
		}).mousedown(function() {
			$(this).addClass('brm-btn-theme-' + cfg.theme + '-active');
		}).mouseup(function() {
			$(this).removeClass('brm-btn-theme-' + cfg.theme + '-active');
		});

	}
});

var Field = TextField = Class.extend({

	init: function(cfg) {

		this.defaults = {
			theme: 'light-gray',
			size: 'm',
			pos: 'n',
			readOnly: false,
			allowBlank: true,
			width: 170,
			height: 70,
			name: '',
			value: '',
			handler: function() {},
			onFocus: function() {},
			onBlur: function() {}
		};
		this.cfg = $.extend(this.defaults, cfg);

		if ( this.cfg.renderTo ) {
			this.render();
			this.addCss();
			this.atachHandlers();
		}

	},

	setValue: function(val) {
		$('#' + this.cfg.renderTo + '-fld').val(val);
	},

	getValue: function() {
		return $('#' + this.cfg.renderTo + '-fld').val();
	},

	addCss: function() {
		var cfg = this.cfg;
		var id = cfg.renderTo;

		$('#' + id + '-fld').addClass('brm-fld-theme-' + cfg.theme + ' brm-fld-pos-' + cfg.pos);
		$('#' + id + '-fld').css('width', cfg.width + 'px');
	},

	atachHandlers: function() {
		var cfg = this.cfg;
		var id = cfg.renderTo;

		$('#' + id + '-fld').focus(function() {
			$('#' + id + '-fld').removeClass('brm-fld-err');
			$('#' + id + '-msg').text('');
			$(this).addClass('brm-fld-theme-' + cfg.theme + '-focus');
			cfg.onFocus();
		}).blur(function() {
			$(this).removeClass('brm-fld-theme-' + cfg.theme + '-focus');
			cfg.onBlur();
		}).attr('readOnly', cfg.readOnly);
	},

	render: function() {
		var cfg = this.cfg;
		var id = cfg.renderTo;

		var html = '';
		html += '<input id="' + id + '-fld" name="' + cfg.name + '" type="text" value="" /><span class="brm-fld-msg" id="' + id + '-msg"></span>';
		$('#' + id).html(html);
		this.setValue(cfg.value);
	},

	validate: function() {
		var cfg = this.cfg;
		var id = cfg.renderTo;

		if ( !this.getValue() && !cfg.allowBlank ) {
			$('#' + id + '-fld').addClass('brm-fld-err');
			$('#' + id + '-msg').text('Това поле е задъкжително!');
			return false;
		} else {
			return true;
		}
	}

});

var PasswordField = Field.extend({

	render: function() {
		var cfg = this.cfg;
		var id = cfg.renderTo;

		var html = '';
		html += '<input id="' + id + '-fld" name="' + cfg.name + '" type="password" value="' + cfg.value + '" /><br><span class="brm-fld-msg" id="' + id + '-msg"></span>';
		$('#' + id).html(html);
	}

});

var TextArea = Field.extend({

	render: function() {
		var cfg = this.cfg;
		var id = cfg.renderTo;

		var html = '';
		html += '<textarea name="' + cfg.name + '" id="' + id + '-fld" value="" ></textarea><br><span class="brm-fld-msg" id="' + id + '-msg"></span>';
		$('#' + id).html(html);
		this.setValue(cfg.value);
		if ( cfg.height )
		$('#' + id + '-fld').css('height', cfg.height + 'px');
	},

	setValue: function(val) {
		this._super(val);
		$('#' + this.cfg.renderTo + '-fld').text(val);
	}

});

var SpinnerField = Class.extend({

	init: function(cfg) {

		this.defaults = {
			value: '0',
			theme: 'light-gray',
			width: 170,
			increment: 1,
			min: -10,
			max: 10,
			suffix: '',
			name: '',
			readOnly: false,
			onFocus: function() {},
			onSelect: function() {},
			onChange: function() {}
		};
		this.cfg = $.extend(this.defaults, cfg);

		if ( this.cfg.renderTo ) {
			this.render();
		}

	},

	render: function() {
		var sf = this;
		var cfg = this.cfg;
		var id = cfg.renderTo;
		var html = '<table class="sb-tbl" cellspacing="0" cellpadding="0" border="0"><tbody><tr><td rowspan="2">';
		html += '<span id="' + id + '-fld"></span></td><td><span id="' + id + '-ubtn"><img src="sf-up-arrow.gif"></span>';
		html += '</td></tr><tr><td><span id="' + id + '-dbtn"><img src="sf-down-arrow.gif"></span></td></tr></tbody></table>';

		$('#' + id).html(html);

		this.fld = new Field({
			renderTo: id + '-fld',
			pos: 'l',
			value: cfg.value + cfg.suffix,
			readOnly: cfg.readOnly,
			width: cfg.width - 22,
			theme: cfg.theme,
			name: cfg.name,
			onBlur: function() {
				if ( isNaN(sf.fld.getValue()) ) {
					sf.fld.setValue(0);
				}
			}
		});

		$('#' + id + '-fld-fld').keydown(function(e) {
			if ( e.keyCode == 38 || e.keyCode == 39 ) {
				sf.increase();
			} else if ( e.keyCode == 40 || e.keyCode == 37 ) {
				e
				sf.decrease();
			}
		});

		this.btn = new Button({
			renderTo: id + '-ubtn',
			size: 'spn',
			transform: true,
			pos: 'r',
			theme: cfg.theme + '-up',
			handler: function() {
				sf.increase();
			}
		});

		this.btn = new Button({
			renderTo: id + '-dbtn',
			size: 'spn',
			transform: true,
			pos: 'r',
			theme: cfg.theme + '-down',
			handler: function() {
				sf.decrease();
			}
		});

	},

	increase: function() {
		var val = parseFloat(this.fld.getValue()) + this.cfg.increment;
		if ( val <= this.cfg.max ) {
			this.fld.setValue(val + this.cfg.suffix);
		}
	},

	decrease: function() {
		var val = parseFloat(this.fld.getValue()) - this.cfg.increment;
		if ( val >= this.cfg.min ) {
			this.fld.setValue(val + this.cfg.suffix);
		}
	},

	validate: function() {
		return true;
// 		var cfg = this.cfg;
// 		var id = cfg.renderTo;
//
// 		if ( !this.getValue() && !cfg.allowBlank ) {
// 			$('#' + id + '-fld').addClass('brm-fld-err');
// 			$('#' + id + '-msg').text('Това поле е задъкжително!');
// 			return false;
// 		} else {
// 			return true;
// 		}
	}
});


var ComboBox = ComboField = Class.extend({

	init: function(cfg) {

		this.defaults = {
			value: '',
			theme: 'light-gray',
			items: [''],
			width: 170,
			name: '',
			readOnly: false,
			onFocus: function() {},
			onSelect: function() {},
			onChange: function() {}
		};
		this.cfg = $.extend(this.defaults, cfg);

		if ( this.cfg.renderTo ) {
			this.render();
		}

	},

	getValue: function() {
		return this.fld.getValue();
	},

	setValue: function(val) {
		this.fld.setValue(val);
	},

	rndrDDMenu: function() {
		var cb = this;
		var cfg = this.cfg;
		var id = cfg.renderTo;
		this.ddm = new DropDownMenu({
			renderTo: id + '-ddm',
			items: cfg.items,
			width: cfg.width + 4,
			onSelect: function(val) {
				cb.ddm.hide();
				cb.setValue(val);
				cb.cfg.onChange(val);
			}
		});
	},

	render: function() {
		var cb = this;
		var cfg = this.cfg;
		var id = cfg.renderTo;
		var html = '<table class="cb-tbl" cellspacing="0" cellpadding="0" border="0"><tbody><tr><td>';
		html += '<span id="' + id + '-fld"></span></td><td><span id="' + id + '-btn"><img src="down-arrow.gif"></span>';
		html += '</td></tr><tr><td colspan="2"><div id="' + id +'-ddm">';
		html += '</ul></div></td></tr></tbody></table>';

		$('#' + id).html(html);

		this.fld = new Field({
			renderTo: id + '-fld',
			pos: 'l',
			value: cfg.value,
			readOnly: cfg.readOnly,
			width: cfg.width - 22,
			theme: cfg.theme,
			name: cfg.name,
			onFocus: function() {
				cb.ddm.hide();
			}
		});

		this.btn = new Button({
			renderTo: id + '-btn',
			size: 'icn',
			transform: true,
			pos: 'r',
			theme: cfg.theme,
			handler: function() {
				if ( cb.ddm.isVisible() ) {
					cb.ddm.hide();
				} else {
					ddp = cb.ddm;
					cb.ddm.show();
				}
			}
		});

		this.rndrDDMenu();
	},

	validate: function() {
		return true;
// 		var cfg = this.cfg;
// 		var id = cfg.renderTo;
//
// 		if ( !this.getValue() && !cfg.allowBlank ) {
// 			$('#' + id + '-fld').addClass('brm-fld-err');
// 			$('#' + id + '-msg').text('Това поле е задъкжително!');
// 			return false;
// 		} else {
// 			return true;
// 		}
	}
});

var FontSelector = FontField = FontChooser = ComboBox.extend({

	rndrDDMenu: function() {
		var cb = this;
		var cfg = this.cfg;
		var id = cfg.renderTo;
		this.ddm = new DropDownImgMenu({
			renderTo: id + '-ddm',
			items: cfg.items,
			width: cfg.width + 4,
			onSelect: function(val) {
				cb.ddm.hide();
				cb.fld.setValue(val);
				cb.cfg.onChange(val);
			}
		});
	}
});

var DropDownImgMenu = Class.extend({

	init: function(cfg) {

		this.defaults = {
			theme: 'light-gray',
			items: [''],
			onSelect: function() {}
		};
		this.cfg = $.extend(this.defaults, cfg);

		if ( this.cfg.renderTo ) {
			this.render();
		}

	},

	isVisible: function() {
		return $('#' + this.cfg.renderTo).is(":visible");
	},

	show: function() {
		$('#' + this.cfg.renderTo).fadeIn('fast');
	},

	hide: function() {
		$('#' + this.cfg.renderTo).fadeOut('fast');
	},

	render: function() {
		var cfg = this.cfg;
		var html = '<ul class="brm-lv-cnt">'
		for ( var i = 0; i < cfg.items.length; i++ ) {
// 			html += '<li>' + cfg.items[i] + '</li>';
			html += '<li><img alt="' + cfg.items[i][0] + '" src="' + cfg.items[i][1] + '" ></li>';
		}
		html += '</ul>';
		$('#' + cfg.renderTo).addClass('brm-dd-img-cnt').html(html);

		if ( cfg.width ) {
			$('#' + cfg.renderTo + '.brm-dd-img-cnt').css('width', cfg.width + 'px');
		}

		$('#' + cfg.renderTo + ' li').addClass('node').hover(function() {
			$(this).addClass('node-hover');
		}, function() {
			$(this).removeClass('node-hover');
		}).click(function() {
			cfg.onSelect($(this).find('img').attr('alt'));
		});
// 		$('#' + cfg.renderTo);
	}
});

var Calendar = Class.extend({

	init: function(cfg) {
		this.wDays = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'];
// 		this.wDays = ['Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб', 'Нд'];
		this.months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'Novermber', 'December'];
// 		this.months = ['Януари', 'Февруари', 'Март', 'Април', 'Май', 'Юни', 'Юли', 'Август', 'Септември', 'Октомври', 'Ноември', 'Декември'];

		this.defaults = {
			date: new Date(),
			theme: 'light-gray',
			onSelect: function() {}
		};
		this.cfg = $.extend(this.defaults, cfg);

		if ( this.cfg.renderTo ) {
			this.render();
		}

	},

	daysToSkip: function(date) {
		var month = date.getMonth();
		var year = date.getFullYear();
		//first day of month
		var firstDay = new Date(year, month, 1);
		var skipDays = firstDay.getDay();

		//normalize skipDays according bulgarian standart
		if ( skipDays == 0 ) {
			skipDays = 6;
		} else {
			skipDays--;
		}
		return skipDays
	},

	daysInMonth: function(date) {
		//get the next month
		var month = date.getMonth() + 1;
		var year = date.getYear();
		return new Date(year, month, 0).getDate();
	},

	updateDate: function() {
		var month = this.months[this.cfg.date.getMonth()];
		var year = this.cfg.date.getFullYear();
		return month + '&nbsp;' + year;
	},

	updateDays: function() {
		var j = this.daysToSkip(this.cfg.date);
		var html = '<tr>';
		for ( var i = 0; i < j; i++ ) {
			html += '<td>&nbsp;</td>';
		}

		var k = this.daysInMonth(this.cfg.date);
		var l;
		for ( var i = 0; i < k; i++ ) {
			var iDay = i + 1;
			html += '<td class="brm-cln-day">' + iDay + '</td>';

			//todo: obviously this can be improved
// 				if ( iDay == nDay ) {
// 					elmDay.className = 'day-selected';
// 					this.selectedDay = elmDay;
// 				}

// 				this.initDay(elmDay);

			j++;
			if ( j % 7 == 0 ) {
				html += '</tr>';
				l = k - i - 1;
				if ( l > 0 ) {
					html += '<tr>';
				}
			}
		}

		if ( l > 0 ) {
			for ( var i = 0; i < 7 - l; i++ ) {
				html += '<td>&nbsp;</td>';
			}
			html += '</tr>';
		}

		return html;
	},

	selectDay: function(oldDate, newDate) {
		if ( this.daysInMonth(newDate) < oldDate.getDate() ) {
			newDate.setDate(this.daysInMonth(newDate));
		} else {
			newDate.setDate(oldDate.getDate());
		}
		return newDate;
	},

	nextYear: function(oldDate) {
		var newDate = new Date(oldDate.getFullYear(), oldDate.getMonth() + 12, 1);
		return this.selectDay(oldDate, newDate);
	},

	prevYear: function(oldDate) {
		var newDate = new Date(oldDate.getFullYear(), oldDate.getMonth() - 12, 1);
		return this.selectDay(oldDate, newDate);
	},

	prevMonth: function(oldDate) {
		var newDate = new Date(oldDate.getFullYear(), oldDate.getMonth() - 1, 1);
		return this.selectDay(oldDate, newDate);
	},

	nextMonth: function(oldDate) {
		var newDate = new Date(oldDate.getFullYear(), oldDate.getMonth() + 1, 1);
		return this.selectDay(oldDate, newDate);
	},

	attachDaysHandlers: function() {
		var cln = this;
		var cfg = this.cfg;
		var id = cfg.renderTo;
		$('#' + id + ' .brm-cln-day').hover(function() {
			$(this).addClass('brm-cln-day-hover');
		}, function() {
			$(this).removeClass('brm-cln-day-hover');
		}).click(function() {
			var day = parseInt($(this).html());
			cln.cfg.date.setDate(day);
			cfg.onSelect(cln.cfg.date);
		});
	},

	setDate: function(date) {
		this.cfg.date = date;
// 		this.update();
	},

	update: function() {
		var id = this.cfg.renderTo;
		$('#' + id + ' tbody').html(this.updateDays());
		this.attachDaysHandlers(id);
		$('#' + id + ' .brm-cln-date').html(this.updateDate());
	},

	render: function() {
		var cln = this;
		var id = cln.cfg.renderTo;

		var html = '<div class="brm-cln"><table cellspacing="2" cellpadding="2" border="0"><thead>';
		html += '<tr><th id="' + id + '-btn-prev-year" class="brm-cln-btn">«</th>';
		html += '<th id="' + id + '-btn-prev-month" class="brm-cln-btn">‹</th>';
		html += '<th class="brm-cln-date" colspan="3">' + this.updateDate() + '</th>';
		html += '<th id="' + id + '-btn-next-month" class="brm-cln-btn">›</th>';
		html += '<th id="' + id + '-btn-next-year" class="brm-cln-btn">»</th></tr>';
		html += '<tr>'
		for ( var i = 0; i < this.wDays.length; i++ ) {
			var cls = 'brm-cln-wday';
			if ( i > 4 ) {
				cls += ' weekend';
			}
			html += '<td class="' + cls + '">' + this.wDays[i] + '</td>';
		}
		html += '</tr><tr><td colspan="7" style="border-top:1px solid #ddd;line-height:4px !important;">&nbsp;</td></tr>';
		html += '</thead><tbody>';
		html += this.updateDays();
		html += '</tbody></table></div>';

		$('#' + id).html(html);
		$('#' + id + ' .brm-cln-btn').hover(function() {
			$(this).addClass('brm-cln-btn-hover');
		}, function() {
			$(this).removeClass('brm-cln-btn-hover');
		});
		$('#' + id + '-btn-prev-year').click(function(e) {
			e.stopPropagation();
			cln.cfg.date = cln.prevYear(cln.cfg.date);
			cln.update();
		});
		$('#' + id + '-btn-prev-month').click(function(e) {
			e.stopPropagation();
			cln.cfg.date = cln.prevMonth(cln.cfg.date);
			cln.update();
		});
		$('#' + id + '-btn-next-month').click(function(e) {
			e.stopPropagation();
			cln.cfg.date = cln.nextMonth(cln.cfg.date);
			cln.update();
		});
		$('#' + id + '-btn-next-year').click(function(e) {
			e.stopPropagation();
			cln.cfg.date = cln.nextYear(cln.cfg.date);
			cln.update();
		});
		this.attachDaysHandlers(id);
	}
});

var DateField = DatePicker = Class.extend({

	init: function(cfg) {

		this.defaults = {
			value: '',
			theme: 'light-gray',
			width: 120,
			name: '',
			onFocus: function() {},
			onSelect: function() {},
			onChange: function() {}
		};
		this.cfg = $.extend(this.defaults, cfg);

		if ( this.cfg.renderTo ) {
			this.render();
		}

	},

	getValue: function() {
		return this.fld.getValue();
	},

	setValue: function(val) {
		this.fld.setValue(val);
	},

	rndrDDPanel: function() {
		var dfld = this;
		var cfg = this.cfg;
		var id = cfg.renderTo;
		this.ddp = new DDPanel({
			renderTo: id + '-ddm',
			width: 257
		});
		this.cln = new Calendar({
			renderTo: id + '-ddm',
			onSelect: function(date) {
				dfld.ddp.hide();
				var dateVal = date.getDate() + '/' + (date.getMonth() + 1) + '/' + date.getFullYear();
				dfld.setValue(dateVal);
				dfld.cfg.onChange(date);
			}
		});
	},

	render: function() {
		var cb = this;
		var cfg = this.cfg;
		var id = cfg.renderTo;
		var html = '<table class="cb-tbl" cellspacing="0" cellpadding="0" border="0"><tbody><tr><td>';
		html += '<span id="' + id + '-fld"></span></td><td><span id="' + id + '-btn"><img src="cln-icon.gif"></span>';
		html += '</td></tr><tr><td colspan="2"><div id="' + id +'-ddm">';
		html += '</div></td></tr></tbody></table>';

		$('#' + id).html(html);

		this.fld = new Field({
			renderTo: id + '-fld',
			pos: 'l',
			value: cfg.value,
			readOnly: cfg.readOnly,
			width: cfg.width - 22,
			theme: cfg.theme,
			name: cfg.name,
			onFocus: function() {
				cb.ddp.hide();
			}
		});

		this.btn = new Button({
			renderTo: id + '-btn',
			size: 'icn',
			transform: true,
			pos: 'r',
			theme: cfg.theme,
			handler: function() {
				if ( cb.ddp.isVisible() ) {
					cb.ddp.hide();
				} else {
					ddp = cb.ddp;
					cb.ddp.show();
				}
			}
		});

		this.rndrDDPanel();
	},

	validate: function() {
		return true;
// 		var cfg = this.cfg;
// 		var id = cfg.renderTo;
//
// 		if ( !this.getValue() && !cfg.allowBlank ) {
// 			$('#' + id + '-fld').addClass('brm-fld-err');
// 			$('#' + id + '-msg').text('Това поле е задъкжително!');
// 			return false;
// 		} else {
// 			return true;
// 		}
	}
});

var DDPanel = Class.extend({

	init: function(cfg) {

		this.defaults = {
			theme: 'light-gray',
			height: 200,
			shadow: true,
			borderRadius: 5,
			onHide: function() {},
			onShow: function() {}
		};
		this.cfg = $.extend(this.defaults, cfg);

		if ( this.cfg.renderTo ) {
			this.render();
		}

	},

	isVisible: function() {
		return $('#' + this.cfg.renderTo).is(":visible");
	},

	show: function() {
		$('#' + this.cfg.renderTo).fadeIn('fast');
		this.cfg.onShow();
	},

	hide: function() {
		$('#' + this.cfg.renderTo).fadeOut('fast');
		this.cfg.onHide();
	},

	render: function() {
		var cfg = this.cfg;
		var id = cfg.renderTo;
		$('#' + id).addClass('brm-ddp').css({'border-radius': cfg.borderRadius});
		if ( cfg.shadow ) {
			$('#' + id).addClass('brm-' + cfg.theme + '-shdw');
		}
	}

});

var DropDownMenu = Class.extend({

	init: function(cfg) {

		this.defaults = {
			theme: 'light-gray',
			items: [''],
			onSelect: function() {}
		};
		this.cfg = $.extend(this.defaults, cfg);

		if ( this.cfg.renderTo ) {
			this.render();
		}

	},

	isVisible: function() {
		return $('#' + this.cfg.renderTo).is(":visible");
	},

	show: function() {
		$('#' + this.cfg.renderTo).fadeIn('fast');
	},

	hide: function() {
		$('#' + this.cfg.renderTo).fadeOut('fast');
	},

	render: function() {
		var cfg = this.cfg;
		var html = '<ul class="brm-lv-cnt">'
		for ( var i = 0; i < cfg.items.length; i++ ) {
			html += '<li>' + cfg.items[i] + '</li>';
		}
		html += '</ul>';
		$('#' + cfg.renderTo).addClass('brm-dd-cnt').html(html);

		if ( cfg.width ) {
			$('#' + cfg.renderTo + '.brm-dd-cnt').css('width', cfg.width + 'px');
		}

		$('#' + cfg.renderTo + ' li').addClass('node').hover(function() {
			$(this).addClass('node-hover');
		}, function() {
			$(this).removeClass('node-hover');
		}).click(function() {
			cfg.onSelect($(this).html());
		});
// 		$('#' + cfg.renderTo)
	}

});

var Validator = Class.extend({

	init: function(cfg) {

		this.defaults = {
			items: []
		};
		this.cfg = $.extend(this.defaults, cfg);

	},

	validate: function() {
		var isValid = true;
		for ( var i = 0; i < this.cfg.items.length; i++ ) {
			var cntr = this.cfg.items[i];
			if ( !cntr.validate() ) {
				isValid = false;
			}
		}
		return isValid;
	}

});

// var ToggleButton = Button.extend({
// 	toggle: function(state) {
// 		if ( state === undefined ) {
// 			this.getState();
// 		}
// 	}
// });

// var SelectButton = Class.extend({
//
// 	init: function(cfg) {
//
// 		this.defaults = {
// 			theme: 'light-gray',
// 			items: [''],
// 			width: 70,
// 			emptyText: '',
// 			onSelect: function() {}
// 		};
// 		this.cfg = $.extend(this.defaults, cfg);
//
// 		if ( this.cfg.renderTo ) {
// 			this.render();
// 		}
//
// 	},
//
// 	render: function() {
// 		var sBtn = this;
// 		var cfg = this.cfg;
// 		var id = cfg.renderTo;
// 		var html = '<table cellspacing="0" cellpadding="0" border="0"><tbody><tr><td>';
// 		html += '<span id="' + id + '-btn1">' + cfg.emptyText + '</span><span id="' + id + '-btn2"><img src="down-arrow.gif"></span>';
// 		html += '</td></tr><tr><td><div id="' + id +'-ddm">';
// 		html += '</ul></div></td></tr></tbody></table>'
//
// 		$('#' + id).html(html);
//
// 		this.btn1 = new ToggleButton({
// 			renderTo: id + '-btn1',
// 			size: 'small',
// 			width: cfg.width - 20,
// 			pos: 'l',
// 			theme: cfg.theme,
// 			handler: function() {
// 				if ( sBtn.ddm.isVisible() ) {
// 					sBtn.ddm.hide();
// 				} else {
// 					sBtn.ddm.show();
// 				}
// 			}
// 		});
//
// 		this.btn2 = new ToggleButton({
// 			renderTo: id + '-btn2',
// 			size: 'icon',
// 			pos: 'r',
// 			theme: cfg.theme,
// 			handler: function() {
// 				if ( sBtn.ddm.isVisible() ) {
// 					sBtn.ddm.hide();
// 				} else {
// 					sBtn.ddm.show();
// 				}
// 			}
// 		});
//
// 		this.ddm = new DropDownMenu({
// 			renderTo:  id + '-ddm',
// 			items: cfg.items,
// 			onSelect: function(val) {
// 				sBtn.ddm.hide();
// 				sBtn.btn1.setText(val);
// 			}
// 		});
// 	}
//
// });
