//create namespace:
YAHOO.namespace("ShippingAdvisor.ext");

YAHOO.ShippingAdvisor.ext.DataView = function(elContainer , oColumnSet , oDataSource , oConfigs) {
	if (arguments.length > 0) {
		YAHOO.ShippingAdvisor.ext.DataView.superclass.constructor.call(this, elContainer , oColumnSet , oDataSource , oConfigs);
	}
	this.hiddenRecords = [];
	this.hiddenSelected = 0;
	
};
// Inherit from YAHOO.widget.DataTable
YAHOO.lang.extend(YAHOO.ShippingAdvisor.ext.DataView, YAHOO.widget.DataTable);
 
YAHOO.ShippingAdvisor.ext.DataView.prototype.isFiltered=false;

YAHOO.ShippingAdvisor.ext.DataView.prototype.reformatRow = function(record) {
	if (this.getTrIndex(record) !== null)
	{
		var colTree = this._oColumnSet.tree;
    for(i=0; i<colTree.length; i++) {
        for(var j=0; j<colTree[i].length; j++) {
            oColumn = colTree[i][j];
						this.formatCell(this.getTdLinerEl({record:record, column:oColumn}));
        }
    }
	}
}


YAHOO.ShippingAdvisor.ext.DataView.prototype.updateItemCount = function( ) {
	var countDiv = YAHOO.util.Dom.get(this.originalConfig.divID + '-itemCount');
	if (countDiv)
	{
		var content = '';
		content += '<span class="grid-item-count-' + this.originalConfig.divID + '"></span> items';
		content += ' (' + (this.hiddenSelected + (this._aSelections ? this._aSelections.length : 0)) + ' selected)';
		countDiv.innerHTML = content;
	}
	var els = YAHOO.util.Dom.getElementsByClassName('grid-item-count-' + this.originalConfig.divID);
	for (var i in els)
	{
		els[i].innerHTML = this._oRecordSet._records.length + this.hiddenRecords.length;
	}	
}

YAHOO.ShippingAdvisor.ext.DataView.prototype.showFilterPanel = function() {
	
	var panel = YAHOO.util.Dom.get(this.originalConfig.divID + '-filterPanel');
	if (panel.style.display != "none")
	{
		this.filterOn('');
		this.closeFilterPanel();
		return;
	}

	var content = '';
	content += '<span class="dataTableFilter"><input type="text" id="' + this.originalConfig.divID + '-filter" width="50"/>';
	content += '<span class="dataTableFilterIcons" id="dataTableFilterIcons-' + this.originalConfig.divID + '"></span></span>';
	content += '<span style="float:right; color:blue;" class="dottedUnderline" id="' + this.originalConfig.divID + '-filterClear">Close</span>';
	content += '<span id="' + this.originalConfig.divID + '-filterText">No rows filtered</span> <span style="display:none;" id="' + this.originalConfig.divID + '-filterSelectOptions" class="dtFilterSelect">Selection: ';
	content += '<span style="color:blue;" class="dottedUnderline" id="' + this.originalConfig.divID + '-filterAddSelection">Add</span>, ';
	content += '<span style="color:blue;" class="dottedUnderline" id="' + this.originalConfig.divID + '-filterRemoveSelection">Remove</span></span>';
	panel.innerHTML = content;
	
	var iconsPanel = YAHOO.util.Dom.get('dataTableFilterIcons-' + this.originalConfig.divID);
	var img = document.createElement('img');
	img.src = '/static/images/shipping/user_comment.png';
	YAHOO.util.Dom.addClass(img, "activeIcon");
	iconsPanel.appendChild(img);
	YAHOO.util.Event.addListener(img, "click", function (e, dt) {
			dt.filterWhereExists('shippingInstructions');
	}, this);
	
	var img = document.createElement('img');
	img.src = '/static/images/shipping/flag_red.png';
	YAHOO.util.Dom.addClass(img, "activeIcon");
	iconsPanel.appendChild(img);
	YAHOO.util.Event.addListener(img, "click", function (e, dt) {
			dt.filterWhereExists('carrierValidationErrors');
	}, this);
	
	panel.style.display = "";
	YAHOO.util.Dom.get(this.originalConfig.divID + '-filter').focus();
	YAHOO.util.Event.addListener(this.originalConfig.divID + '-filter', "keyup", function (e, dt)	{
		if (this.value.length > 1)
		{
			YAHOO.util.Dom.get(dt.originalConfig.divID + '-filterText').innerHTML = '<img src="/static/images/shipping/ajax-loader.gif" />';
			YAHOO.util.Dom.get(dt.originalConfig.divID + '-filterSelectOptions').style.display = "none";
		}
		if (dt.filterTimeout)
		{
			dt.filterTimeout.cancel();
		}
		dt.filterTimeout = YAHOO.lang.later(500, dt, dt.filterOn, this.value);
		
	}, this);
	
	YAHOO.util.Event.addListener(this.originalConfig.divID + '-filterClear', "click", function (e, dt)	{
			dt.clearFilter();
	}, this);
	
	YAHOO.util.Event.addListener(this.originalConfig.divID + '-filterAddSelection', "click", function (e, dt)	{
			dt.selectAllRows(true);
	}, this);
	
	YAHOO.util.Event.addListener(this.originalConfig.divID + '-filterRemoveSelection', "click", function (e, dt)	{
			dt.unselectAllRows(true);
	}, this);
	
}

YAHOO.ShippingAdvisor.ext.DataView.prototype.filterWhereExists = function(value) {
	if (this.isFiltered)
	{
		this.filterRows();
	}
	var records = this.getRecordSet().getRecords();
	var matching = new Array();
	for (var i in records)
	{
		if (records[i].getData(value))
		{
			matching.push(i);
		}
	}
	this.filterRows(matching);
	
}

YAHOO.ShippingAdvisor.ext.DataView.prototype.filterOn = function(value) {
	if (value.length > 1)
	{
		if (this.isFiltered)
		{
			this.filterRows();
		}
		value = value.replace(/^\s+|\s+$/g, '').replace(/([\\\[\]\*\^\$\|\?\+\(\)]{1})/, "\\$1");
		var values = value.split(/[ ,]+/);
		var records = this.getRecordSet().getRecords();
		var matching = new Array();
		for (var i in records)
		{
			var data = records[i].getData();
			for (var j in data)
			{
				for (var k in values)
				{
					var found = false;
					var testString = data[j] + '';
					if (testString.toLowerCase().match(new RegExp(values[k].toLowerCase())))
					{
						matching.push(i);
						break;
					}
				}
				if (found)
				{
					break;
				}
			}
		}
		this.filterRows(matching);
	}
	else
	{
		if (this.isFiltered && value.length == 0)
		{
			this.filterRows();
		}
	}
}

YAHOO.ShippingAdvisor.ext.DataView.prototype.clearFilter = function() {
	this.filterOn('');
	this.closeFilterPanel();
};

YAHOO.ShippingAdvisor.ext.DataView.prototype.closeFilterPanel = function() {
	var panel = YAHOO.util.Dom.get(this.originalConfig.divID + '-filterPanel');
	panel.style.display = "none";
	var field = YAHOO.util.Dom.get(this.originalConfig.divID + '-filter');
	if (field)
	{
		field.value = "";
	}
	
};

YAHOO.ShippingAdvisor.ext.DataView.prototype.filterRows = function(filteredRows) {
	if(filteredRows == undefined) {
		var outerDiv = YAHOO.util.Dom.get(ShippingAdvisor.dataTables[ShippingAdvisor.getDataTableIndex(this)].divID);
		YAHOO.util.Dom.removeClass(outerDiv, "dtFiltered");
		this._oRecordSet.addRecords(this.hiddenRecords);
		this.hiddenRecords = [];
		this.hiddenSelected = 0;
		this.render();
		this.isFiltered=false; 
	}
	else {
		var divID = ShippingAdvisor.dataTables[ShippingAdvisor.getDataTableIndex(this)].divID;
		var outerDiv = YAHOO.util.Dom.get(divID);
		//YAHOO.util.Dom.addClass(outerDiv, "dtFiltered");
		
		if (this.hiddenRecords.length > 0)
		{
			// restore the full set
			this._oRecordSet.addRecords(this.hiddenRecords);
			this.hiddenRecords = [];
			this.hiddenSelected = 0;
		}
		var newView = [];
		for (var i in this._oRecordSet._records)
		{
			var found = false;
			for (var j in filteredRows)
			{
				if (filteredRows[j] == i)
				{
					found = true; 
				}
			}
			if (found)
			{
				newView.push(this._oRecordSet._records[i]._oData);
			}
			else
			{
				if (this._oRecordSet._records[i].getData('checked') == true)
				{
					this.hiddenSelected++;
				}
				this.hiddenRecords.push(this._oRecordSet._records[i]._oData);
			}
		}
		
		this._oRecordSet.replaceRecords(newView);
		this.render();
		this.isFiltered=true;
		 
	}
	YAHOO.util.Dom.get(this.originalConfig.divID + '-filterText').innerHTML = ((this.hiddenRecords.length > 0) ? this._oRecordSet._records.length + ' records showing out of ' + (this._oRecordSet._records.length + this.hiddenRecords.length) + '.' : 'No rows filtered.');
	if (this.hiddenRecords.length > 0)
	{
		YAHOO.util.Dom.get(this.originalConfig.divID + '-filterSelectOptions').style.display = "";
	}
	var pag = this.get('paginator');
	if (pag instanceof YAHOO.widget.Paginator)
	{
		pag.setTotalRecords(this._oRecordSet._records.length);
	}
}; 

YAHOO.ShippingAdvisor.ext.DataView.prototype.selectAllRows = function(onlyFiltered) {
	var records = this.getRecordSet().getRecords();
	for (var i in records)
	{
			ShippingAdvisor.selectRow(this, records[i]);
	}
	if (!onlyFiltered)
	{
		for (var i in this.hiddenRecords)
		{
			this.hiddenRecords[i].checked = true;
		}
		this.hiddenSelected = this.hiddenRecords.length;
	}
	this.updateItemCount();
}
 
 /**
 * Clears out all row selections.
 *
 * @method unselectAllRows
 */
YAHOO.ShippingAdvisor.ext.DataView.prototype.unselectAllRows = function(onlyFiltered) {
    var records = this.getRecordSet().getRecords();
    for (var i in records)
    {
				ShippingAdvisor.unselectRow(this, records[i]);
    }
		if (!onlyFiltered)
		{
			for (var i in this.hiddenRecords)
			{
				this.hiddenRecords[i].checked = false;
			}
			this.hiddenSelected = 0;
		}
		this.updateItemCount();
}

 /**
 * Export selected rows as CSV
 *
 * @method exportCSV
 */
YAHOO.ShippingAdvisor.ext.DataView.prototype.exportCSV = function() {
	var orderIDs = new Array();
	var selectedRecords = this.getColumn('checked') ? this.getSelectedRows() : this.getRecordSet().getRecords();
	if (selectedRecords.length == 0)
	{
		ShippingAdvisor.displayAlert('No records selected');
		return;
	}
	for(var i in selectedRecords)
	{
		orderIDs.push(this.getRecord(selectedRecords[i]).getData('ID'));
	}
	var form = $(document.createElement('form'))
		.attr({method:"POST", action:"/cms/export/csv/orderExport.csv"})
		.append($(document.createElement("input"))
			.attr({name:"orders", value:orderIDs.join(","), type:"hidden"}));
	$(document.body).append(form);
	form.get()[0].submit();
}

/**
 * Determines selection behavior resulting from a mouse event when selection mode
 * is set to "standard".
 * Modified to behave as if CTRL is always down.
 *
 * @method _handleStandardSelectionByMouse
 * @param oArgs.event {HTMLEvent} Event object.
 * @param oArgs.target {HTMLElement} Target element.
 * @private
 */
YAHOO.ShippingAdvisor.ext.DataView.prototype._handleStandardSelectionByMouse = function(oArgs) {
    var elTarget = oArgs.target;

    // Validate target row
    var elTargetRow = this.getTrEl(elTarget);
    if(elTargetRow) {
        var e = oArgs.event;
        var bSHIFT = e.shiftKey;
        var bCTRL = true;

        var oTargetRecord = this.getRecord(elTargetRow);
        var nTargetRecordIndex = this._oRecordSet.getRecordIndex(oTargetRecord);

        var oAnchor = this._getSelectionAnchor();

        var i;

        // Both SHIFT and CTRL
        if(bSHIFT && bCTRL) {
            // Validate anchor
            if(oAnchor) {
                if(this.isSelected(oAnchor.record)) {
                    // Select all rows between anchor row and target row, including target row
                    if(oAnchor.recordIndex < nTargetRecordIndex) {
                        for(i=oAnchor.recordIndex+1; i<=nTargetRecordIndex; i++) {
                            if(!this.isSelected(i)) {
                                this.selectRow(i);
                            }
                        }
                    }
                    // Select all rows between target row and anchor row, including target row
                    else {
                        for(i=oAnchor.recordIndex-1; i>=nTargetRecordIndex; i--) {
                            if(!this.isSelected(i)) {
                                this.selectRow(i);
                            }
                        }
                    }
                }
                else {
                    // Unselect all rows between anchor row and target row
                    if(oAnchor.recordIndex < nTargetRecordIndex) {
                        for(i=oAnchor.recordIndex+1; i<=nTargetRecordIndex-1; i++) {
                            if(this.isSelected(i)) {
                                this.unselectRow(i);
                            }
                        }
                    }
                    // Unselect all rows between target row and anchor row
                    else {
                        for(i=nTargetRecordIndex+1; i<=oAnchor.recordIndex-1; i++) {
                            if(this.isSelected(i)) {
                                this.unselectRow(i);
                            }
                        }
                    }
                    // Select the target row
                    this.selectRow(oTargetRecord);
                }
            }
            // Invalid anchor
            else {
                // Set anchor
                this._oAnchorRecord = oTargetRecord;

                // Toggle selection of target
                if(this.isSelected(oTargetRecord)) {
                    this.unselectRow(oTargetRecord);
                }
                else {
                    this.selectRow(oTargetRecord);
                }
            }
        }
         // Only SHIFT
        else if(bSHIFT) {
            this.unselectAllRows();

            // Validate anchor
            if(oAnchor) {
                // Select all rows between anchor row and target row,
                // including the anchor row and target row
                if(oAnchor.recordIndex < nTargetRecordIndex) {
                    for(i=oAnchor.recordIndex; i<=nTargetRecordIndex; i++) {
                        this.selectRow(i);
                    }
                }
                // Select all rows between target row and anchor row,
                // including the target row and anchor row
                else {
                    for(i=oAnchor.recordIndex; i>=nTargetRecordIndex; i--) {
                        this.selectRow(i);
                    }
                }
            }
            // Invalid anchor
            else {
                // Set anchor
                this._oAnchorRecord = oTargetRecord;

                // Select target row only
                this.selectRow(oTargetRecord);
            }
        }
        // Only CTRL
        else if(bCTRL) {
            // Set anchor
            this._oAnchorRecord = oTargetRecord;

            // Toggle selection of target
            if(this.isSelected(oTargetRecord)) {
                this.unselectRow(oTargetRecord);
            }
            else {
                this.selectRow(oTargetRecord);
            }
        }
        // Neither SHIFT nor CTRL
        else {
            this._handleSingleSelectionByMouse(oArgs);
            return;
        }
    }
}

