var Models = function(cc) {

    var self = this;
    var models = this;
    self.cc = cc;

    self.models_ids = {}; // key = id of model; value = position in models array;
    self.online = 0;
	self.hidden = 0;

    self.initialized = false;
    self.active = false;

    self.init = function(){
        self.initialized = true;
    }

    self.updateModelsIdsCache = function(){
        var length = self.cc.models.length;
        self.models_ids = {};
        for (var i=0;i<length;i++){
            self.models_ids[self.cc.models[i].id] = i;
        }
    }

    self.getModels = function(){
        return self.cc.models;
    }

    self.getModelsIds = function(){
        return self.models_ids;
    }

    self.getModel = function(model_id){
        var index = self.models_ids[model_id];
        return self.cc.models[index];
    }

    self.getModelByName = function(model_name){
        return Utils.findObjInArray(cc.models, 'username', model_name);
    }

    self.isOnline = function(model_id){
        return models.models_ids[model_id]!==undefined;
    }

    self.removeModel = function(){
        //
    }
}

var chatIframeShown = false;

function setContentHeight() {

	
    //chatIframeShown ? $('#er9s').hide() : $('#er9s').show();
	$('#er9s').show();
    chatIframeShown ? $('#er9s').parent().parent().css('marginTop','15px') : $('#er9s').parent().parent().css('marginTop','0px');
	
	var bdHeight  = $('.main').height();
	var hdrHeight = $('.view-options-wrapper').height();
	var ftrHeight = $('#main-wire-footer-wrapper').height();
	var cntHeight = bdHeight - hdrHeight - ftrHeight;

    if (chatIframeShown){
        var chatHeight = $('#chatIframe').height();
        var modelListHeight = $('#modelsContainer').height()-10; // + margin-top
        var modelListMinHeight = cntHeight - chatHeight - ftrHeight+16;
        if (modelListHeight<modelListMinHeight){
            $('#modelsContainer').css('height', modelListMinHeight+'px');
        }
        !$.browser.msie && $('#modelsContainer').css('min-height', modelListMinHeight+'px');
    } else {
        $('#modelsContainer').height(cntHeight - 6);
    }

    $('.main-wrapper').height(bdHeight);
	$('.main-wire-content').height(cntHeight - 6);

    $('.main-body').css({
        height: (!chatIframeShown || ie7) ? bdHeight+'px' : '99.8%'
    });

    $('#mainFrame').css({height:(bdHeight+2)+'px'});

//    debug.log('setContentHeight triggered',   ' bdHeight:'+bdHeight+
//                                                ' hdrHeight:'+hdrHeight+
//                                                ' ftrHeight:'+ftrHeight+
//                                                ' cntHeight:'+cntHeight);
}

function FilterOptions() {
	var frmHash, frmHash2;
	var $frmFilter = $('#frmFilter');
	var $frmDisplay = $('#frmDisplay');
	var $options = $('#filterOptions');
	var $display = $('#displayOptions');

	var init = function() {
		$options.bind('hide', hide);
		$display.bind('hide', hideDisplay);

		$(window).bind('resize.init', function() {
			if (!chatIframeShown) setContentHeight();
		});

        setContentHeight();

		showCriteria();
	};

	var hide = function() {
		if (frmHash == $frmFilter.serialize()) {
			$options.hide();
			return;
		}

		$options.hide();

		var optionsSave = $frmDisplay.serialize() + '&' + $frmFilter.serialize();
		optionsSave += '&models_per_page=' + $('#models_per_page').val();
		Utils.ajaxPOST('/module.php?mid=models&cid=list&aid=filter_save', optionsSave, function(data) {
			showCriteria();
			CCModelList.filtersUpdated();
			return true;
		});
	};

	var hideDisplay = function() {
		if (frmHash2 == $frmDisplay.serialize()) {
			$display.hide();
			return false;
		}

		$display.hide();

		var optionsSave = $frmDisplay.serialize() + '&' + $frmFilter.serialize();
		Utils.ajaxPOST('/module.php?mid=models&cid=list&aid=filter_save', optionsSave, function() {
			return true;
		});
	};

	var showCriteria = function() {
		var filters = GetFilters();
		var criteria = [];
		var crit = '';

		if (filters.regions) {
			var regions = [];
			$('#frmFilter input.regionFilter:checked').each(function() {
				var label = $(this).attr('id');
				regions.push($('#frmFilter label[for="' + label + '"]').text());
			});
			if (regions.length) {
				criteria.push('<b>Regions hidden:</b> ' + regions.join(', '));
			}
		}

		if (filters.age) {
			criteria.push('<b>Age:</b> ' + $('#frmFilter .ageFilter :selected').text());
		}

		if (filters.nationality) {
			criteria.push('<b>Nationality:</b> ' + $('#frmFilter .nationalityFilter :selected').text());
		}

		if (filters.language) {
			criteria.push('<b>Language:</b> ' + $('#frmFilter .languageFilter :selected').text());
		}

		if (criteria.length) {
			$('#criteriaOptions').html(criteria.join(', ')).show();
		}
		else {
			$('#criteriaOptions').text('').hide();
		}

		setContentHeight();
	};

	init();

	return {
		toggleOptions: function() {
			$display.hide();
			if ($options.is(':visible')) {
				$options.trigger('hide');
			}
			else {
				frmHash = $frmFilter.serialize();
				frmHash = $frmFilter.serialize();
				$options.show();
			}

			setContentHeight();
			CCModelList.updateSorting();
		},

		toggleDisplay: function() {
			$options.hide();
			if ($display.is(':visible')) {
				$display.trigger('hide');
			}
			else {
				frmHash2 = $frmDisplay.serialize();
				$display.show();
			}

			setContentHeight();
			CCModelList.updateSorting();
		},

		close: function(display) {
			if (typeof display == 'undefined') $options.hide();
			else $display.hide();

			setContentHeight();
			CCModelList.updateSorting();
		}
	}
}

function GetFilters() {
	var filters = {};

	// REGIONS
	var regions = $('#frmFilter input.regionFilter:checked');
	if (regions.length > 0) {
		filters.regions = [];
		regions.each(function() {
			filters.regions.push($(this).val());
		});
	}

	// AGE
	var age = $('#frmFilter .ageFilter');
	if (parseInt(age.val())) {
		var diap = age.find(':selected').text().match(/(\d+)-(\d+)/);
		filters.age = {min: parseInt(diap[1]), max: parseInt(diap[2])};
	}

	// NATIONALITY
	var nat = parseInt($('#frmFilter .nationalityFilter').val());
	if (nat) {
		filters.nationality = nat;
	}

	// LANGUAGES
	var lang = parseInt($('#frmFilter .languageFilter').val());
	if (lang) {
		filters.language = lang;
	}

	// WHICH MODEL
	var which = parseInt($('#display_which').val());
	if (which == 2) {
		filters.which = which;
	}

	return filters;
}

function Sorting() {

	var criteria = {};

	return {
		getCriteria: function() {

			// SORT BY NAME/RATING
			var rating = parseInt($('#display_sort').val());
			if (rating) {
				criteria.rating = rating;
			}

			// FRIENDS FIRST
			var friends = parseInt($('#display_friends').val());
			if (friends) {
				criteria.friendsFirst = friends;
			}

			// WHICH MODEL
			var which = parseInt($('#display_which').val());
			if (which) {
				criteria.which = which;
			}

			return criteria;
		},

		sortByNameRating: function(a, b) {

			switch (criteria.rating) {

				// Raiting (higher first)
				case 1:
					var aRating = parseFloat(a.rating);
					var bRating = parseFloat(b.rating);

					aRating = isNaN(aRating) ? 0 : aRating;
					bRating = isNaN(bRating) ? 0 : bRating;

					return bRating - aRating;

				// Raiting (lower first)
				case 2:
					var aRating = parseFloat(a.rating);
					var bRating = parseFloat(b.rating);

					aRating = isNaN(aRating) ? 0 : aRating;
					bRating = isNaN(bRating) ? 0 : bRating;

					return aRating - bRating;

				// By name A-Z
				case 3:
					return a.username.toLowerCase().localeCompare(b.username.toLowerCase());

				// By name Z-A
				case 4:
					return b.username.toLowerCase().localeCompare(a.username.toLowerCase());
			}
		}
	};
};

function ModelListBuilder(settings) {

    $(window).resize(setContentHeight);

	/*** PRIVATE VARIABLES ***/
	var displayCollection = {};
	var currentPage = 1;
	var pageRange = {};
	var template = 'models_normal_tpl';
	var delta = {
		changes: 0,
        models: {}
	};
    var view_mode = 'normal';

    var deltaProcessStarted = false;
	var deltaUpdateInterval = 10000;
	var changeStatusInterval = 10000;

	var changeStatusFlag = false;
	var filters;

	var options = $.extend({
		modelsPerPage: 50
	}, settings);

	var switchTemplate = function(type) {
		switch (type) {
			case '1':
			default:
				template = 'models_normal_tpl';
				break;

			case '2':
				template = 'models_big_tpl';
				break;

			case '3':
				template = 'models_cam_tpl';
				break;
		}
	};

	switchTemplate($('#templateSelect').val());

	/***************************** INITIALIZATION ************************************/

	var init = function() {
		showLoading();
		initFilterByName();
	};

	var showLoading = function() {
		$('#modelsLoading').show();
	};

	var renderNoModelsOnline = function() {
		$('#modelsLoading').remove();
		$('#modelsContainer').html('<div id="noModels"><h2>No models online</h2></div>');
		$('#noModels').show();
	};

	var initFilterByName = function() {
		$('#search-input').prefilled().keyup(function() {
			typewatch(function() {
				filterModelsByName();
				builder();
			}, 500);
		});
	};

	var initDeltaProcess = function() {
		window.setInterval(deltaUpdateCollection, deltaUpdateInterval);
        window.setInterval(changeStatusUpdateCollection, changeStatusInterval);
	};

	var onModelsUpdate = function() {
		displayCollection = filterModels();
		filterModelsByName();
		sortModels();
		builder();

        if (cc.currentModelId) {
            $('#modelsContainer>div.selected').removeClass('selected');
            $('#model_'+cc.currentModelId).addClass('selected');
        }

        cc.modules.models.updateModelsIdsCache();

        if (!deltaProcessStarted) {
            initDeltaProcess();
            deltaProcessStarted = true;
        }

        cc.runCallbacks('onModelsUpdated');
	};

	/***************************** DELTA PROCESSING ************************************/

	var modelJoined = function(model) {
		if(!model.id) return;

        delta.models[model.id] = {
            modelInfo: model,
            action: 'join'
        };
        delta.changes++;
	};

	var modelLeft = function(id) {
        if(!id) return;

        delta.models[id] = {
            modelInfo: id,
            action: 'leave'
        };
        delta.changes++;
	};

	var deltaUpdateCollection = function() {
		if (!delta.changes) return;
        var models = delta.models;
        delta.models = {};
        delta.changes = 0;

        for (var modelId in models) {

            var model = models[modelId];
            var isOnline = cc.modules.models.isOnline(modelId);

            if ('join' == model.action && !isOnline) {
                cc.modules.models.online++;
                cc.models.push(model.modelInfo);
            }
			else if ('leave' == model.action && isOnline) {
                cc.models = Utils.removeObjFromArray(cc.models, 'id', model.modelInfo);
                cc.modules.models.online--;
            }
        }

        models = {};
		onModelsUpdate();
	};

	var modelChangeStatus = function(id, status) {
		if (template == 'models_text_tpl') {
			$('#model_' + id).attr('class', 'mdl-text mdl-' + status);
		}
		else {
			$('#model_' + id).find('h4').attr('class', 'hdr-' + status);
		}
		$('#model_' + id).find('.thb-label').replaceWith('<div class="thb-label thb-label-' + status + '"></div>');

		Utils.findObjInArray(cc.models, 'id', id).status = status;
		changeStatusFlag = true;
	};

	var changeStatusUpdateCollection = function() {
		if (!changeStatusFlag) return false;
		changeStatusFlag = false;
		onModelsUpdate();
	};

	/***************************** FILTER MODELS ***************************************/

	var filterModels = function() {

		filters = GetFilters();

		if (!hasFilters()) return {
			models: cc.models,
			hidden: cc.modules.models.hidden,
			online: cc.modules.models.online,
			ids: [],
			br: {}
		}
		var models = $.grep(cc.models, isFilter);

		return {
			models: models,
			online: cc.models.length,
			hidden: cc.models.length - models.length,
			ids: [],
			br: {}
		};
	};

	var hasFilters = function() {
		return Boolean(filters.regions || filters.age || filters.nationality || filters.language || filters.which);
	};

	var isFilter = function(el) {

		var is = true;

		if (filters.regions) {
			is = is && ($.inArray(el.region, filters.regions) == -1);
		}

		if (filters.age) {
			is = is && (el.age >= filters.age.min && el.age <= filters.age.max);
		}

		if (filters.nationality) {
			is = is && (parseInt(el.nationality) == filters.nationality);
		}

		if (filters.language) {
			is = is && ( el.language.indexOf('<' + filters.language + '>') != -1 );
		}

		if (filters.which && filters.which == 2) {
			is = is && (el.status != 'away' && el.status != 'private');
		}

		return is;
	};

	var filterModelsByName = function() {
		displayCollection.ids = [];
		var name = $('#search-input').val().trim();
		if (name && name != $('#search-input').attr('not_count')) {
			var reg = new RegExp("^.*(" + name + ").*$", "i");
			for (var i=0; i<displayCollection.models.length; i++) {
				if (reg.test(displayCollection.models[i].username)) {
					displayCollection.ids.push(parseInt(displayCollection.models[i].id));
					continue;
				}
			}
			displayCollection.hidden = cc.models.length - displayCollection.ids.length;
		}
		else {
			for (var i=0; i<displayCollection.models.length; i++) {
				displayCollection.ids.push(parseInt(displayCollection.models[i].id));
			}
			displayCollection.hidden = cc.models.length - displayCollection.models.length;
		}

		for (var i=0; i<displayCollection.models.length; i++) {
			displayCollection.br[displayCollection.models[i].id] = i;
		}
	};

	var resetFilterByName = function() {
		$('#search-input').val('').prefilled();
		CCModelList.filterModelsByName();
		currentPage = getPageById();
		builder();
	}

	/***************************** SORTING MODELS ***********************************/

	var sortModels = function() {

		var sorting = new Sorting();
		var criteria = sorting.getCriteria();

		// SORT BY RATING / NAME
		if (criteria.rating) {
			displayCollection.models.sort(sorting.sortByNameRating);
		}

		// SORT BY FRIENDS/FAVORITES (ONLY IF USER IS LOGGED IN)
		if (!CC.user.guest && criteria.friendsFirst && criteria.friendsFirst == 1) {

			if (CC.friends.accepted.length) {
				// find all fiends and favorites
				var tempFriends = [];
				for (var i=0; i<displayCollection.models.length; i++) {
					var id = parseInt(displayCollection.models[i].id);
					if (CC.modules.friends.areFriends(id) || CC.modules.favs.isFavourite(id)) {
						tempFriends.push(displayCollection.models[i]);
						Utils.removeObjFromArray(displayCollection.models, 'id', id);
					}
				}

				if (tempFriends.length) {
					// append friends to the begining
					for (var i=0; i<tempFriends.length; i++) {
						displayCollection.models.unshift(tempFriends[i]);
					}
				}
			}
		}

		// IF SORT BY 'WHICH MODEL' AND 1 (ALL) OPTION IS SELECTED
		// MOVE ALL IN-PRIVATE/AWAY MODELS TO THE END OF LIST
		if (criteria.which && criteria.which == 1) {
			// find all in-private/away models
			var tempAway = [];
			for (var i=0; i<displayCollection.models.length; i++) {
				var id = parseInt(displayCollection.models[i].id);
				if (displayCollection.models[i].status == 'away' || displayCollection.models[i].status == 'private') {
					tempAway.push(displayCollection.models[i]);
					Utils.removeObjFromArray(displayCollection.models, 'id', id);
				}
			}

			// append models to the end
			for (var i=0; i<tempAway.length; i++) {
				displayCollection.models.push(tempAway[i]);
			}
		}
	};

	/***************************** BUILD MODELS LIST ***********************************/

	var builder = function() {
		updateIndexes();
		makePageRange();
		renderSelectPage();
		renderModels();
	};

	var updateIndexes = function() {
		$('#onlineModelsCount, #onlineModelsCount2').text(cc.modules.models.online);
		$('#hiddenModelsCount, #hiddenModelsCount2').text(displayCollection.hidden);
	};

	var makePageRange = function() {
		var text_mode = view_mode == 'text';
		var total = displayCollection.online - displayCollection.hidden;
		var pagesTotal = Math.ceil(total / options.modelsPerPage);

		if (currentPage > pagesTotal) currentPage = pagesTotal;
		if (currentPage == 0) currentPage = 1;

		pageRange = GetPageRange({
			total: total,
			perPage: text_mode ? 100000 : options.modelsPerPage,
			currentPage: text_mode ? 1 : currentPage,
			linksPerPage: 10
		});
	};

	var renderSelectPage = function(currentPage) {
		$('#selectPage').replaceWith(tmpl('models_select_page_tpl', {
			pages: pageRange.pages
		}));
		$('#selectPage').val(currentPage);
	};

        var getPrevModel = function() {
            var modelId = cc.currentModelId;
            var pos = displayCollection.ids.indexOf(modelId);
            var length = displayCollection.ids.length;

            if (0 < pos && length > pos)
                prev = pos - 1;
            else if (pos===0)
                prev = length - 1;
            else
                prev = 0;

            var prevId = displayCollection.ids[prev];
            cc.startChat(prevId);
        }

        var getNextModel = function() {
            var modelId = cc.currentModelId;
            var pos = displayCollection.ids.indexOf(modelId);
            var length = displayCollection.ids.length;

            if (0 <= pos && (length-1) > pos)
                next = pos + 1;
            else if (pos === (length-1))
                next = 0;

            var nextId = displayCollection.ids[next];
            cc.startChat(nextId);
        }

        /**
         * calculates page by #model_id position
         */
        var getPageById = function(){
            var modelId = parseInt(cc.currentModelId);
            if (!modelId)
                return currentPage;

            var pos = displayCollection.ids.indexOf(modelId);

            currentPage = Math.ceil((pos+1)/options.modelsPerPage);

            return currentPage;
        }

	var renderModels = function() {

		if (pageRange.total > 0) {
			var text = '(showing models {from}-{to} of {total})'.tpl({
				from: pageRange.startOffset + 1,
				to: pageRange.endOffset,
				total: pageRange.total
			});
		}

		$('#modelsContainer').htmpl(view_mode == 'text' ? 'models_text_tpl' : template, {
			'models': displayCollection.ids,
			'start': pageRange.startOffset,
			'end': pageRange.endOffset
		});

		if (cc.currentModelId) {
			$('#model_'+cc.currentModelId)
				.addClass('selected')
				.siblings('.selected')
				.removeClass('selected');
		}

		$('#pagerQuick').htmpl('models_paging_tpl', {
			pages: pageRange
		});

		$('#pagerNumbers').htmpl('models_paging_numbers_tpl', {
			pages: pageRange
		});

		if (!displayCollection.ids.length) {
			renderNoModelsOnline();
			return false;
		}
	};

	init();

	/*** PUBLIC METHODS ***/
	return {
		update: function(list) {
			var models = (window.JSON) ? JSON.parse(list) : eval("(" + list + ")");
			cc.models = models;
			cc.modules.models.online = models.length;
			cc.modules.models.hidden = 0;
			onModelsUpdate();
		},

		modelJoined: function(model) {
			try {
				modelJoined((window.JSON) ? JSON.parse(model) : eval( "(" + model + ")" ));
			}
			catch (e) {
				modelJoined({});
			}
		},

		modelLeft: function(id) {
			modelLeft(id);
		},

        filtersUpdated: function() {
			onModelsUpdate();
		},

		model: function(id, key) {
            if (id==undefined) return false;
            var pos = displayCollection.br[id];
            if (!key) return displayCollection.models[pos];
			return displayCollection.models[pos][key];
		},

		modelChangeStatus: function(id, status) {
			modelChangeStatus(id, status);
		},

		switchView: function(type) {
			switch (type) {
				case 'normal':
					view_mode = 'normal';
					break;

				case 'text':
					view_mode = 'text';
					break;
			}

			$('.btn-disp-type').removeClass('active');
			$('#btn-disp-type-' + type).addClass('active');
			builder();
		},

		switchDisplay: function(type) {
			switchTemplate(type);
			builder();
		},

		switchModelsPerPage: function(perPage) {
			currentPage = 1;
			options.modelsPerPage = parseInt(perPage);
			builder();
		},

		updateSorting: function() {
			displayCollection = filterModels();
			filterModelsByName();
			sortModels();
			builder();
		},

        getTemplate: function(){
            return view_mode=='text' ? 'models_text_tpl' : template;
        },
        getCurPage: function(){
            return currentPage;
        },
        setCurPage: function(page){
            currentPage = page;
        },

		paging: function(page) {
			currentPage = parseInt(page);
			makePageRange();
                        renderSelectPage(currentPage);
			renderModels();
		},

        getPrevModel: getPrevModel,

        getNextModel: getNextModel,

        resetFilterByName: resetFilterByName,

        filterModelsByName: filterModelsByName
	};
}

function GetPageRange(data) {

	var total = data.total;
	var perPage = data.perPage;
	var currentPage = data.currentPage;
	var linksPerPage = data.linksPerPage;

	var startOffset = (function() {
		var offset = perPage * (currentPage - 1);
		return offset;
	})();

	var endOffset = (function() {
		var offset;
		if (startOffset > (total - perPage)) {
			offset = total;
		}
		else if (startOffset != 0) {
			offset = startOffset + perPage;
		}
		else offset = perPage;
		return offset;
	})();

	var totalPages = (function() {
		var result = 0;
		if (total != 0 && perPage != 0) {
			result = Math.ceil(total/perPage);
		}
		return (result == 0) ? 1 : result;
	})();

	var prevPage = (function() {
		if (currentPage > 1) return currentPage - 1;
		else return false;
	})();

	var nextPage = (function() {
		if (currentPage < totalPages) return currentPage + 1;
		else return false;
	})();

	var getStartNumber = function() {
		var linksPerPageHalf = linksPerPage / 2;
		if (currentPage <= linksPerPageHalf || totalPages <= linksPerPage) {
			return 1;
		}
		else if (currentPage >= (totalPages - linksPerPageHalf)) {
			return totalPages - linksPerPage + 1;
		}
		else {
			return currentPage - linksPerPageHalf;
		}
	};

	var getEndNumber = function() {
		if (totalPages < linksPerPage) {
			return totalPages;
		}
		else {
			return getStartNumber() + linksPerPage - 1;
		}
	};

	var pageNumbers = (function() {
		var numbers = [];
		for (var i = getStartNumber(); i <= getEndNumber(); i++) {
			numbers.push(i);
		}
		return numbers;
	})();

	return {
		currentPage: currentPage,
		total: total,
		totalPages: totalPages,
		startOffset: startOffset,
		endOffset: endOffset,
		prevPage: prevPage,
		nextPage: nextPage,
		pages: pageNumbers
	};
}



/*** positions menu ***/
$.fn.setPosition = function(event){

    // 1. Calculate screen properties
    var winX0 = 0;
    var winY0 = 0;
    var winX1 = $(top).width() ? $(top).width() : window.innerWidth; // maximum width
    var winY1 = $(top).height() ? $(top).height() : window.innerHeight; // maximum height

    // 2. Calculate model list absolute coordinates
    var mainMenuWidth = $(top.mainMenu).width();
    var headerHeight = $(top.header).height();
    var footerHeight = $(top.footer).height();
    var mainFrameHeight = $(window).height() ? $(window).height() : window.innerHeight;
    var mlX0 = mainMenuWidth; // start of models list frame
    var mlX1 = winX1; // end of models list frame
    var mlY0 = headerHeight;
    var mlY1 = mlY0 + mainFrameHeight;

    // 3. calculate deltas for X and Y coordinates between main window and models frame
    var deltaX = mlX0 - winX0;
    var deltaY = mlY0 - winX0;

    // 4. calculate current absolute coordinates
    var Left = menuLeft =  event.screenX;
    var Top = menuTop = event.screenY;

    var clickEltPos = $(event.target).offset();
    var menuTop = $(event.target).offset().top;
    var menuLeft = $(event.target).offset().left;

    var menuHeight = this.height();
    var menuWidth = this.width();

    if ( (Top + menuHeight > mlY1) && (menuTop-menuHeight > 0) ) {
        menuTop = menuTop-menuHeight-20;
    }

    if (Left + menuWidth > mlX1) {
        menuLeft = menuLeft - menuWidth;
    }

    return this.each(function(){
        var $menu = $(this);
        $menu.css('visibility','hidden');
        $menu.css({
            top:menuTop+'px',
            left:menuLeft+'px',
            visibility:'visible',
            position:'absolute'
        });
    });
}

function ModelMenu(cc) {

    var showModelInfo = function(event, id) {

        var models = cc.models;

        model = Utils.findObjInArray(models, 'id', id, true);

        model.id = parseInt(model.id);
        var areFriends = cc.modules.friends.areFriends(model.id);
        var isFavourite = cc.modules.favs.isFavourite(model.id);
        var isIgnored = cc.modules.ignorelist.isIgnored(model.id);

        var model_info = tmpl('model_info',{model:model,areFriends:areFriends,isFavourite:isFavourite,isIgnored:isIgnored});
        $('#model_popup').remove();
        var $elt = $(event.target);

        var hideMenu = function(){
            $('#model_popup').remove();
            $(window).unbind('.menu');
        }

        var $modelInfo = $(model_info);

        $modelInfo
        .appendTo('body')
      	.setPosition(event)
        .show();

        var closeTimeout = window.setTimeout(hideMenu,2000);

        $modelInfo
        .mouseover(function(){
            window.clearTimeout(closeTimeout);
            $(window).unbind('.menu');
        })
        .mouseleave(function(){
            $(this).remove();
        })
        .find('a[rel=tip]')
            .click(function(){
                hideMenu();
                cc.sendTip(model.id);
            })
            .end()
        .find('a[rel=friend]')
            .click(function(){
                $('#model_popup').remove();
                var $link = $(this);
                var action = areFriends ? 'deleteFriend' : 'addFriend';
                cc.modules.friends[action](model,function(data){
                    if (data.deleted || data.added){
                        $link.text(!areFriends ? 'Add friend' : 'Remove friend');
                    } else {
                        alert(data.error);
                    }
                });
            })
            .end()
        .find('a[rel=ignore]')
            .click(function(){
                hideMenu();
                debug.log('isIgnored=',isIgnored);
            if (!isIgnored)
                cc.modules.ignorelist.add(model);
            else
                cc.modules.ignorelist.unignore(model.id);
            })
            .end()
        .find('a[rel=reg]')
            .click(function(){
                $('#model_popup').remove();
                Utils.registrationPopup();
            })
            .end()
        .find('a[rel=favs]')
            .click(function(){
				$('#model_popup').remove();
				ModelsPageButtons(cc, id, 'addToFavs')
            });
    };

    return {
            showModelInfo: function(event, id) {
                    showModelInfo(event, id);
            }
    }
}

function ModelsPageButtons(cc,id,event) {

	var isIgnored = cc.modules.ignorelist.isIgnored(model.id);   
	
	var models = cc.models;
    model = Utils.findObjInArray(models, 'id', id, true);
	
    switch (event) {
    case 'clickGroupButton':
    	var isGroup = cc.modules.favs.isGroup;
    	if (isGroup == false) {
			var swf = swfobject.getObjectById('ccvisitor_swf');
			swf.joinGroupChat();     		
    	} else {
			var swf = swfobject.getObjectById('ccvisitor_swf');
			swf.leaveGroupChat();     		
    	}
    	break;	
    case 'sendTip':
    	 cc.sendTip(id);
    	break;
	case 'addToFavs':
	    var isFavourite = cc.modules.favs.isFavourite(model.id);
	
	    var action = isFavourite ? 'remove' : 'addFavByName';
	    var param = isFavourite ? model.id : model.username;
	    cc.modules.favs[action](param,function(data){
	        if (data.error){
	            alert(data.error);
	        } else {
	        	$('#addToFavsButton').html('<span>'+(data.removed ? 'Add Favorite' : 'Remove from Favorites')+'</span>');
	        	
	        }
	    });   
	  break;
	case 'addToFriends':
	    var areFriends = cc.modules.friends.areFriends(model.id);
	    var action = areFriends ? 'deleteFriend' : 'addFriend';
	    
	    cc.modules.friends[action](model,function(data){
	        if (data.deleted || data.added){
	            $('#addToFriendsButton').html('<span>'+(areFriends ? 'Add Friend' : 'Remove Friend')+'</span>');
	        } else {
	            alert(data.error);
	        }
	    });	
	  break;
}

	
	
}
