var Albumka = {};

//Defines the top level Class
function Class() {}
Class.prototype.construct = function() {};
Class.extend = function(def) {
    var classDef = function() {
        if (arguments[0] !== Class) { this.construct.apply(this, arguments); }
    };
    
    var proto = new this(Class);
    var superClass = this.prototype;
    
    for (var n in def) {
        var item = def[n];                        
        if (item instanceof Function) item.$ = superClass;
        proto[n] = item;
    }

    classDef.prototype = proto;
    
    //Give this new class the same static extend method    
    classDef.extend = this.extend;        
    return classDef;
};

/**
 * create method reference
 * @param {Object} object
 * @param {Object} methodName
 */
function $R(object, methodName) {
  return function () {
    return object[methodName].apply(object, arguments);
  };
}

// fix IE6 background images bug
try {document.execCommand("BackgroundImageCache", false, true);} catch(e){}

// application
Albumka.Application = Class.extend({
	construct: function(options) {
		this.options = {
			overlays: []
		};
		jQuery.extend(this.options, options);
		this._overlays = [];
		this.init();
	},
	
	/**
	 * Инициализация объекта. Надо переопределить в потомках. 
	 */
	init: function() {
        // подсвека пунктов меню
        $('.absolute .menu ul li').hover(function(){
            if (!$(this).hasClass('hover')) 
                $(this).addClass('hover2');
        }, function(){
            if (!$(this).hasClass('hover')) 
                $(this).removeClass('hover2');
        });
	},
	
	/**
	 * Функция убирает заданные в конструкторе оверлеи (разные блоки div)
	 */
	hideOverlays: function() {
		for (var i = 0; i < this.options.overlays.length; i++)
		{
			var selector = this.options.overlays[i];

			if (this._overlays[selector])
				this.removeOverlay(selector);
		}
	},
	
	addOverlay: function(selector) {
		var width = $(selector).width();
		var height = $(selector).height();
		this._overlays[selector] = $('<div><img src="/images/loading.gif"></div>').appendTo(selector).css({
					borderWidth: 0, margin: 0, padding: 0,
					position: 'absolute', top: 0, left: 0,
					width: width,
					height: height,
					background: '#fff',
					opacity: 0.6,
					zIndex: 100
		});
	},
	
	removeOverlay: function(selector) {
		if (this._overlays[selector]) {
			$(this._overlays[selector]).remove();
			this._overlays[selector] = null;
		}
	}
	
});

/**
 * Страница выбора рамки для фото
 */
Albumka.SelectBorder = Albumka.Application.extend({
	init: function() {
		this.init.$.init.call(this); // вызов предка
		$('.border-radio').bind('click', {self: this}, this.preview);
		this._loading = false;
	},
	
	preview: function(event) {
		var self = event.data.self;
		if (self._loading)
			return;
		
		self.addOverlay('#preview');
		self._loading = true;
		$.ajax({
			url: self.options.url,
			data: {
				idBorder: this.value
			},
			dataType: 'html',
			success: function(data, status) {
				self.removeOverlay('#preview');
				self._loading = false;
				$('#preview').html(data);
			},
			error: function(data, status, e) {
				self.removeOverlay('#preview');
				self._loading = false;
				$('#preview').html('<p>Ошибка. Не удалось загрузить рамку.</p>');
			}
		});
	}
});

/**
 * Страница просмотра альбома
 */
Albumka.View = Albumka.Application.extend({
	init: function() {
		this.init.$.init.call(this);
		
		$('#social_links textarea, .bar_links textarea').click(function(e) {
			this.select();
		});
		
		$('#social_links #album_link').toggle(function(){ $('#social_links .social_links').show();},
				function() { $('#social_links .social_links').hide();}
		);

		$('#bar_links').toggle(function(){ $('.bar_links').show();},
				function() { $('.bar_links').hide();}
		);
		
		$('#social_links #reset_link').click($R(this, 'doResetLink'));
		
        $('#photo-comment').editable(this.options.commentUrl, {
            cancel: 'Отменить',
            submit: 'Сохранить',
            tooltip: 'Кликните на текст, чтобы его отредактировать',
            width: 330,
            indicator: 'Сохранение...'
        });
	},
	
	doResetLink: function() {

		if (!confirm('Сбросив частную ссылку, Вы закроете доступ к альбому для всех, у кого была старая ссылка. Вы уверены?'))
			return;
		
		$('#social_links #reset_link').hide();
		var msg = $('#social_links #reset_link').parent().append('<p>Сбрасываем ссылку ...</p>');
		var self = this;
		
		$.ajax({
			url: self.options.resetUrl,
			dataType: 'json',
			success: function(data, status) {
				if (!data.hasError) {
					// обновим ссылки
					$('#directlink').val(data.links.directlink);
					$('#bbcodelink').val(data.links.bbcode);
					$('#htmllink').val(data.links.html);
					
					$(msg).html('<p>Ссылка успешно сброшена. Сгенерированы новые ссылки.</p>');
				} else {
					$(msg).html('<p>' + data.message + '</p>');
				}
			},
			error: function(data, status, e) {
				$(msg).html('<p>Ошибка связи с сервером.</p>');
			}
		});
	}	
});

Albumka.RostVes = Albumka.Application.extend({
	init: function() {
		this.init.$.init.call(this);
		var self = this;
		
		this.bindCalendar('input.date');
		
		$('form tr.line').each(function(){
				if (self.isCanBeDeleted(this)) {
					self.bindButtonDelete(this);
				}
		});
		
		$('form tr.line:last').after('<tr><td colspan="2"><span id="button_add" class="jslink">Добавить новое поле</span></td></tr>');
		
		$('#button_add').click(function(e){
				var nextId = self.getNextId('form tr.line:last');
				
				// удалим календарь, а то клонирование глючит как-то
				$('input.date').datepick('destroy');
				
				$('form tr.line:last').after($('form tr.line:first').clone());
				
				tr_last = $('form tr.line:last');
				
				$(tr_last).find('input.date').attr('name', 'rostves[date_' + nextId + ']').attr('id', 'rosteves-date_' + nextId).val('');
				$(tr_last).find('input:last').attr('name', 'rostves[value_' + nextId + ']').attr('id', 'rostves-value_' + nextId).val('');
				$(tr_last).find('ul.errors').remove();
				self.bindButtonDelete(tr_last);
				self.bindCalendar('input.date');
				e.preventDefault();
		});
		
   },
   
   bindCalendar: function(selector) {
		$(selector).datepick({showOn: 'button', buttonImageOnly: true, buttonImage: '/js/calendar/calendar.gif', dateFormat: 'dd.mm.yy'});
		$(selector).datepick($.datepick.regional['ru']);
		
   },
   
   bindButtonDelete: function(element) {
	   if (this.isCanBeDeleted(element)) {
		   $(element).find('td:last input').after('<span class="jslink">удалить</span>');
		   $(element).find('.jslink').bind('click', {self: this}, this.doRemoveLine);
	   }
   },
   
   doRemoveLine: function(e) {
	   var self = e.data.self;
	   $(this).parent().parent().remove();
   },
   
   getId: function(tr_element) {
	   var id = $(tr_element).find('input.date').attr('id');
	   var params = /^(.+?)_(\d+)$/.exec(id);
	   if (!params)
		   return null;
	   
	   return num_id = parseInt(params[2]);
   },
   
   getNextId: function(tr_element) {
	   return this.getId(tr_element) + 1;
   },
   
   isCanBeDeleted: function(tr_element) {
	   if (this.getId(tr_element) < 1)
		   return false;
	   else
		   return true;
   }
});

Albumka.Invite = Albumka.Application.extend({
	init: function() {
		this.init.$.init.call(this);
		var self = this;
		this._addButton = false;
		
		$('form tr.line').each(function(){
				if (self.isCanBeDeleted(this)) {
					self.bindButtonDelete(this);
				}
		});
		
		this.createAddButton();
		this.bindAddButton();
		
   },
   
   bindAddButton: function() {
	    var self = this;
		$('#button_add').click(function(e){
				var length = $('form tr.line').get().length; 
				if (length < self.options.max) {
					var nextId = self.getNextId('form tr.line:last');
					
					$('form tr.line:last').after($('form tr.line:first').clone());
					
					tr_last = $('form tr.line:last');
					
					$(tr_last).find('input:first').attr('name', 'friends[name_' + nextId + ']').attr('id', 'friends-name_' + nextId).val('');
					$(tr_last).find('input:last').attr('name', 'friends[email_' + nextId + ']').attr('id', 'friends-email_' + nextId).val('');
					$(tr_last).find('ul.errors').remove();
					self.bindButtonDelete(tr_last);
					
					if ((length + 1) >= self.options.max) {
						self.removeAddButton();
					}
				}
				e.preventDefault();
		});
   },
   
   createAddButton: function() {
		$('form tr.line:last').after('<tr><td colspan="2"><span id="button_add" class="jslink">Добавить новое поле</span></td></tr>');
		this._addButton = true;
   },
   
   removeAddButton: function() {
		$('#button_add').parent().parent().remove();
		this._addButton = false;
   },
   
   bindButtonDelete: function(element) {
	   if (this.isCanBeDeleted(element)) {
		   $(element).find('td:last input').after('<span class="jslink">удалить</span>');
		   $(element).find('.jslink').bind('click', {self: this}, this.doRemoveLine);
	   }
   },
   
   doRemoveLine: function(e) {
	   var self = e.data.self;
	   $(this).parent().parent().remove();
	   
	   var length = $('form tr.line').get().length;
	   if (!self._addButton && length < self.options.max) {
		   self.createAddButton();
		   self.bindAddButton();
	   }
   },
   
   getId: function(tr_element) {
	   var id = $(tr_element).find('input:first').attr('id');
	   var params = /^(.+?)_(\d+)$/.exec(id);
	   if (!params)
		   return null;
	   
	   return num_id = parseInt(params[2]);
   },
   
   getNextId: function(tr_element) {
	   return this.getId(tr_element) + 1;
   },
   
   isCanBeDeleted: function(tr_element) {
	   if (this.getId(tr_element) < 1)
		   return false;
	   else
		   return true;
   }
});


Albumka.Zubki = Albumka.Application.extend({
	init: function() {
		this.init.$.init.call(this);
		this.bindCalendar('input.date');
   },
   
   bindCalendar: function(selector) {
		$(selector).datepick({showOn: 'button', buttonImageOnly: true, buttonImage: '/js/calendar/calendar.gif', dateFormat: 'dd.mm.yy'});
		$(selector).datepick($.datepick.regional['ru']);
		
   }
});


Albumka.Upload = Albumka.Application.extend({
	init: function() {
		this.init.$.init.call(this);
		$('form.form').submit(function(e){
			$('#submit').before('<img src="/images/loading.gif" style="vertical-align: middle"></img> Идет загрузка. Подождите пожалуйста ...');
			$('#submit').remove();
		});
    }
});




///////////////////////////////// jedit
(function($){$.fn.editable=function(target,options){if('disable'==target){$(this).data('disabled.editable',true);return;}
if('enable'==target){$(this).data('disabled.editable',false);return;}
if('destroy'==target){$(this).unbind($(this).data('event.editable')).removeData('disabled.editable').removeData('event.editable');return;}
var settings=$.extend({},$.fn.editable.defaults,{target:target},options);var plugin=$.editable.types[settings.type].plugin||function(){};var submit=$.editable.types[settings.type].submit||function(){};var buttons=$.editable.types[settings.type].buttons||$.editable.types['defaults'].buttons;var content=$.editable.types[settings.type].content||$.editable.types['defaults'].content;var element=$.editable.types[settings.type].element||$.editable.types['defaults'].element;var reset=$.editable.types[settings.type].reset||$.editable.types['defaults'].reset;var callback=settings.callback||function(){};var onedit=settings.onedit||function(){};var onsubmit=settings.onsubmit||function(){};var onreset=settings.onreset||function(){};var onerror=settings.onerror||reset;if(settings.tooltip){$(this).attr('title',settings.tooltip);}
settings.autowidth='auto'==settings.width;settings.autoheight='auto'==settings.height;return this.each(function(){var self=this;var savedwidth=$(self).width();var savedheight=$(self).height();$(this).data('event.editable',settings.event);if(!$.trim($(this).html())){$(this).html(settings.placeholder);}
$(this).bind(settings.event,function(e){if(true===$(this).data('disabled.editable')){return;}
if(self.editing){return;}
if(false===onedit.apply(this,[settings,self])){return;}
e.preventDefault();e.stopPropagation();if(settings.tooltip){$(self).removeAttr('title');}
if(0==$(self).width()){settings.width=savedwidth;settings.height=savedheight;}else{if(settings.width!='none'){settings.width=settings.autowidth?$(self).width():settings.width;}
if(settings.height!='none'){settings.height=settings.autoheight?$(self).height():settings.height;}}
if($(this).html().toLowerCase().replace(/(;|")/g,'')==settings.placeholder.toLowerCase().replace(/(;|")/g,'')){$(this).html('');}
self.editing=true;self.revert=$(self).html();$(self).html('');var form=$('<form />');if(settings.cssclass){if('inherit'==settings.cssclass){form.attr('class',$(self).attr('class'));}else{form.attr('class',settings.cssclass);}}
if(settings.style){if('inherit'==settings.style){form.attr('style',$(self).attr('style'));form.css('display',$(self).css('display'));}else{form.attr('style',settings.style);}}
var input=element.apply(form,[settings,self]);var input_content;if(settings.loadurl){var t=setTimeout(function(){input.disabled=true;content.apply(form,[settings.loadtext,settings,self]);},100);var loaddata={};loaddata[settings.id]=self.id;if($.isFunction(settings.loaddata)){$.extend(loaddata,settings.loaddata.apply(self,[self.revert,settings]));}else{$.extend(loaddata,settings.loaddata);}
$.ajax({type:settings.loadtype,url:settings.loadurl,data:loaddata,async:false,success:function(result){window.clearTimeout(t);input_content=result;input.disabled=false;}});}else if(settings.data){input_content=settings.data;if($.isFunction(settings.data)){input_content=settings.data.apply(self,[self.revert,settings]);}}else{input_content=self.revert;}
content.apply(form,[input_content,settings,self]);input.attr('name',settings.name);buttons.apply(form,[settings,self]);$(self).append(form);plugin.apply(form,[settings,self]);$(':input:visible:enabled:first',form).focus();if(settings.select){input.select();}
input.keydown(function(e){if(e.keyCode==27){e.preventDefault();reset.apply(form,[settings,self]);}});var t;if('cancel'==settings.onblur){input.blur(function(e){t=setTimeout(function(){reset.apply(form,[settings,self]);},500);});}else if('submit'==settings.onblur){input.blur(function(e){t=setTimeout(function(){form.submit();},200);});}else if($.isFunction(settings.onblur)){input.blur(function(e){settings.onblur.apply(self,[input.val(),settings]);});}else{input.blur(function(e){});}
form.submit(function(e){if(t){clearTimeout(t);}
e.preventDefault();if(false!==onsubmit.apply(form,[settings,self])){if(false!==submit.apply(form,[settings,self])){if($.isFunction(settings.target)){var str=settings.target.apply(self,[input.val(),settings]);$(self).html(str);self.editing=false;callback.apply(self,[self.innerHTML,settings]);if(!$.trim($(self).html())){$(self).html(settings.placeholder);}}else{var submitdata={};submitdata[settings.name]=input.val();submitdata[settings.id]=self.id;if($.isFunction(settings.submitdata)){$.extend(submitdata,settings.submitdata.apply(self,[self.revert,settings]));}else{$.extend(submitdata,settings.submitdata);}
if('PUT'==settings.method){submitdata['_method']='put';}
$(self).html(settings.indicator);var ajaxoptions={type:'POST',data:submitdata,dataType:'html',url:settings.target,success:function(result,status){if(ajaxoptions.dataType=='html'){$(self).html(result);}
self.editing=false;callback.apply(self,[result,settings]);if(!$.trim($(self).html())){$(self).html(settings.placeholder);}},error:function(xhr,status,error){onerror.apply(form,[settings,self,xhr]);}};$.extend(ajaxoptions,settings.ajaxoptions);$.ajax(ajaxoptions);}}}
$(self).attr('title',settings.tooltip);return false;});});this.reset=function(form){if(this.editing){if(false!==onreset.apply(form,[settings,self])){$(self).html(self.revert);self.editing=false;if(!$.trim($(self).html())){$(self).html(settings.placeholder);}
if(settings.tooltip){$(self).attr('title',settings.tooltip);}}}};});};$.editable={types:{defaults:{element:function(settings,original){var input=$('<input type="hidden"></input>');$(this).append(input);return(input);},content:function(string,settings,original){$(':input:first',this).val(string);},reset:function(settings,original){original.reset(this);},buttons:function(settings,original){var form=this;if(settings.submit){if(settings.submit.match(/>$/)){var submit=$(settings.submit).click(function(){if(submit.attr("type")!="submit"){form.submit();}});}else{var submit=$('<button type="submit" />');submit.html(settings.submit);}
$(this).append(submit);}
if(settings.cancel){if(settings.cancel.match(/>$/)){var cancel=$(settings.cancel);}else{var cancel=$('<button type="cancel" />');cancel.html(settings.cancel);}
$(this).append(cancel);$(cancel).click(function(event){if($.isFunction($.editable.types[settings.type].reset)){var reset=$.editable.types[settings.type].reset;}else{var reset=$.editable.types['defaults'].reset;}
reset.apply(form,[settings,original]);return false;});}}},text:{element:function(settings,original){var input=$('<input />');if(settings.width!='none'){input.width(settings.width);}
if(settings.height!='none'){input.height(settings.height);}
input.attr('autocomplete','off');$(this).append(input);return(input);}},textarea:{element:function(settings,original){var textarea=$('<textarea />');if(settings.rows){textarea.attr('rows',settings.rows);}else if(settings.height!="none"){textarea.height(settings.height);}
if(settings.cols){textarea.attr('cols',settings.cols);}else if(settings.width!="none"){textarea.width(settings.width);}
$(this).append(textarea);return(textarea);}},select:{element:function(settings,original){var select=$('<select />');$(this).append(select);return(select);},content:function(data,settings,original){if(String==data.constructor){eval('var json = '+data);}else{var json=data;}
for(var key in json){if(!json.hasOwnProperty(key)){continue;}
if('selected'==key){continue;}
var option=$('<option />').val(key).append(json[key]);$('select',this).append(option);}
$('select',this).children().each(function(){if($(this).val()==json['selected']||$(this).text()==$.trim(original.revert)){$(this).attr('selected','selected');}});}}},addInputType:function(name,input){$.editable.types[name]=input;}};$.fn.editable.defaults={name:'value',id:'id',type:'text',width:'auto',height:'auto',event:'click.editable',onblur:'cancel',loadtype:'GET',loadtext:'Loading...',placeholder:'Click to edit',loaddata:{},submitdata:{},ajaxoptions:{}};})(jQuery);

