﻿$jq.namespace('MatchCore');
$jq.namespace('MatchCore.Types');

MatchCore.Session = function() {
    var self = {
        SID: function() {
            if ($jq.readCookie('SECU') != null) {
                //return _sid;
                return $jq.readCookie('SECU')['ESID'];
            }
        },

        ServerId: function() {
            if ($jq.readCookie('SECU') != null) {
                //return _serverId;
                return $jq.readCookie('SECU')['THEME'];
            }
        },

        isTimedOut: function() {
            var sid = self.SID();
            var serverId = self.ServerId();

            return !(
                sid != null &&
                sid != undefined &&
                sid.length > 0 &&
                serverId != null &&
                serverId != undefined &&
                serverId.length > 0
               );
        }
    };

    return self;
} ();

MatchCore.Delegate = function() {
	var _handlers = [];
	
	return {
		add : function(handler) {
			_handlers.push(handler);
		},
		
		fire : function() {
			for (var i = 0; i < _handlers.length; i++) {
				_handlers[i](arguments);
			}
			_handlers = [];	
		},
		
		fireAndPreserve : function() {
		    for (var i = 0; i < _handlers.length; i++) {
				_handlers[i](arguments);
			}
		},
		
		count : function() {
			return _handlers.length;
		}
	};
};

MatchCore.ServiceProxy = function(baseUrl) {
	var _baseUrl;
	var _methodName;
	
	if (baseUrl)
		_baseUrl = baseUrl;
		
	return {
		invoke : function(opts) {
			var verb = (opts.verb) ? opts.verb : "GET";
			var dataType = (opts.dataType) ? opts.dataType : "json";
			var proxyUrl = (dataType.toLowerCase() == 'json') ? _baseUrl + '/' + opts.method : _baseUrl + '/' + opts.method + '/' + dataType;
			
			var async = ('async' in opts) ? opts.async : true;
			
			$jq.ajax({
				type: verb,
				url: proxyUrl,
				data: opts.data,
				dataType: dataType,
				success: function(response) {
					if (opts.success)
						opts.success(response);
				},
				error : function (xmlhttp, status, exception) {
					if (opts.failure)
						opts.failure(xmlhttp, status, exception);					
					
					if (opts.error)
						opts.error(xmlhttp, status, exception);					
				},
				async : async
			});
		}
	};
};

MatchCore.APIProxy = function(baseUrl) {
    var _baseUrl;
    var _methodName;

    if (baseUrl)
        _baseUrl = baseUrl;

    return {
        invoke: function(opts) {
            var verb = (opts.verb) ? opts.verb : "GET";
            var dataType = (opts.dataType) ? opts.dataType : "json";
            var data = (dataType.toLowerCase() == "json") ? JSON.stringify(opts.data) : opts.data;
            var subLink = (opts.subLink) ? '/' + opts.subLink : "";
            var proxyUrl = _baseUrl + subLink;
            var contentType = (opts.contentType) ? opts.contentType : "application/json; charset=utf-8";
            var async = ('async' in opts) ? opts.async : true;
            var auth = MatchCore.CP.Mauth();

            if (proxyUrl.indexOf('?') == -1)
                proxyUrl += '?Authorization=' + auth;
            else
                proxyUrl += '&Authorization=' + auth;

            $jq.ajax({
                type: verb,
                url: proxyUrl,
                data: data,
                dataType: dataType,
                contentType: contentType,
                success: function(response) {
                    if (opts.success)
                        opts.success(response);
                },
                error: function(xmlhttp, status, exception) {
                    if (opts.failure)
                        opts.failure(xmlhttp, status, exception);

                    if (opts.error)
                        opts.error(xmlhttp, status, exception);
                },
                async: async
            });
        }
    };
};

MatchCore.Messaging = function() {
	var _messages = null;
	
	var hasMessageSummary = function() {
		return getMessageSummary().length > 0;
	};
	
	var getMessageSummary = function() {
		return $jq('.userMessageSummary');
	};
	
	return {
		reset : function() {
			if (hasMessageSummary) {
				getMessageSummary().html('');
				getMessageSummary().hide();
			}
			
			if (_messages) {
				for (var i = 0; i < _messages.length; i++) {
					var field = $jq('INPUT[@name="' + _messages[i].field + '"]')[0];
					var label = $jq('LABEL[@for="' + _messages[i].field + '"]')[0];
					
					$jq(label).removeClass('invalidFieldLabel');
					$jq(field).removeClass('invalidField');
				}
			}
			
			_messages = null;
		},
		
		show : function(messages) {
			this.reset();
			
			_messages = messages;
			
			if (hasMessageSummary()) {
				getMessageSummary().html('<ul></ul>');
				getMessageSummary().show();
			}

			for (var i = 0; i < messages.length; i++) {
				if (messages[i].Field) {
					var field = $jq('INPUT[@name="' + messages[i].Field + '"]');
					var label = $jq('LABEL[@for="' + messages[i].Field + '"]');
					
					label.addClass('invalidFieldLabel');
					field.addClass('invalidField');
					if (i == 0 && field.length > 0)
						field[0].focus();
				}
				
				if (hasMessageSummary())
					$jq('UL', getMessageSummary()[0]).append('<li>' + messages[i].Text + '</li>');

			}
		}
	};
}();

MatchCore.Query = function(array) {
    var _array = array;

    return {
        filter: function(method) {
            if (method != null) {
                var filtered = [];

                for (var i = 0; i < _array.length; i++) {
                    var item = _array[i];

                    if (method(item))
                        filtered.push(item);
                }

                return new MatchCore.Query(filtered);
            }
            else return this;
        },

        sort: function(method) {
            return new MatchCore.Query(_array.sort(method));
        },

        data: function(array) {
            if (array)
                _array = array;
            else
                return _array;
        }
    }
};

MatchCore.PhotoConfig = {
    Ids: [
		'A',
		'B',
		'C',
		'D',
		'E',
		'F',
		'G',
		'H',
		'I',
		'J',
		'K',
		'L',
		'M',
		'N',
		'O',
		'P',
		'Q',
		'R',
		'S',
		'T',
		'U',
		'V',
		'W',
		'X',
		'Y',
		'Z'
	]
};

MatchCore.Photo = function(uid, photoId) {
    var _uid = uid;
    var _id = photoId;

    var generateUrl = function(type) {
        var photoID = MatchCore.PhotoConfig.Ids[_id - 1];
        var lastFour = _uid.toString().substring(_uid.toString().length - 4);
        var folder1 = lastFour.substring(0, 2);
        var folder2 = lastFour.substring(2);

        return 'http://' + type + '.match.com/' + type + '/' + folder1 + '/' + folder2 + '/' + _uid.toString() + photoID + '.jpeg';
    };

    var self = {
        smallThumbnail: function() {
            if (self.isValid()) {
                return generateUrl("sthumbnails");
            }
            return '';
        },

        thumbnail: function() {
            if (self.isValid()) {
                return generateUrl("thumbnails");
            }
            return '';
        },

        fullSize: function() {
            if (self.isValid()) {
                return generateUrl("pictures");
            }
            return '';
        },

        isValid: function() {
            return (_uid > 0 && _id > 0 && _id <= MatchCore.PhotoConfig.Ids.length);
        }
    }

    return self;
};

MatchCore.UI = {
    busy : function() {
        $jq('BODY').addClass('ui_busy');
    },
    
    done : function() {
        $jq('BODY').removeClass('ui_busy');
    }
};

MatchCore.UI.PopupWindow = function() {
	var _container;
	var _dimensions = { height: 220, width: 400 };
	var _position = { left: 0, top: 0 };
	var _url = 'about:blank';
	var _win;

	var self = {
		init: function(opts) {
			if (opts != undefined && opts.container != undefined) {
				_container = opts.container;

				if (opts.meta != undefined) {
					if (opts.meta.url != undefined)
						_url = opts.meta.url;

					if (opts.meta.height != undefined)
						_dimensions.height = parseInt(opts.meta.height);

					if (opts.meta.width != undefined)
						_dimensions.width = parseInt(opts.meta.width);

					if (opts.meta.top != undefined)
						_position.top = parseInt(opts.meta.top);

					if (opts.meta.left != undefined)
						_position.left = parseInt(opts.meta.left);

					if (opts.meta.timeout != undefined) {
						setTimeout(
						function() {
							self.show();
						},
						opts.meta.timeout
					);
					}
				}
			}
		},

		show: function() {
			_win = window.open(_url, "popupWindow", 'toolbar=0,titlebar=0,scrollbars=0,resizable=0,menubar=0,Height=' + _dimensions.height.toString() + ',Width=' + _dimensions.width.toString() + ',top=' + _position.top + ',left=' + _position.left);

			if (_win) {
				if (_win.focus) { _win.focus() }
			}
		},

		dismiss: function() {
			_win.close();
		}
	};

	return self;
};

MatchCore.Page = function() {
    var _initComplete = new MatchCore.Delegate();
    var _initialized = false;

    var initBehaviors = function() {
        $jq('*[@behavior]').parseBehavior();
        initComplete();
    };

    var initComplete = function() {
		_initialized = true;
        _initComplete.fire();
    };

    var self = {
        init: function() {
            initBehaviors();
        },

        onInitComplete: function(handler) {
            _initComplete.add(handler);
            
            if (_initialized)
				_initComplete.fire();
        }
    };

    return self;
} ();

MatchCore.Types.Byte = function(raw) {
    var _raw = raw;

    var self = {
        isValid: function() {
            if (_raw) {
                if ((_raw - 0) == _raw) {
                    var converted = parseInt(_raw);
                    return converted >= 0 && converted <= 255;
                }
            }
            
            return false;
        },

        value: function() {
            if (self.isValid())
                return parseInt(_raw);
            else
                return null;
        },

        getValueOrDefault: function(defaultVal) {
            if (self.isValid())
                return self.value();
            else
                return defaultVal;
        }
    };

    return self;
   };

MatchCore.UI.Navigation = {
   	redirectNonLoggedIn: function() {
   		var registered = $jq.readCookie('IsRegistered');
   		if (registered) {
   			window.location.href = '/login/login.aspx';
   		}
   		else {
   			window.location.href = '/registration/registration.aspx';
   		}
   	}
};


MatchCore.HtmlString = function(str) {
    var _raw = str;

    var self = {
        html : function() {
            var processed = _raw.replace(/&lt;/g, '<').replace(/&gt;/g, '>');
            return processed;
        }
    };

    return self;
};

MatchCore.Mask = function(raw) {
	var _raw = raw;
	
	var self = {
		asString : function () {
			return (_raw == null) ? "" : _raw;
		},
		
		asHtml : function() {
			return (new MatchCore.HtmlString(self.asString())).html();
		},
		
		asBoolean : function() {
			if (typeof(_raw) == 'boolean') {
				return (_raw) ? 'true' : 'false';
			}
			return '';
		}
	};
	
	return self;
};

MatchCore.UniversalTemplate = function() {

	var construct = function(src) {
		var _templateSrc = src;
		var _pattern = /{@((.*?):(.*?)|(.*?))}/g;
		
		var databind = function (property, container, mask) {
			var pieces = property.split('.');
			var databound = null;
			
			if (pieces != null) {
				databound = container[pieces[0]];
				
				for (var i = 1; i < pieces.length; i++) {
					databound = databound[pieces[i]];
				}
			}
			else {
				databound = container[property];
			}
			
			if (arguments.length > 2 && mask != undefined && mask != null) {
				var masker = new MatchCore.Mask(databound);
				try {
					databound = masker[mask]();
				}
				catch (e) {}
			}
			
			return databound;
		};
		
		var self = {
			bindTo : function(container) {
				var processed = _templateSrc;
				
				processed = processed.replace(_pattern, function(_0, _1, _2, _3, _4) {
					
					if (_3 != undefined && _3 != "" && _3 != null)
						return databind(_2, container, _3);
					else 
						return databind(_4, container);
				});
				
				return processed;
			}
		};
		
		return self;
	};
	
	var factory = {
		processElement : function(elem, container) {
			var instance = construct($jq(elem).html());
			$jq(elem).html(instance.bindTo(container));
		},
		
		processTemplate : function(templateSrc, container) {
			var instance = construct(templateSrc);
			return instance.bindTo(container);
		}
	};
	
	return factory;
}();

//This function replaces the asp.net default button functionality.
$jq(document).ready(function() {
    var btn = $jq('.defaultButton');
    btn.parents('.defaultForm').keypress(function(e) {
        if (e.which == 13 && e.target.type != 'textarea') {
            if (btn[0].type == 'submit' || 'image' || 'button')
                btn[0].click();
            else
                eval(btn[0].href);
            return false;
        }
    });

    //look for custom behaviors
    MatchCore.Page.init();

    
});
