﻿/// <reference path="jquery-1.3.2.min.js" />
/// <reference path="json2.js" />
/// <reference path="Helpers.js" />
/// <reference path="jquery.selectboxes.js" />
/// <reference path="ui.combobox.js" />

var _dropDownIds = new Array();
var _dependencies = new Array();
var _fieldNames = new Array();
var _fieldRanks = new Array();
var _maskValue = new Array();
var _changedFired = false;
var _currentSelection = '';
var _highestRank = 0;

function OnSetupInfoReturned(data)
{
	LayoutControls();
	var fields = ParseData(data);
	if (fields == null)
	{
		return;
	}
	
	for (var n = 0; n < fields.length; n++)
	{
		if (fields[n].Name == 'Total')
		{
			var fieldValue = fields[0].Values[0];
			_fieldNames[n] = "Matches:" + fieldValue.Matches; // Index 0 stores matchea
			UpdateTotals(fieldValue.Matches);
		}
		else {

		    if (fields[n].ControlType == "C") {
		        var displayValue = fields[n].Name + '(any)';
		        SetupCombo(n, fields[n].Name, displayValue, fields[n].DependsOn, fields[n].Display, fields[n].Index);
		    } else {
		        SetupText(n, fields[n].Name, fields[n].Name, fields[n].DependsOn, fields[n].Display, fields[n].Index);
		    }
		}
	}

	var queryParams = GetCurrentQueryParams();
	var freeTextString = GetCurrentFreeText_Search();
	if (freeTextString == null || freeTextString.length <= 0)
	{
		$('#UiFreeTextField').addClass('themeWatermarkText').val('Text Search');
	}
	else
	{
		$('#UiFreeTextField').val(freeTextString);
	}

	$('#UiFreeTextField').bind('change', null, OnFreeTextChanged).bind('click', null, OnFreeTextClicked).bind('keydown', null, OnFreeTextChanged);
	if (queryParams != null && queryParams.length > 0)
	{
		// Results Page so show all fields and preset values
		Miles33.KenticoCMS.StructuredDataSearch.RefreshSearchValues(_salesCatagory, freeTextString, queryParams, OnRefreshSearchValuesReturned);
	}
}

// Results Page so show all fields and preset values
function OnRefreshSearchValuesReturned(data)
{
	var fields = ParseData(data);
	if (fields == null)
	{
		return;
	}
	
	for (var n = 0; n < fields.length; n++)
	{
		if (fields[n].Name == 'Total')
		{
			var fieldValue = fields[0].Values[0];
			if (fieldValue.Matches == null || fieldValue.Matches == 0)
			{
				alert("Your search returned no results.  Please try different search options.  Hint: Try clearing the text search box");
				UpdateTotals(0);
			}
			else
			{
				_fieldNames[n] = "Matches:" + fieldValue.Matches; // Index 0 stores matchea
				UpdateTotals(fieldValue.Matches);
			}
		}
		else
		{
			var displayValue ='';
			var queryParam = GetCurrentQueryParams()[_fieldRanks[n] - 1]
			if ((queryParam == '') && (fields[n].ControlType == 'C'))
			{
				displayValue = fields[n].Name + '(any)';
			}
			else
			{
				displayValue = queryParam;
				$('#UiSDCombo' + n).addClass('modifiedCombo');
			}

			if (fields[n].ControlType == 'C') {
			    $('#UiSDCombo' + n).combobox('setData', 'selectedValue', displayValue);
			} else {
			    if (displayValue != '') {
			        $('#UiSDText' + n).val(displayValue);
			        $('#UiSDText' + n).removeClass('themeWatermarkText');
			    }
			}
		}
	}
}

function SetupText(fieldIndex, fieldName, displayValue, dependsOn, isVisible, fieldRank) {
    var divName = '#UiTextWrapper' + fieldIndex;
    var fieldName = 'UiSDText' + fieldIndex;
    $(divName).removeClass('hidden');
    _dropDownIds[fieldIndex] = fieldName;
    _maskValue[fieldIndex] = 'Search ' + displayValue
    $('#' + fieldName).addClass('themeWatermarkText').val(_maskValue[fieldIndex]);
    _fieldNames[fieldIndex] = fieldName;
    _fieldRanks[fieldIndex] = fieldRank;
    $('#' + fieldName).bind('change', null, OnSearchTextChanged).bind('click', null, OnSearchTextClicked).bind('keydown', null, OnSearchTextClicked);
}

function SetupCombo(fieldIndex, fieldName, displayValue, dependsOn, isVisible, fieldRank)
{
	_dropDownIds[fieldIndex] = 'UiSDCombo' + fieldIndex;
	_fieldNames[fieldIndex] = fieldName;
	_fieldRanks[fieldIndex] = fieldRank;
	if (fieldRank > _highestRank)
	{
		_highestRank = fieldRank;
	}

	if (dependsOn != null)
	{
		_dependencies[fieldIndex] = dependsOn;
	}

	// Hide any advanced fields from the screen
	if (GetHideAdvancedFields())
	{
		if (isVisible)
		{
			$('#UiComboWrapper' + fieldIndex).removeClass('hidden');
		}
	}
	else
	{
		// Show all fields by default
		$('#UiComboWrapper' + fieldIndex).removeClass('hidden');

		// Add classes to reposition elements in search screen
		$('.comboWrapper').addClass('advancedComboWrapper');
		$('#UiSDCombo1').addClass('advancedSDCombo1');
		$('#UiSearchButtonWrapper').addClass('advancedSearchButtonWrapper');
	}

	var params = { FieldIndex: fieldIndex };
	var btnpath = '../../mtmimages/drop_down.png';
	
	if (_mobile=='True') 
	{
	    btnpath = '../' + btnpath;
	}

	$('#UiSDCombo' + fieldIndex).combobox(
	{
	    //arrowURL: '/kenticocms/mtmimages/drop_down.png',
	    arrowURL: btnpath,//'../../mtmimages/drop_down.png',
		click: function(e, ui)
		{
			BringElementToTop('UiComboWrapper' + fieldIndex, 'comboWrapper');
			$('.ui-combobox-arrow').addClass('atTheBack');
			$('.sectionLinks').addClass('atTheBack');
			GetComboValues({ data: params });

			return false;
		},
		select: function(e, ui)
		{
			OnComboChanged(e, fieldIndex, ui);
		}/*,
		key: function(e, ui)
		{
			OnComboKeyDown(e, fieldIndex, ui);
		}*/,
		autoShow: false,
		readonly: true
	}).combobox('setData', 'selectedValue', displayValue);
}

/*function OnComboKeyDown(originalEvent, fieldIndex, comboItem)
{
	alert('key down');
}*/

function LayoutControls()
{
	if (GetHideAdvancedFields())
	{
		$('#UiComboLayout').addClass('basicLayout');
		$('#UiSectionLinks').removeClass('hidden');
	}
	else
	{
		$('#UiComboLayout').addClass('advancedLayout');
		$('.clearSearchWrapper').removeClass('hidden');
		$('#UiFreeTextField').removeClass('hidden');
	}

	$('.searchButtonWrapper').removeClass('hidden');	
}

function GetComboValues(params)
{
	$('.loadingIcon').removeClass('hidden');
	var fieldIndex = params.data.FieldIndex;	
	for (var n = 1; n <= _dependencies.length; n++)
	{
		if (fieldIndex == _dependencies[n])
		{
			var fieldName = _fieldNames[n];
			$('#UiSDCombo' + n).combobox('setData', 'selectedValue', _fieldNames[n] + '(any)');
			$('#UiSDCombo' + n).removeClass('modifiedCombo');
		}
	}
	
	var filter = CreateFilter(fieldIndex);
	//Miles33.KenticoCMS.StructuredDataSearch.GetDropDownValues(_salesCatagory, fieldIndex, '', filter, OnComboValuesReturned);
	Miles33.KenticoCMS.StructuredDataSearch.GetDropDownValues(_salesCatagory, _fieldRanks[fieldIndex], '', filter, OnComboValuesReturned);
	$(document).bind('click', params.data, CloseCombosOnDocumentClick);
}

function OnComboValuesReturned(data)
{
	var results = ParseData(data);
	if (results == null)
	{
		return;
	}
	
	var newTotal = 0;
	if (results.length > 0)
	{
		UpdateTotals(results[0].Values[0].Matches);
	}

	if (results.length > 1)
	{
		PopulateCombo(results[1], results[0].Values[0].Matches);
	}

	$('.loadingIcon').addClass('hidden');
}

function OnComboChanged(originalEvent, fieldIndex, comboItem)
{
	var anyIndex = comboItem.value.indexOf('(any)');
	var newValue;
	if (anyIndex > 0)
	{
		$('#UiSDCombo' + fieldIndex).removeClass('modifiedCombo');
		newValue = comboItem.value;
	}
	else
	{
		$('#UiSDCombo' + fieldIndex).addClass('modifiedCombo');
		if (GetShowCounters() ==  true)
		{
			var bracketIndex = comboItem.value.lastIndexOf('(');
			if (bracketIndex > 0)
			{
				newValue = Left(comboItem.value, bracketIndex);
			}
			else
			{
				newValue = comboItem.value;
			}
		}
		else
		{
			newValue = comboItem.value;
		}
	}

	$('#UiSDCombo' + fieldIndex).combobox('setData', 'selectedValue', newValue);
	$('.ui-combobox-arrow').removeClass('atTheBack');
	$('.sectionLinks').removeClass('atTheBack');
	
	var searchFilter = CreateFilter(null);
	var freeTextString = $('#UiFreeTextField').val();
	SetCurrentQueryParams_Search(searchFilter); // Call Control's PageMethod that sets hidden field value
	_searchParamsChanged.fire(null, { filter: searchFilter, freeTextString: freeTextString }); // Fire event to notify others that the search has been modified
}

function OnSearchTextClicked(params) {

    var ctrlName = params.currentTarget.id;
    var foundText = LocateControlMaskText(ctrlName);
    
    if (foundText != '') {
        RemoveWaterMark (ctrlName,foundText);
    }
}

function LocateControlMaskText(ctrlName) {
    
    var foundText = '';

    for (var n = 1; n < _dropDownIds.length; n++) {

        if (ctrlName == _dropDownIds[n]) {
            foundText = _maskValue[n];
        }
    }

    return foundText;
}

function RemoveWaterMark (ctrlName, maskText) {
	if ($('#' + ctrlName).val() == maskText)
	{
		$('#' + ctrlName).removeClass('themeWatermarkText');
		$('#' + ctrlName).val('');
	}
}

function OnFreeTextClicked(params)
{
    RemoveWaterMark('UiFreeTextField','Text Search');
}

function OnSearchTextChanged(params) {
    OnSearchTextClicked(params)
    var searchFilter = CreateFilter(null);
    //var freeTextString = $('#UiFreeTextField').val();
    SetCurrentQueryParams_Search(searchFilter); // Call Control's PageMethod that sets hidden field value
}

function OnFreeTextChanged(params)
{
	SetCurrentFreeText_Search($('#UiFreeTextField').val());
}

function OnSectionLinkClicked(link)
{
	var searchFilter = CreateFilter(null);
	searchFilter[0] = $(link).text();
	var freeTextString = $('#UiFreeTextField').val();
	SetCurrentQueryParams_Search(searchFilter); // Call Control's PageMethod that sets hidden field value
	_searchParamsChanged.fire(null, { filter: searchFilter, freeTextString: freeTextString }); // Fire event to notify others that the search has been modified
}

function OnSectionLinkClickedAdv(linkText) {
    var searchFilter = CreateFilter(null);
    searchFilter[0] = linkText;
    var freeTextString = $('#UiFreeTextField').val();
    SetCurrentQueryParams_Search(searchFilter); // Call Control's PageMethod that sets hidden field value
    _searchParamsChanged.fire(null, { filter: searchFilter, freeTextString: freeTextString }); // Fire event to notify others that the search has been modified
}

function UpdateTotals(newTotal)
{
	var digits = new Array('0', '0', '0', '0', '0', '0');
	var splitTotal = ('' + newTotal + '').split('');

	// Populate source array for tacho display
	for (var n = 0; n < splitTotal.length; n++)
	{
		var digitIndex = digits.length - splitTotal.length + n;
		digits[digitIndex] = splitTotal[n];
	}

	// update tacho
	for (var n = 0; n < digits.length; n++)
	{
		var id = '#tacho' + (n + 1);
		$(id).html(digits[n]);
	}

	return newTotal;
}

function ShowValues()	// A debugging method
{
	var currentValues = "";
	for (var n = 1; n < 7; n++)
	{
		currentValues += $('#UiSDCombo' + n).val() + "\n";
	}

	//alert(currentValues);
}

/*** Combos ***/
function PopulateCombo(structuredDataField, rowZeroTotal)
{
	var fieldIndex;
	for (var n = 0; n < _fieldRanks.length; n++)
	{
		if (_fieldRanks[n] == structuredDataField.Index)
		{
			fieldIndex = n;
			break;
		}
	}
	 
	var options = new Array();	
	
	options[0] = structuredDataField.Name + '(any)';
	for (var n = 0; n < structuredDataField.Values.length; n++)
	{
		var displayText; 
		if (GetShowCounters() == true)
		{
			displayText = structuredDataField.Values[n].DisplayText + "(" + structuredDataField.Values[n].Matches + ")";
		}
		else
		{
			displayText = structuredDataField.Values[n].DisplayText;
		}
		
		options[n + 1] = displayText;
	}

	$('#UiSDCombo' + fieldIndex).combobox('setData', 'data', options).combobox('showList');
}

function CreateFilter(fieldIndex)
{
	var filter = new Array();
	// Clean up filter string to remove nulls
	for (var n = 1; n < _highestRank; n++)
	{
		filter[n - 1] = '';	// Default each filter to an empty string first to avoid nulls later
	}
	
	if (fieldIndex != null)
	{
		for (var n = 1; n < _dropDownIds.length; n++)
		{
			if (n == fieldIndex)
			{
				filter[_fieldRanks[n] - 1] = '';
			}
			else
			{
			    var selectedValue = $('#' + _dropDownIds[n]).val().split(',')[0];
				if (Right(selectedValue, 5) == '(any)')
				{
					filter[_fieldRanks[n] - 1] = '';
				}
				else if (_dependencies.length >= fieldIndex && _dependencies[n] != null && _dependencies[n] == fieldIndex)
				{
					filter[_fieldRanks[n] - 1] = '';
				}
				else {
				    if (selectedValue == LocateControlMaskText(_dropDownIds[n])) {
				        selectedValue = '';
				    }
					filter[_fieldRanks[n] - 1] = selectedValue;
				}
			}
		}
	}
	else
	{
		for (var n = 1; n < _dropDownIds.length; n++)
		{
		    var selectedValue = $('#' + _dropDownIds[n]).val().split(',')[0];
			if (Right(selectedValue, 5) == '(any)')
			{
				filter[_fieldRanks[n] - 1] = '';
			}
			else {
			    if (selectedValue == LocateControlMaskText(_dropDownIds[n])) {
			        selectedValue = '';
			    }			
				filter[_fieldRanks[n] - 1] = selectedValue;
			}
		}
	}
	
	return filter;
}

function ParseData(data)
{
	if (data == null)
	{
		alert('There was a problem connecting to the server.  Please try again');
		$('.loadingIcon').addClass('hidden');
		return null;
	}

	var results = JSON.parse(data);
	if (results.Error != null)
	{
		var userMessage;
		if (results.Error.Message != null) 
		{
			userMessage = results.Error.Message;
		}
		else 
		{
			userMessage = "Oops, something went wrong.  Please try again.";
		}
		
		alert(userMessage);
		$('.loadingIcon').addClass('hidden');
		$('.ui-combobox-arrow').removeClass('atTheBack')
		$('.sectionLinks').addClass('atTheBack');
		return null;
	}

	return results;
}

function CloseCombosOnDocumentClick(params)
{
	$('#UiSDCombo' + params.data.FieldIndex).combobox('hideList');
	$('.ui-combobox-arrow').removeClass('atTheBack')
	$('.sectionLinks').removeClass('atTheBack');
	$(document).unbind('click', CloseCombosOnDocumentClick);
}