/**
 * Creator: khastie
 * Date: Dec 31, 2008
 * Time: 9:52:55 AM
 * Contents are property of Cappex.com LLC, and strictly confidential.
 */

/** 
 * CLASS: 	CollegeCenter
 * DESCR:	
 * USAGE:
 * EXMPL:	
 */
var CollegeCenter = new Class({

	options : {

		// unused studentIDMasked : null,

		// urls for ajax member objects
		ajaxProcessorUrl : null,
		ajaxMyCollegesRetrieverUrl : null,
		ajaxStudentCollegeRetrieverUrl : null,
		deadlineRemindersStickyWinUrl : null,
		deadlineRemindersSubmitUrl : null
	},

	// tiles-related members
	myCollegesTiles : new Array(),
	myCollegesElems : new Array(),
	previousMyCollegesTiles : new Array(),
	insertIndex : null,
	tileAnimator : new TileAnimator(),
	confirmationWin : Class.empty(),
	confirmationWinPos : Class.empty(),
	interestLevelProcessor : Class.empty(),

	// ajax members
	ajaxProcessor : null,
	ajaxMyCollegesRetriever : null,
	ajaxStudentCollegeRetriever : null,

	initialize : function (options) {

		this.setOptions(options);

		window.addEvent('domready', function () {
			this.domReady();
		}.bind(this));

		this.initializeAjax();

	},

	domReady : function () {

		this.interestLevelProcessor = new InterestLevelProcessor(this.options);
		this.myCollegesElems = $$('.studentCollegeItem');
		this.loadMyCollegesTiles();
	},

	initializeAjax : function () {

		this.ajaxProcessor = new AjaxCpx(this.options.ajaxProcessorUrl, {

			onSuccess : function() {

				this.ajaxMyCollegesRetriever.request();
				// var newTile = Json.evaluate(this.ajaxProcessor.transport.responseText);

			}.bind(this)
		});

		this.ajaxMyCollegesRetriever = new AjaxCpx(this.options.ajaxMyCollegesRetrieverUrl, {

			onSuccess : function () {

				// read response
				var studentColleges = Json.evaluate(this.ajaxMyCollegesRetriever.transport.responseText);

				// move current myColleges to previous and clear myColleges
				this.previousMyCollegesTiles = this.myCollegesTiles;
				this.myCollegesTiles = new Array(studentColleges.length);

				// read the new ones in from what you got in the response
				for (var i = 0; i < studentColleges.length; i++) {

					this.myCollegesTiles[i] = new StudentCollegeTile();
					this.myCollegesTiles[i].populate(studentColleges[i]);
				}

				// determine which one is new and where to insert it
				var newTile = this.determineNewStudentCollege();
				this.determineInsertIndex(newTile);

				// load the data for the new tile
				this.ajaxStudentCollegeRetriever.request('collegeID=' + newTile.collegeID);

			}.bind(this)
		});

		this.ajaxStudentCollegeRetriever = new AjaxCpx(this.options.ajaxStudentCollegeRetrieverUrl, {

			update : 'newMyCollegesTileTarget',

			onSuccess : this.insertTile.bind(this)

		});
	},

	loadMyCollegesTiles : function() {

		this.myCollegesTiles = new Array(this.myCollegesElems.length);

		for (var i = 0; i < this.myCollegesElems.length; i++ ) {

			var tile = new StudentCollegeTile();

			tile.collegeID = parseInt($E('form', this.myCollegesElems[i]).name.replace('interestLevelForm', '')); // get id off of form name attr
			// unused tile.studentIDMasked = this.options.studentIDMasked;
			tile.interestTypeID =  $E('select', this.myCollegesElems[i]).selected;
			tile.collegeName = $('collegeName' + tile.collegeID).innerHTML;

			tile.interestLevelElem = $E('.jsInterestLevel', this.myCollegesElems[i]);
			tile.interestLevelElem.removeEvents();
			tile.interestLevelElem.addEvent('change', this.interestLevelProcessor.process.pass(tile, this.interestLevelProcessor));

			this.myCollegesTiles[i] = tile;

// HACKKH: fix this for IE6, which doesn't register the change event properly (try onPropertyChange) or what's below:
//			tile.interestLevelElem.addEvent('keyup', this.setInterestLevel);
//			tile.interestLevelElem.addEvent('click', this.setInterestLevel);

		}

	},

	/**
	 * Determines if there is a newStudentCollege (by diffing myCollegesTiles with previousMyCollegesTiles)
	 */
	determineNewStudentCollege : function () {

		var newStudentColleges = this.myCollegesTiles.filter(this.isNewTile.bind(this));

		// only 1 tile is expected, so if we get 0 or 2 or more, something has gone wrong, so refresh the page to start with a fresh list
		if (newStudentColleges.length != 1) {
			global.log('Only expected to have one new tile, but found ' + newStudentColleges.length);
			new JsErrorLogger().logError('Failed assert. Only expected to have one new tile, but found ' + newStudentColleges.length, '', '');
			window.location.reload();
		}

		return newStudentColleges[0];

	},

	/**
	 * Is this tile not already contained in previousMyCollegesTiles? I.e. does it not already exist on the page?
	 */
	isNewTile : function(tile, index) {

		for (var i = 0; i < this.previousMyCollegesTiles.length; i++) {

			if (tile.collegeID == this.previousMyCollegesTiles[i].collegeID) {
				return false;
			}
			
		}

		return true; // if none are found

	},

	determineInsertIndex : function (newTile) {

		this.insertIndex = 0;

		// determine which slot to insert the new tile in
		this.myCollegesTiles.each(function(tile, index) {

			if (tile.collegeID == newTile.collegeID) {
				this.insertIndex = index + 1;
			}
		});

	},

	insertTile : function () {

		var newTile = this.myCollegesTiles[this.insertIndex];

		this.tileAnimator.showGhost(this, newTile.collegeID);

		var newMyCollegesElem = $E('.studentCollegeItem', 'newMyCollegesTileTarget');
		newMyCollegesElem.addClass('jsInvisible');

		if (this.insertIndex == 0) {
			newMyCollegesElem.inject('chosenCollegesList', 'top');
		} else {
			newMyCollegesElem.inject(this.myCollegesElems[this.insertIndex - 1], 'after');
		}

		this.tileAnimator.expandMyCollegesGap(newMyCollegesElem);

		this.tileAnimator.addToMyColleges(newTile, newMyCollegesElem, this.confirmationWin);

		this.clearSuggestions.delay(590, this, newTile.collegeID); // delay to prevent this from making animation choppy

		this.myCollegesElems = $$('.studentCollegeItem'); // update object reference

		// update tile with interestLevel elem reference and add event to new dropdown
		newTile.interestLevelElem = $E('.jsInterestLevel', this.myCollegesElems[this.insertIndex]);
		newTile.interestLevelElem.addEvent('change', this.interestLevelProcessor.process.pass(newTile, this));
		if (!window.ie6) {
			simpleSelectStyle.style_selects(newTile.interestLevelElem);
			simpleSelectStyle.toggleThrob(newTile.interestLevelElem);
		}

		// add event for deadline reminders chicklet:
		deadlineRemindersControllers.set(
			newTile.collegeID,
			new DeadlineRemindersController({
				stickyWinUrl : this.options.deadlineRemindersStickyWinUrl,
				submitUrl : this.options.deadlineRemindersSubmitUrl,
				collegeID : newTile.collegeID
			})
		);

	},

	openSuggestionConfirmation : function(collegeID, moduleID) {

		this.confirmationWin = new StickyWinFxModal({
			
			content: $('suggestionConfirmation_' + moduleID + '_' + collegeID),
			width: 230,
			height: 100,
			fadeDuration: 200,
			zIndex: 10000,
			relativeTo : $('suggestion_' + moduleID + '_' + collegeID),
			offset: {x : 0, y : 30},
			modalOptions: {
				modalStyle: {
					'background-color': '#000',
					'opacity': '0.5'
				}
			}
		});

	},

	add : function(collegeID, studentCollegeTypeID, moduleID) {

		this.confirmationWinPos = $('suggestionConfirmation_' + moduleID + '_' + collegeID).getPagePosition();

		var data = 'collegeID=' + collegeID + '&studentCollegeTypeID=' + studentCollegeTypeID;
		this.ajaxProcessor.request(data);
		// $('suggestion_' + moduleID + '_' + collegeID).addClass('jsHide');
	},

	clearSuggestions : function (collegeID) {

		//each suggestion module
		$$('.suggestionTiles').each(function(suggestionModule) {

			var numToReveal = 0;
			
			// each suggestion inside that module
			$ES('.suggestion', suggestionModule).each( function (suggestionElem) {

				global.trace(suggestionElem.id);

				if (suggestionElem.id.split('_')[2] == collegeID) {
					suggestionElem.remove();
					numToReveal++;
				}

				if (numToReveal > 0 && suggestionElem.hasClass('jsHide')) {
					suggestionElem.removeClass('jsHide');
					numToReveal--;
				}
			});
			
		});

	},
    /* TODO: (yeah, right) refactor this so that you don't need to pass in collegeCenter reference */
    setTypeIDFromInterestLevelElem : function (collegeCenter, collegeID, typeID) {

        collegeCenter.getTileByCollegeID(collegeID).typeID = typeID;

    },

    getTileByCollegeID : function (collegeID) {

      for (var i = 0; i < this.myCollegesTiles.length; i++) {

          if (this.myCollegesTiles[i].collegeID == collegeID) {
              return this.myCollegesTiles[i];
          }
      }
    },

	test : function () {

	}
});

CollegeCenter.implement(new Options);