﻿if (typeof (Phizzpop) == 'undefined') Phizzpop = {};

Phizzpop.setEvent = function(element, name, delegate, detaching) {
    if (element && (element == window || element.nodeType) && typeof (delegate) == 'function') {
        if (element.attachEvent) return element[!detaching ? 'attachEvent' : 'detachEvent'](name, delegate);
        if (element.addEventListener) return element[!detaching ? 'addEventListener' : 'removeEventListener'](name.replace(/^on/, ''), delegate, false);

        element[name] = !detaching ? delegate : null;
    }
}

Phizzpop.getElementFromEventArgs = function(eventArgs) {
    if (!eventArgs) return null;

    var element = null;

    if (eventArgs.srcElement) element = eventArgs.srcElement;
    if (eventArgs.target) element = eventArgs.target;

    return element;
}

Phizzpop.onSilverlightError = function(sender, args) {
    var errorType = args && args.ErrorType ? args.ErrorType : '';
    if (errorType == 'ImageError' || errorType == 'MediaError') return;

    var appSource = sender != null && sender != 0 ? sender.getHost().Source : '';
    var newLine = '    \n';
    var errors = [];

    errors.push(String.format('Unhandled Error in Silverlight Application {0}\n', appSource));
    errors.push(String.format('Code: {0}{3}Category: {1}{3}Message: {2}{3}', args.ErrorCode, errorType, args.ErrorMessage, newLine));

    switch (errorType) {
        case 'ParserError':
            errors.push(String.format('File: {0}{3}Line: {1}{3}Position: {2}{3}', args.xamlFile, args.lineNumber, args.charPosition, newLine));

            break;
        case 'RuntimeError':
            if (args.lineNumber != 0) {
                errors.push(String.format('Line: {0}{2}Position: {1}{2}', args.lineNumber, args.charPosition, newLine));
            }

            errors.push(String.format('MethodName: {0}{1}', args.methodName, newLine));

            break;
    }

    var message = errors.join('');

    throw new Error(message);
}

Phizzpop.Element = new function() {
    var _elementId = '';

    function setEvents(disposing) {
        Phizzpop.setEvent(window, 'onload', load, disposing);
        Phizzpop.setEvent(window, 'onunload', dispose, disposing);
    }

    this.focus = focus;
    function focus(id) {
        _elementId = id;

        setEvents(false);
    }

    function load() {
        var element = document.getElementById(_elementId);

        if (element) element.focus();
    }
    
    function dispose() {
        setEvents(true);

        _elementId = null;
    }
}

Phizzpop.NewWindow = new function() {
    setEvents(false);

    var _ids = [];

    this.add = add;
    function add(id) {
        _ids.push(id);
    }

    function load() {
        for (var i = 0, id; id = _ids[i]; i++) {
            var anchor = document.getElementById(id);
            if (!anchor) continue;

            anchor.setAttribute('target', '_blank');
        }
    }

    function dispose() {
        setEvents(true);

        _ids.length = 0;
        _ids = null;
    }

    function setEvents(disposing) {
        Phizzpop.setEvent(window, 'onload', load, disposing);
        Phizzpop.setEvent(window, 'onunload', dispose, disposing);
    }
}