var Controls = {
	Select:(function(){
		var escapeHTML = function (str){
			var div = document.createElement('div');
			var text = document.createTextNode(str);
			div.appendChild(text);
			return div.innerHTML;
		}; 
		
		var uid = 0;
		var __construct = function(selObj){
			var me = this;
			var myUid = uid++;
			var realValue = null;	//uid вибраного елементу
			var elements = [];		//масив елементів [[description1, val1], [description2, val2], ...]
			var counter = 1;		//кількість елементів без чіткого задання value
			me.nochange = false;
			me.noselect = false;
			
			// ініціалізація
			var ob = $((typeof(selObj)=="string")? "#"+selObj:selObj);
			var obValue 	= ob.find(".selected");
			var obValueInput = obValue.find('input[type="text"]');
			var obContainer = ob.find(".container");
			
			obValueInput.blur(function(e){
				var a = function(){obContainer.removeClass("shown");};
				setTimeout(a,300);
			});
			
			me.assetInputKeypress = function(fn){
				obValueInput.keypress(fn);
			}
			
			var setValue = function(newRealValue){
				var oldRealValue = realValue;
				realValue = newRealValue;
				obValueInput.attr("value",elements[realValue][0]);
				if (oldRealValue==realValue) {
					if (!me.noselect) setTimeout(function (){me.onselect(me);},0);
				} else {
					if (!me.noselect) setTimeout(function (){me.onselect(me);},0);
					if (!me.nochange) setTimeout(function (){me.onchange(me);},0);
				}
			};
			
			var importElements = function(){
				var texts = [];
				var values = [];
				var textsNoValue = [];
				
				obContainer.find(".element").each(function(){
					var ob = $(this);
					var val = ob.attr("value");
					if (val===undefined) textsNoValue.push(ob.html());
					else {
						texts.push(ob.html());
						values.push(val);
					}
					ob.remove();
				});
				
				me.add(texts, values);
				me.add(textsNoValue);
			};
			
			var obElementClick = function(){
				setValue($(this).attr("valuid"));
				obValue.click();
			};
			
			var filter = function(uidList){
				var selector = "[valuid='"+uidList.join("'], [valuid='")+"']";
				var obElements = obContainer.find(".element");
				obElements.filter(selector).css("display", "block");
				obElements.not(selector).css("display","none");
				obContainer.addClass("filtered");
			};
			
			var noFilter = function(){
				obContainer.find(".element").css("display","block");
				obContainer.removeClass("filtered");
			};
			
			obValue.click(function(){
				obContainer.toggleClass("shown");
				if (obContainer.hasClass("shown")) {
					obValueInput.css("display","block");
					obValueInput.focus();
				} else {
					obValueInput.text(elements[realValue][0]);
					//obValueInput.blur();
				}
				setTimeout(function (){me.onclick(me);},0);
			});
			
			me.uid = function(){
				return myUid;
			};
			me.value = function(){
				if (!(arguments[0]===undefined)) {
					var a=me.findByValue(arguments[0]);
					if (a[0]===undefined) return false;
					else setValue(a[0]);
				}
				return elements[realValue][1];
			};
			
			// Пошук
			me.findByValue = function(value){
				var res = [];
				var check = (value instanceof RegExp)? function(a,b){return b.test(a);}:function(a, b){return a==b;};
				for(var i=0; i<elements.length; i++){
					if (check(elements[i][1],value))res.push(i);
				}
				return res;
			};

			me.findByText = function(text){
				var res = [];
				var check = (text instanceof RegExp)? function(a,b){return b.test(a);}:function(a, b){return a==b;};
				for(var i=0; i<elements.length; i++){
					if (check(elements[i][0],text))res.push(i);
				}
				return res;
			};
			
			/////////////// EVENT HANDLERS /////
			me.add = function(inpTexts/*[, inpValues]*/){
				var texts = (typeof(arguments[0])=="string")? [arguments[0]]:arguments[0];
				var values = (arguments[1])? (typeof(arguments[1])=="string")? [arguments[1]]:arguments[1]:[];
				var currVal = "";
				var el_num = 0;
				for (var i=0; i<texts.length; i++){
					currVal = (typeof(values[i])=="undefined")? counter++:values[i];
					el_num = elements.push([texts[i], currVal]);
					obContainer.append($('<div class="element">'+escapeHTML(texts[i])+'</div>').attr("valuid", el_num-1).click(obElementClick));
					if (realValue===null) setValue(el_num-1);
				}
				setTimeout(function (){me.onadd(me);},0);
			};
			
			me.remove = function(index){
				elements.splice(index,1);
				obContainer.find("div[valuid='"+index+"']").remove();
				obContainer.find("div[valuid]").each(function(){
					var me=$(this);
					var attr=me.attr("valuid");
					if (attr>index) me.attr("valuid", attr-1)
				});
				if (realValue==index && typeof(elements[0])!="undefined")setValue(0);
				setTimeout(function (){me.onremove(me);},0);
			}
			me.click = function(){
				obValue.click();
			};
			////////////////////////////////////
			
			////////////// EVENTS //////////////
			me.onadd = function(event){return;};
			me.onremove = function(event){return;};
			me.onclick = function(event){return};
			me.onchange = function(event){return};
			me.onselect = function(event){return};
			////////////////////////////////////
			
			// Фінальна ініціалізація
			me.elements = elements;
			importElements();
		}
		
		return __construct;
	})()
} 

/////////////////////////////////////////////////////////////////////////////////////

var NewsCalendar = (function(){
    var curMonth = undefined;
    var curYear = undefined;
    var today = new Date();
    var ctrl = function(el, val, par){
        var instance = el;
        var parent = par;
        
        var setValue = function(val){
        	//instance.nochange = true;
        	instance.noselect = true;
            instance.value(val);
        	instance.noselect = false;
        	//instance.nochange = false;
        };
        
        this.toString = function(){
        	return instance.value();
        }
        
        this.setValue = setValue;
        setValue(parseInt(val));            
        instance.onselect = parent.change;
    };
    
    var fillYears = function(ob, first){
        //ob.nochange = true;
        ob.noselect = true;
    	var data = [];
    	ob.name = "y";
    	for(var i=first;i<=today.getFullYear();i++) data.push(i);
    	ob.add(data,data);
        ob.noselect = false;
        //ob.nochange = false;
    };
    
    var fillMonths = function(ob){
        //ob.nochange = true;
        ob.noselect = true;
        ob.name = "m";
    	ob.add( ["Січень","Лютий","Березень","Квітень","Травень","Червень","Липень","Серпень","Вересень","Жовтень","Листопад","Грудень"],
    			[1,2,3,4,5,6,7,8,9,10,11,12]);
        ob.noselect = false;
        //ob.nochange = false;
    };
    
    var curr_date = function(){
    	return [today.getFullYear(),today.getMonth()+1];
    }
    
    var __construct = function (monthSelect, yearSelect, yStart){
        var yearSelectObj = yearSelect;
        var monthSelectObj = monthSelect;
        fillYears(yearSelectObj,yStart);
        fillMonths(monthSelectObj);
        
        var web_address = location.href.split("~");
        this.change = function(element){
        	if (element.name=="y") monthSelectObj.click();
        	else location.href = web_address[0]+"~"+curYear+"/"+curMonth;
        }
        var param = (web_address[1]===undefined)? curr_date():web_address[1].split("/");
        curYear = new ctrl(yearSelectObj,param[0],this);        
        curMonth = new ctrl(monthSelectObj,param[1]||1,this);
    };
    
    return __construct;
})();


